ViewParam против @ManagedProperty (value = "# {param.id}") - PullRequest
95 голосов
/ 03 февраля 2011

В чем разница между определением параметров просмотра следующим образом:

<f:metadata>
  <f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>

и определением свойства в ManagedBean следующим образом:

@ManagedProperty(value = "#{param.id}")
private Integer id;

Ответы [ 2 ]

142 голосов
/ 03 февраля 2011

<f:viewParam> * * 1004 Устанавливает значение только во время фазы обновления значений модели (поскольку оно распространяется 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, но для него требуется, чтобы бин был @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 в качестве свойства компонента. @ManagedProperty

  • Устанавливает значение сразу после построения бина.

  • Заданное значение доступно во время @PostConstruct, что позволяет легко инициализировать / предварительно загружать другие свойства на основе заданного значения.

  • Не допускает декларативного преобразования / проверки в представлении.

  • Управляемое свойство #{param} недопустимо для bean-компонентов с более широкой областью, чем область запроса, поэтому 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, играя с FacesContext#addMessage() или чем-то еще.


Вы можете использовать их оба, когда оба @PostConstruct и includeViewParams являются обязательными. Вы только больше не сможете применять детализированное преобразование / проверку.


Смотри также:

5 голосов
/ 06 декабря 2012

2 других отличия:

  • @ManagedProperty может использоваться только с bean-компонентами, управляемыми JSF, но не с bean-компонентами, управляемыми CDI (@Named);
    • <f:viewParam> работает только с параметрами запросов GET.
...