Ответ 1
<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:
-
Устанавливает значение сразу после построения bean.
-
Установленное значение доступно во время
@PostConstruct, что позволяет легко инициализировать/предустановить другие свойства на основе установленного значения. -
Не разрешает декларативное преобразование/валидацию в представлении.
-
Управляемое свойство
#{param}не разрешено на beans с более широкой областью действия, чем область запроса, поэтому bean требуется@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, путем fidingling с FacesContext#addMessage() или что-то в этом роде.
Вы можете использовать их оба, когда @PostConstruct и includeViewParams являются обязательными. Вы больше не сможете применять мелкомасштабное преобразование/проверку.