Для чого можна використовувати <f: метадані>, <f: viewParam> і <f: viewAction>?


149

Чи може хтось уточнити, як ми можемо використовувати цей фрагмент в цілому або на прикладі реального світу?

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

Відповіді:


288

Обробити параметри 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, представлену #{bean.id}значенням, або якщо valueатрибут відсутній, а потім встановіть його як запит attribtue від імені, 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" />

Виконання ділових дій за параметрами 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має також<f:viewParam> на той же параметр, в іншому випадку він не буде пропущений.


Використовуйте форми GET в JSF

<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 (це вже робиться "під кришками").


Дивитися також:


@BalusC Якою має бути область "bean", коли вона використовується у поєднанні з face-redirect = true? Чи буде працювати так, як очікувалося, якщо для області встановлено "@RequestScoped"?
Geek

@Geek: перенаправлення створює новий GET-запит. Обсяги джерела та цільової квасолі не мають значення. Однак ви повинні врахувати можливі наслідки нового запиту GET для запиту та переглянути масштабну частину. Дивіться також stackoverflow.com/questions/7031885 / ...
BalusC

@BalusC Що саме ви маєте на увазі під «Ви, однак, слід враховувати можливі наслідки нового запиту GET для запиту та переглядати масштабну квасолю».
Geek

@Geek: Вони будуть відшкодовані та відтворені, оскільки їхній обсяг потім закінчиться та розпочнеться.
BalusC

@BalusC. Вичерпна відповідь. "Коли вам потрібно використовувати функцію" @ "PostConstruct як для перегляду квасолі, яка не викликається в кожному запиті, перевірте, чи запит не є зворотним зворотом". Якщо на нього не викликається кожен запит, навіщо перевіряти, чи запит є поштовим зворотом чи ні?
Улук Бій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.