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
includeViewParamsde<h:link>oincludeViewParams=trueparámetro de solicitudincludeViewParams=trueen cualquier URL.Puede usarse en un bean
@RequestScoped, pero requiere que el bean sea@ViewScopedsi 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
@PostConstructque 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 deUICommand.
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:
-
@ManagedPropertysolo 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.
-