From what I understand , objects placed inside the Flash scope in a faces request lifecycle will be available for the next faces request lifecycle and then clear.
Suppose I have two pages:
page01.xhtml:
<h:form>
<h:commandButton action="#{page01Bean.action}" />
</h:form>
Page01Bean :
@ManagedBean
@RequestScoped
public class Page01Bean {
public void action(){
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("fooKey", "fooValue");
}
}
page02.xhtml:
<h:outputText value="#{flash.fooKey}"/>
So when the button in page01.xhtml
is clicked , a faces request life-cycle (say life-cycle A) starts and set the value to the flash under the key called fooKey
Then I open another browser tab and browse page02.xhtml
. Another faces request lifecycle (say lifecycle B) starts to render this page . I expected that lifecycle B can access its previous lifecycle 's flash scope (i.e life-cycle A) and display fooValue
in page02.xhtml
. However , it displays nothing.
Please correct me what I misunderstand about the flash scope in this exmaple. Thanks so much
In short, variables stored in the flash scope will survive a redirection and they will be discarded afterwards. This is really useful when implementing a Post-Redirect-Get pattern.
If you try to navigate to another page by redirect and access the attributes on load, they will be there. After that request is done the values in the flash will be discarded. For example:
You're in page1.xhtml and you have a commandLink that redirects to a new page with a method like this one (Note: I'll use implicit navigation).
When pageB.xhtml is rendered, you can access those values by EL expressions such as
which will display the "Hello World!" string we saved earlier in navigateToPageB.
As for your question, by opening a new tab in your explorer you're not accessing the same context you were accessing on your previous tab, so your variable will not be available there.
Previous answer is correct, but just for completeness I would like to say there have been a lot of issues in Mojarra implementations with all this stuff, but finally they achieved to make it work properly in Mojarra 2.1.27 and 2.2.5 versions.
As @Gamb says, the aim of the flash scope is to keep a parameter alive mapping it internally across redirection. We can also keep the parameter alive for longer if we need it. Apart from the mentioned way ,
FacesContext#getCurrentInstance#getExternalContext#getFlash#put
, there's also the chance to set the parameter via EL expression, using<c:set />
. I've implemented a basic test following SSCCE which shows a broader range of options, using two views:Bean1
page1.xhtml
Bean2
page2.xhtml
See also: