Understand Flash Scope in JSF2

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).

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

When pageB.xhtml is rendered, you can access those values by EL expressions such as

<h:outputLabel value="#{flash['param1']}" />

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.

Leave a Comment