jsf-2 flash-scope

jsf 2 - ¿Cómo mantener los parámetros del alcance del flash JSF en la recarga de la página?



jsf-2 flash-scope (1)

Uso el alcance del flash para pasar un objeto de configuración entre controladores de @viewscoped. Pero si hago una recarga de página en uno de ellos, entonces el mapa flash está vacío y el objeto de configuración no se inicializa. ¿Es posible mantener el alcance del flash en la recarga de la página?

Mi código fuente para almacenar / recuperar configuraciones:

FistPage.xhtml

... <p:commandButton value="next" action="#{firstPageController.transferConfig}" process="@this" /> ...

FirstPageController.java

@ManagedBean(name = "firstPageController") @ViewScoped public class FirstPageController { ... public String transferConfig() { FacesContext.getCurrentInstance().getExternalContext().getFlash().put("searchConfig", searchConfig); return "/secondPage.xhtml?faces-redirect=true"; } ... }

SecondPage.xhtml

... <h:outputLabel value="value"> <f:event type="preRenderComponent" listener="#{secondPageController.onPageLoad()}"/> </h:outputLabel> ...

SecondPageController.java

@ManagedBean(name = "secondPageController") @ViewScoped public class SecondPageController { ... public void onPageLoad() { flash = FacesContext.getCurrentInstance().getExternalContext().getFlash(); searchConfig = ((SearchFilterConfig) flash.get("searchConfig")); flash.putNow("searchConfig", searchConfig); flash.keep("searchConfig"); } ... }

Yo uso Mojarra 2.1.29

Gracias


Acabo de hacer algunas pruebas en mi proyecto de patio de recreo y me di cuenta de que en realidad es posible mantener el estado de los parámetros del flash incluso si OBTIENE la página nuevamente, usando {flash.keep} . Así es como los documentos JSF lo explican:

La implementación debe garantizar el correcto comportamiento del flash, incluso en el caso de un <navigation-case> que contiene un <redirect /> . La implementación debe garantizar el correcto comportamiento del flash, incluso en el caso de solicitudes GET adyacentes en la misma sesión. Esto permite a las aplicaciones Faces utilizar completamente el patrón de diseño Publicar / Redirigir / Obtener .

Aquí tienes un buen caso de prueba básico:

page1.xhtml

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:c="http://java.sun.com/jsp/jstl/core"> <h:head /> <h:body> <h:form> <h:button id="nextButton" value="Next (button)" outcome="page2.xhtml" /> <c:set target="#{flash}" property="foo" value="bar" /> </h:form> </h:body> </html>

page2.xhtml

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"> <head /> <body>foo = #{flash.keep.foo} </body> </html>

Simplemente abre la primera página y haz clic en el botón que te redirigirá al segundo. A continuación, actualice la segunda página tantas veces como desee y encontrará el parámetro persistente.

Probado en Mojarra 2.2.6