Como alternativa a agarrar los parámetros directamente de la solicitud en el bean, puede utilizar view parameters
.
Estos tienen que ser declarado en la Facelet en el que utiliza el bean gestionado de la siguiente manera:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:body>
<f:metadata>
<f:viewParam id="id" name="id" value="#{myBean.id}" />
</f:metadata>
<!-- Rest of Facelet here -->
</h:body>
</html>
Si ahora solicita esta página, el armador del bean de respaldo será llamada con el valor de petición previsto el parámetro id. Esto funciona para las solicitudes GET
y (sin caras) POST
.
La ventaja es que aquí puede usar los convertidores y validadores JSF estándar. Por supuesto, si su bean administrado no está vinculado a una vista particular, esta solución es menos ideal.
Una pequeña cosa peculiar a tener en cuenta es que al hacer una devolución de caras normales después de la solicitud inicial que proporcionó el parámetro de vista, se llamará de nuevo al colocador en su bean, incluso si el bean está en alcance de vista y no nuevo valor se proporciona explícitamente.
Para probar que esto funciona, he utilizado el siguiente bean administrado:
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
@ManagedBean
@ViewScoped
public class MyBean {
Long id;
@PostConstruct
public void test() {
System.out.println("post construct called");
}
public void actionMethod(ActionEvent event) {
System.out.println("action called");
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
Y la siguiente Facelet:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:body>
<f:metadata>
<f:viewParam id="id" name="id" value="#{myBean.id}" />
</f:metadata>
<h:outputText value="#{myBean.id}"/>
<h:form>
<h:commandButton value="test" actionListener="#{myBean.actionMethod}"/>
</h:form>
<form method="post">
<input name="id" value="4" />
<input type="submit" value="submit" />
</form>
</h:body>
</html>
Introduzca un número en el campo de entrada y haga clic en el botón de envío . Si el número se imprime nuevamente en la pantalla, la prueba ha tenido éxito. Tenga en cuenta que el segundo formulario es un formulario regular y no publica ningún estado JSF. Probé esto en JBoss AS 6 y funciona. También funciona el probar el parámetro id como un parámetro GET.
Gracias, ¿es la primera solución (inyectar el viewScoped bean en requestScoped) una práctica buena y popular? – ehsun7b
GlassFish sirve mi aplicación y puedo usar beans CDI también, pero decidí hacer un proyecto con los beans JSF porque soy muy nuevo en JSF, ¿es una buena idea? – ehsun7b
Depende del propósito del 'id'. ¿Desea "actualizarlo" en cada solicitud? Ir por el camino 1. ¿O quieres usar el valor inicial durante todo el alcance de la vista? Ir por el camino 2. – BalusC