Кто-нибудь может прояснить, как мы можем использовать этот фрагмент в целом или, в качестве примера, в реальном мире?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
Кто-нибудь может прояснить, как мы можем использовать этот фрагмент в целом или, в качестве примера, в реальном мире?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
Ответы:
<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
устанавливается в компоненте таким образом, прямо перед отображением представления.
Что касается валидации, то в следующем примере устанавливается параметр 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" />
Вы можете использовать <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
имеет также<f:viewParam>
на то же параметр, в противном случае он не будет пропущен.
<f:viewParam>
Также может быть использован в сочетании с «простой HTML» GET формы.
<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
бобом:
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 (она делает это уже «под прикрытием»).