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>
oincludeViewParams=true
parámetro de solicitudincludeViewParams=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 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:
-
@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.
-