Чи може хтось уточнити, як ми можемо використовувати цей фрагмент в цілому або на прикладі реального світу?
<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
атрибут відсутній, а потім встановіть його як запит 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" />
Ви можете використовувати <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 (це вже робиться "під кришками").