Параметры процесса GET
<f:viewParam>
управляет настройкой, преобразованием и проверкой параметров GET. Это как <h:inputText>
, но для параметров GET.
Следующий пример
<f:metadata>
<f:viewParam name="id" value="#{bean.id}" />
</f:metadata>
делает в основном следующее:
- Получить значение параметра запроса по имени
id
.
- Преобразуйте и при необходимости подтвердите его (вы можете использовать атрибуты
required
, validator
и converter
и вложить в него <f:converter>
и <f:validator>
, как, например, с <h:inputText>
)
- Если преобразование и проверка завершаются успешно, задайте его как свойство компонента, представленное значением
#{bean.id}
, или если атрибут value
отсутствует, а затем установите его как атрибут запроса для имени id
, чтобы он был доступен для #{id}
на виду.
Таким образом, когда вы открываете страницу как foo.xhtml?id=10
, значение параметра 10
устанавливается в bean-компоненте таким образом, прямо перед отображением представления.
Что касается проверки, то в следующем примере для параметра устанавливается значение required="true"
и допускаются только значения от 10 до 20. Любой сбой проверки приведет к отображению сообщения.
<f:metadata>
<f:viewParam id="id" name="id" value="#{bean.id}" required="true">
<f:validateLongRange minimum="10" maximum="20" />
</f:viewParam>
</f:metadata>
<h:message for="id" />
Выполнение бизнес-действия по параметрам GET
Для этого вы можете использовать <f:viewAction>
.
<f:metadata>
<f:viewParam id="id" name="id" value="#{bean.id}" required="true">
<f:validateLongRange minimum="10" maximum="20" />
</f:viewParam>
<f:viewAction action="#{bean.onload}" />
</f:metadata>
<h:message for="id" />
* * С тысячей сорок-девять
public void onload() {
// ...
}
Однако <f:viewAction>
является новым с JSF 2.2 (<f:viewParam>
уже существует с JSF 2.0). Если вы не можете выполнить обновление, тогда лучше всего использовать <f:event>
.
<f:event type="preRenderView" listener="#{bean.onload}" />
Однако он вызывается на каждый запрос. Вам необходимо явно проверить, не является ли запрос обратной передачей:
public void onload() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// ...
}
}
Если вы хотите также пропустить случаи «Преобразование / Проверка не пройдена», выполните следующие действия:
public void onload() {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
// ...
}
}
Использование <f:event>
таким способом по сути является обходным путем / хаком, именно поэтому <f:viewAction>
был представлен в JSF 2.2.
Передать параметры просмотра в следующий вид
Вы можете "пройти" параметры просмотра в ссылках навигации, установив атрибут includeViewParams
в true
или добавив includeViewParams=true
параметр запроса.
<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">
, который генерирует с приведенным выше примером <f:metadata>
в основном по следующей ссылке
<a href="next.xhtml?id=10">
с исходным значением параметра.
Только для этого подхода требует , что next.xhtml
имеет также a <f:viewParam>
по тому же параметру, в противном случае он не будет пропущен.
Использовать формы GET в JSF
<f:viewParam>
также можно использовать в сочетании с GET-формами "обычного HTML".
<f:metadata>
<f:viewParam id="query" name="query" value="#{bean.query}" />
<f:viewAction action="#{bean.search}" />
</f:metadata>
...
<form>
<label for="query">Query</label>
<input type="text" name="query" value="#{empty bean.query ? param.query : bean.query}" />
<input type="submit" value="Search" />
<h:message for="query" />
</form>
...
<h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}">
...
</h:dataTable>
В основном это @RequestScoped
bean:
private String query;
private List<Result> results;
public void search() {
results = service.search(query);
}
Обратите внимание, что <h:message>
предназначен для <f:viewParam>
, а не для простого HTML <input type="text">
! Также обратите внимание, что входное значение отображает #{param.query}
, когда #{bean.query}
пусто, потому что в противном случае отправленное значение вообще не будет отображаться при ошибке проверки или преобразования. Обратите внимание, что эта конструкция недопустима для компонентов ввода JSF (она делает это уже «под прикрытием»).
Смотри также: