Comprender el scope de Flash en JSF2

Por lo que entiendo, los objetos colocados dentro del scope de Flash en un ciclo de vida de solicitud de rostros estarán disponibles para el próximo ciclo de vida de solicitud de caras y luego se borrarán.

Supongamos que tengo dos páginas:

page01.xhtml :

   

Página01Bean:

 @ManagedBean @RequestScoped public class Page01Bean { public void action(){ FacesContext.getCurrentInstance().getExternalContext().getFlash().put("fooKey", "fooValue"); } } 

page02.xhtml :

  

Entonces, cuando se hace clic en el botón de la page01.xhtml se page01.xhtml un ciclo de vida de solicitud de rostros (por ejemplo, ciclo de vida A) y se establece el valor en el flash debajo de la tecla llamada fooKey

Luego abro otra pestaña del navegador y page02.xhtml . Otro ciclo de vida de solicitud de rostros (por ejemplo, ciclo de vida B) comienza a mostrar esta página. Esperaba que el ciclo de vida B pudiera acceder al scope del flash de su ciclo de vida anterior (es decir, el ciclo de vida A) y mostrar fooValue en la page02.xhtml . Sin embargo, no muestra nada.

Por favor, corrígeme lo que no entiendo del scope del flash en este modelo. Muchas gracias

En resumen, las variables almacenadas en el scope del flash sobrevivirán a una redirección y luego serán descartadas. Esto es realmente útil cuando se implementa un patrón Post-Redirect-Get.

Si intenta navegar a otra página redirigiendo y acceder a los atributos en carga, estarán allí. Después de que se realiza la solicitud, los valores en el flash se descartarán. Por ejemplo:

Estás en page1.xhtml y tienes un commandLink que redirige a una nueva página con un método como este (Nota: usaré navegación implícita).

 public String navigateToPageB() { FacesContext.getCurrentInstance().getExternalContext().getFlash().put("param1", "Hello World!"); return "pageB?faces-redirect=true"; } 

Cuando se representa pageB.xhtml, puede acceder a esos valores mediante expresiones EL tales como

  

que mostrará el “¡Hola mundo!” cadena que guardamos anteriormente en navigateToPageB.

En cuanto a su pregunta, al abrir una nueva pestaña en su explorador no está accediendo al mismo contexto al que estaba accediendo en su pestaña anterior, por lo que su variable no estará disponible allí.

La respuesta anterior es correcta, pero para completar, me gustaría decir que ha habido muchos problemas en las implementaciones de Mojarra con todo esto, pero finalmente lograron hacerlo funcionar correctamente en las versiones 2.1.27 y 2.2.5 de Mojarra.

Como dice @Gamb, el objective del scope del flash es mantener vivo un parámetro mapeándolo internamente a través de la redirección. También podemos mantener el parámetro activo por más tiempo si lo necesitamos. Además de la forma mencionada, FacesContext#getCurrentInstance#getExternalContext#getFlash#put , también existe la posibilidad de establecer el parámetro mediante expresión EL, usando . Implementé una prueba básica después de SSCCE que muestra una gama más amplia de opciones, usando dos vistas:

Bean1

 @ManagedBean @ViewScoped public class Bean1 implements Serializable { /** * Just takes the given param, sets it into flash context and redirects to * page2 * * @param inputValue * @return */ public String goPage2(String inputValue) { FacesContext.getCurrentInstance().getExternalContext().getFlash() .put("param", inputValue); return "page2?faces-redirect=true"; } } 

page1.xhtml

            

Param1: #{flash['param']}

Param2: #{flash['param2']}

Bean2

 @ManagedBean @ViewScoped public class Bean2 implements Serializable { public String getParam() { /** * Takes the parameter from the flash context */ return (String) FacesContext.getCurrentInstance().getExternalContext() .getFlash().get("param"); } } 

page2.xhtml

      

Param1: #{bean2.param}

Param1: #{flash.param}

Param1: #{flash['param']}

Param2: #{flash['param2']}

#{flash.keep.param}

Ver también:

  • Documentación flash JSF
  • Mantener los parámetros de flash cuando el usuario recarga manualmente la vista
    Intereting Posts