Відповіді:
<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-адресі.
Може використовуватися в @RequestScoped
bean, але він вимагає, щоб 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-запитів.