jsf jsf-2 managed-bean viewparams managed-property

jsf - ViewParam vs @ManagedProperty(value="#{param.id}")



jsf-2 managed-bean (2)

<f:viewParam> :

  • Establece el valor solo durante la fase de valores del modelo de actualización (ya que amplía UIInput ).

  • El valor establecido no está disponible durante @PostConstruct , por lo que necesita un <f:event type="preRenderView" listener="#{bean.init}" /> dentro de <f:metadata> para hacer la inicialización / precarga en función de los valores establecidos Desde JSF 2.2, podrías usar <f:viewAction> para eso.

  • Permite anidados <f:converter> y <f:validator> para una conversión / validación más detallada. Incluso un <h:message> puede ser adjuntado.

  • Se puede incluir como cadena de consulta GET utilizando el atributo includeViewParams de <h:link> o includeViewParams=true parámetro de solicitud includeViewParams=true en cualquier URL.

  • Puede usarse en un bean @RequestScoped , pero requiere que el bean sea @ViewScoped si desea que los parámetros de vista sobrevivan a cualquier falla de validación causada por los formularios incluidos en la vista; de lo contrario, debe conservar manualmente todos los parámetros de solicitud para las solicitudes posteriores por <f:param> en los componentes del comando.

Ejemplo :

<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" />

con

private User user;

y un @FacesConverter("userConverter") . La página de invocación de http://example.com/context/user.xhtml?id=123 pasará el parámetro id través del convertidor y configurará el objeto User como una propiedad de bean.

@ManagedProperty :

  • Establece el valor inmediatamente después de la construcción de Bean.

  • El valor establecido está disponible durante @PostConstruct que permite una inicialización / precarga fácil de otras propiedades en función del valor establecido.

  • No permite la conversión / validación declarativa a la vista.

  • La propiedad administrada de #{param} no está permitida en los beans con un alcance más amplio que el alcance de la solicitud, por lo que se requiere que el bean sea @RequestScoped .

  • Si confía en que una propiedad administrada de #{param} está presente en las siguientes solicitudes POST, entonces debe incluirla como <f:param> en los componentes de UICommand .

Ejemplo :

@ManagedProperty("#{param.id}") private Long id; private User user; @EJB private UserService userService; @PostConstruct public void init() { user = userService.find(id); }

Pero usted tiene que administrar la validación usted mismo cada vez que el user sea null al FacesContext#addMessage() con FacesContext#addMessage() o algo así.

Puede usarlos tanto cuando @PostConstruct como includeViewParams son obligatorios. Ya no podrá aplicar la conversión / validación detallada.

Ver también:

¿Cuál es la diferencia entre definir parámetros de vista como este?

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

Y definiendo la propiedad en ManagedBean de esta manera:

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


2 otras diferencias:

  • @ManagedProperty solo se puede usar con beans administrados por JSF, no con beans gestionados por CDI ( @Named );
    • <f:viewParam> funciona solo con parámetros de solicitudes GET.