Відповіді:
<f:viewParam>:Встановлює значення лише під час фази оновлення моделі значень (оскільки вона поширюється UIInput).
Встановлене значення недоступне під час @PostConstruct, тому вам потрібно додатково <f:event type="preRenderView" listener="#{bean.init}" />всередині <f:metadata>робити ініціалізацію / попередню завантаження на основі встановлених значень. Оскільки JSF 2.2 ви можете використовувати <f:viewAction>для цього.
Дозволяє вкладатись <f:converter>і <f:validator>для більш тонкої конверсії / перевірки. Навіть <h:message>може бути прикріплений.
Може бути включена як рядок GET запиту, використовуючи includeViewParamsатрибут <h:link>або includeViewParams=trueпараметр запиту в будь-якій URL-адресі.
Може використовуватися в @RequestScopedbean, але він вимагає, щоб bean був, @ViewScopedякщо ви хочете, щоб параметри подання пережили будь-які збої перевірки, викликані формами, що вкладені у вигляд, інакше вам потрібно вручну зберегти всі параметри запиту для наступних запитів <f:param>у команді компоненти.
Приклад :
<f:metadata>
<f:viewParam id="user_id" name="id" value="#{bean.user}"
required="true" requiredMessage="Invalid page access. Please use a link from within the system."
converter="userConverter" converterMessage="Unknown user ID."
/>
</f:metadata>
<h:message for="user_id" />
з
private User user;
і @FacesConverter("userConverter"). Сторінка виклику http://example.com/context/user.xhtml?id=123 передасть idпараметр через перетворювач і встановить Userоб'єкт як властивість bean.
@ManagedProperty:Встановлює значення відразу після побудови квасолі.
Встановлене значення доступне, протягом @PostConstructякого дозволяє легко ініціалізувати / попередньо завантажувати інші властивості на основі встановленого значення.
Не дозволяє переглядати декларативну конверсію / перевірку.
#{param}На бобах ширшої сфери застосування, ніж область запиту, керована власність не дозволена, тому квасоля повинна бути такою @RequestScoped.
Якщо ви покладаєтесь на керовану властивість #{param}бути присутнім у наступних POST-запитах, тоді вам потрібно включити його як <f:param>у UICommandкомпоненти.
Приклад :
@ManagedProperty("#{param.id}")
private Long id;
private User user;
@EJB
private UserService userService;
@PostConstruct
public void init() {
user = userService.find(id);
}
Але вам належить керувати валідацією самостійно, коли userце відбувається nullз допомогою FacesContext#addMessage()чи чогось іншого.
Ви можете використовувати їх як в обох випадках, так @PostConstructі includeViewParamsв обов’язковому порядку. Ви більше не зможете застосовувати дрібнозернисту конверсію / перевірку.
@ManagedPropertyпараметр запиту неможливим.
<f:event type="preRenderView">або в майбутньому JSF 2.2 <f:viewAction>.
2 інші відмінності:
@ManagedPropertyвикористовується лише з квасолею, керованою JSF, а не з квасолею, керованою CDI ( @Named);
<f:viewParam> працює лише з параметрами GET-запитів.