Что можешь,а такжебыть использованы для? - PullRequest
142 голосов
/ 16 июня 2011

Может ли кто-нибудь уточнить, как мы можем использовать этот фрагмент в целом или, в качестве примера, в реальном мире?

<f:metadata>
    <f:viewParam id="id" value="#{bean.id}" />
    <f:viewAction action="#{bean.init}" />
</f:metadata>

1 Ответ

280 голосов
/ 17 июня 2011

Параметры процесса 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 (она делает это уже «под прикрытием»).


Смотри также:

...