jsf jsf-2 viewparams viewaction

jsf - ¿Para qué pueden usarse<f: metadata>,<f: viewParam> y<f: viewAction>?



jsf-2 viewparams (1)

Parámetros de GET de proceso

El <f:viewParam> gestiona la configuración, la conversión y la validación de los parámetros GET. Es como <h:inputText> , pero luego para los parámetros GET.

El siguiente ejemplo

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

hace básicamente lo siguiente:

  • Obtenga el valor del parámetro de solicitud por nombre id .
  • Convierta y valide si es necesario (puede usar atributos required , validator y converter y anidar un <f:converter> y <f:validator> en él como con <h:inputText> )
  • Si la conversión y la validación son #{bean.id} , #{bean.id} como una propiedad de bean representada por #{bean.id} valor #{bean.id} , o si el atributo de value está ausente, configúrelo como solicitud attribtue en el id nombre para que esté disponible por #{id} en la vista.

Entonces, cuando abre la página como foo.xhtml?id=10 , el valor del parámetro 10 se establece en el bean de esta manera, justo antes de que se visualice la vista.

En cuanto a la validación, el siguiente ejemplo establece el parámetro para required="true" y solo permite valores entre 10 y 20. Cualquier falla de validación dará como resultado la visualización de un mensaje.

<f:metadata> <f:viewParam id="id" name="id" value="#{bean.id}" required="true"> <f:validateLongRange minimum="10" maximum="20" /> </f:viewParam> </f:metadata> <h:message for="id" />

Realizar una acción comercial en los parámetros GET

Puede usar <f:viewAction> para esto.

<f:metadata> <f:viewParam id="id" name="id" value="#{bean.id}" required="true"> <f:validateLongRange minimum="10" maximum="20" /> </f:viewParam> <f:viewAction action="#{bean.onload}" /> </f:metadata> <h:message for="id" />

con

public void onload() { // ... }

El <f:viewAction> es sin embargo nuevo desde JSF 2.2 (el <f:viewParam> ya existe desde JSF 2.0). Si no puede actualizar, entonces su mejor opción es usar <f:event> lugar.

<f:event type="preRenderView" listener="#{bean.onload}" />

Sin embargo, esto se invoca en cada solicitud. Debe verificar explícitamente si la solicitud no es una devolución de datos:

public void onload() { if (!FacesContext.getCurrentInstance().isPostback()) { // ... } }

Cuando también desee omitir los casos de "Conversión / Validación fallida", haga lo siguiente:

public void onload() { FacesContext facesContext = FacesContext.getCurrentInstance(); if (!facesContext.isPostback() && !facesContext.isValidationFailed()) { // ... } }

Usar <f:event> esta manera es, en esencia, una solución / pirateo, es exactamente por eso que se introdujo <f:viewAction> en JSF 2.2.

Pase los parámetros de vista a la vista siguiente

Puede "pasar" los parámetros de vista en los enlaces de navegación configurando el atributo includeViewParams en true o agregando includeViewParams=true parámetro de solicitud.

<h:link outcome="next" includeViewParams="true"> <!-- Or --> <h:link outcome="next?includeViewParams=true">

que genera con el anterior <f:metadata> ejemplo básicamente el siguiente enlace

<a href="next.xhtml?id=10">

con el valor del parámetro original.

Este enfoque solo requiere que next.xhtml tenga también un <f:viewParam> en el mismo parámetro, de lo contrario no se pasará.

Utilice los formularios GET en JSF

El <f:viewParam> también se puede usar en combinación con formularios GET "plain HTML".

<f:metadata> <f:viewParam id="query" name="query" value="#{bean.query}" /> <f:viewAction action="#{bean.search}" /> </f:metadata> ... <form> <label for="query">Query</label> <input type="text" name="query" value="#{empty bean.query ? param.query : bean.query}" /> <input type="submit" value="Search" /> <h:message for="query" /> </form> ... <h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}"> ... </h:dataTable>

Con básicamente este @RequestScoped bean:

private String query; private List<Result> results; public void search() { results = service.search(query); }

Tenga en cuenta que <h:message> es para <f:viewParam> , no el HTML simple <input type="text"> ! También tenga en cuenta que el valor de entrada muestra #{param.query} cuando #{bean.query} está vacío, porque de lo contrario el valor enviado no se mostraría en absoluto cuando hubiera un error de validación o conversión. Tenga en cuenta que este constructo no es válido para los componentes de entrada JSF (ya lo está haciendo "debajo de las cubiertas").

Ver también:

¿Alguien puede aclarar cómo podemos usar en general, o en un ejemplo del mundo real, este fragmento?

<f:metadata> <f:viewParam id="id" value="#{bean.id}" /> <f:viewAction action="#{bean.init}" /> </f:metadata>