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