Pregunta sobre JSF2

Un saludo para todos desde colombia!

Resulta que tengo dos beans ViewScope y debo pasar unos objetos de bean a bean, esto lo realizo con el sessionMap el cual me funciona muy bien, pero hoy mi equipo de trabajo me dijo que buscara otra manera de hacerlo. Existe otra manera? con un requestMap. Se que funciona muy bien hacer que los bean sean de session, pero no es el objetivo tampoco...

Agradezco la ayuda o las indicaciones que me puedan dar

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

SystemEvent

Hola, Alejandro.

Puedes utilizar SystemEvent para recuperar el valor antes de la fase de rendering de la segunda vista. Algo así:

Bean 1

@ManagedBean
@ViewScoped
public class BeanView1 {
    private int a;
    private int b;

    //getters and setters
   
    public String doSum(){
        //Se coloca el valor en el request.
        FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("result", a+b);
        return "view2";
    }
   
}

Luego en la segunda vista hay que declarar un listener:

    <h:body>
        <f:metadata>
            <!-- Es un event listener a invocar en el evento PreRenderView -->
            <f:event type="preRenderView" listener="#{beanView2.retrieveValue()}"/>
        </f:metadata>
        Result: #{beanView2.result}
    </h:body>

Nota que el atributo listener invocará a un método del segundo bean.

Y he aquí, el segundo bean:

@ManagedBean
@ViewScoped
public class BeanView2 {
    private int result;

    //getters and setters
   
    /* Este es el listener definido en la segunda vista. */
    public void retrieveValue(){
        result=(Integer)FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("result");
    }
   
}

Espero que te sirva está solución para tu caso. Lo malo es que no me parece una solución muy limpia y creo que te convendría utilizar el conversation scope de CDI (http://docs.jboss.org/weld/reference/1.0.0/en-US/html/scopescontexts.htm...) aunque es un poco más compleja de entender al principio.

Imagen de alejandro jaramillo rendon

Gracias!!

Gracias por tu comentario.

Realice la prueba y oooo sorpresa el objeto llega null, a la siguiente vista.

Realice una pequeña prueba en netbeans y esto funciona correcto, vi que netbeans utiliza las lib 2.1.3 de mojarra, pues que hice tomar esas librerias y compiarlas a mi proyecto, vi que el jboss desplega con estas lib 2.1.3 realice la prueba y oooo sorpresa el objeto sigue null. Esto me dejo muy desconcertado, pues no entiendo porque eso mismo funciona en netbeans y no en mi proyecto el cual esta en eclipse y bajo jboss 5.0.

Se que no tiene nada que ver el IDE aquí, pero realmente no entiendo que pasa..

Alguna sugerencia.

Saludos!

Imagen de alejandro jaramillo rendon

Otra duda!

En que casos se usa el el tag redirect del faces-config, que me garantiza el uso de este tag.
Lo pregunto porque si quito este tag de la regla de navegacion, si me funciona la persistencia de los datos en la otra vista

JSF y redirect

Hola, Alejandro.

Es justo lo que iba a preguntarte. Si haces algún redirect. Si no hay redirect, entonces el cambio de la vista1 a la vista2 se realiza dentro de la misma solicitud y el objeto request es el mismo. Por esta razón el valor que colocas en Bean1 aún está disponible para el Bean2. Pero cuando haces redirect, el request para la vista2 es una nueva instancia y los datos que quieras acceder desde el Bean2 ya no estarán.

Yo utilizo el redirect para aquellos casos en lo que quiero prevenir que la acción se repita cuando el usuario le da actualizar a la página (esto sucede comunmente en altas de registros).

Imagen de Shadonwk

mmm yo lo hago de otra forma,

mmm yo lo hago de otra forma, pero dejenme ver si funciona en jsf 2 porque apenas estoy empezando a trabajar con esta versión anteriormente trabajo con jsf 1.2