jsf
Der Flash-Bereich in JSF 2
Suche…
Bemerkungen
Das Flash-Konzept stammt von Ruby on Rails und bietet eine Möglichkeit, temporäre Objekte zwischen den durch den Lebenszyklus von Gesichtern generierten Benutzeransichten zu übergeben. Wie in Rails wird alles, was sich im Flash befindet, der nächsten Ansicht der gleichen Benutzersitzung ausgesetzt und dann gelöscht. Es ist wichtig zu beachten, dass „nächste Ansicht“ möglicherweise dieselbe Ansichts-ID hat wie die vorherige Ansicht.
Die JSF-Implementierung muss sicherstellen, dass das korrekte Verhalten des Flashs auch bei einem <navigation-case> , der ein <redirect /> enthält, beibehalten wird. Die Implementierung muss sicherstellen, dass das richtige Verhalten des Flash-Speichers auch bei benachbarten GET-Anforderungen in derselben Sitzung erhalten bleibt. Dies ermöglicht es Faces-Anwendungen, das Designmuster „Post / Redirect / Get“ vollständig zu nutzen.
Demonstration der Verwendung von Flash Scope
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
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head />
<h:body>
<!-- Sets the first flash param at the action method -->
<h:form>
<h:inputText value="#{inputValue}" />
<h:commandButton action="#{bean1.goPage2(inputValue)}"
value="Go Page 2" />
</h:form>
<!-- Sets the second flash param -->
<c:set target="#{flash}" property="param2" value="Myparam2" />
<!-- Tries to retrieve both of the params.
Note none of them is displayed at the first page hit.
If page refreshed, the second param which has been already set, will be displayed -->
<p>Param1: #{flash['param']}</p>
<p>Param2: #{flash['param2']}</p>
</h:body>
</html>
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
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<h:head />
<!-- This page just displays the received params -->
<h:body>
<!-- Different ways to retrieve the params from the flash scope -->
<p>Param1: #{bean2.param}</p>
<p>Param1: #{flash.param}</p>
<p>Param1: #{flash['param']}</p>
<p>Param2: #{flash['param2']}</p>
<!-- Keep the first param for next redirection -->
#{flash.keep.param}
<!-- Return to page1 and see how the first param is retained -->
<h:button outcome="page1?faces-redirect=true" value="return to 1" />
</h:body>
</html>