ViewParam frente a @ManagedProperty (valor = "#{param.id}")

Resuelto ehsun7b asked hace 13 años • 2 respuestas

¿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;
ehsun7b avatar Feb 03 '11 23:02 ehsun7b
Aceptado

<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 includeViewParamsel atributo <h:link>o includeViewParams=trueel parámetro de solicitud en cualquier URL.

  • Se puede usar en un @RequestScopedbean, pero requiere que el bean lo sea @ViewScopedsi 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>los UICommandcomponentes. , 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 idparámetro a través del convertidor y se establecerá el Userobjeto como una propiedad de bean.


@ManagedProperty:

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

  • El valor establecido está disponible durante @PostConstructlo 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 usersea nullmanipulando FacesContext#addMessage()el interior del @PostConstructmé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 @PostConstructse 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 @PostConstructy includeViewParamssean 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
BalusC avatar Feb 03 '2011 17:02 BalusC

Otras 2 diferencias:

  • @ManagedPropertysó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.
user1643352 avatar Dec 06 '2012 15:12 user1643352