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
yconverter
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 devalue
está ausente, configúrelo como solicitud attribtue en elid
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>