ViewParam frente a @ManagedProperty (valor = "#{param.id}")
¿Cuál es la diferencia entre definir parámetros de vista de esta manera?
<f:metadata>
<f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
Y definiendo la propiedad en ManagedBean así:
@Inject @ManagedProperty(value = "#{param.id}")
private Integer id;
<f:viewParam>
:
Establece el valor solo durante la fase de actualización de valores del modelo (ya que se extiende
UIInput
).El valor establecido no está disponible durante
@PostConstruct
, por lo que necesita un adicional<f:event type="preRenderView" listener="#{bean.init}" />
dentro para<f:metadata>
realizar la inicialización/precarga en función de los valores establecidos. Desde JSF 2.2, podrías usarlo<f:viewAction>
para eso.Permite una conversión/validación anidada
<f:converter>
y<f:validator>
más detallada. Incluso se<h:message>
puede adjuntar un.Se puede incluir automáticamente como cadena de consulta GET en las URL de destino de resultados utilizando
includeViewParams
el atributo<h:link>
oincludeViewParams=true
el parámetro de solicitud en cualquier URL.Se puede usar en un
@RequestScoped
bean, pero requiere que el bean lo sea@ViewScoped
si desea que los parámetros de la vista sobrevivan a cualquier falla de validación causada por los formularios incluidos en la vista; de lo contrario, deberá conservar manualmente todos los parámetros de solicitud para las solicitudes posteriores en<f:param>
losUICommand
componentes. , porque se<f:viewParam>
establecerá en cada solicitud.
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")
. Al invocar la página mediante http://example.com/context/user.xhtml?id=123 se pasará el id
parámetro a través del convertidor y se establecerá el User
objeto como una propiedad de bean.
@ManagedProperty
:
Establece el valor inmediatamente después de la construcción del bean.
El valor establecido está disponible durante
@PostConstruct
lo que permite una fácil inicialización/precarga de otras propiedades en función del valor establecido.No permite la conversión/validación declarativa a la vista.
No admite la inclusión automática en las URL de destino de resultados .
Se puede usar en un bean de cualquier alcance, pero se configurará solo durante la construcción del bean en lugar de en cada solicitud.
Ejemplo :
@Inject @ManagedProperty("#{param.id}")
private Long id;
private User user;
@EJB
private UserService userService;
@PostConstruct
public void init() {
user = userService.find(id);
}
Tenga en cuenta que debe gestionar la conversión y la validación usted mismo siempre que user
sea null
manipulando FacesContext#addMessage()
el interior del @PostConstruct
método. También tenga en cuenta que cuando #{param.id}
no es un número válido, se generará una excepción antes de que @PostConstruct
se alcance. Si quieres solucionarlo, probablemente será mejor que lo conviertas en un archivo private String id
. Pero mucho mejor es utilizar <f:viewParam>
.
Puede utilizar ambos cuando ambos @PostConstruct
y includeViewParams
sean obligatorios. Simplemente ya no podrá aplicar conversión/validación detallada.
Ver también:
- ¿Para qué se pueden utilizar <f:metadata>, <f:viewParam> y <f:viewAction>?
- Comunicación en JSF 2.0: procesamiento de parámetros de solicitud GET
Otras 2 diferencias:
@ManagedProperty
sólo se puede utilizar con beans gestionados por JSF, no con beans gestionados por CDI (@Named
);<f:viewParam>
solo funciona con parámetros de solicitudes GET.