jsf
Flash Scope w JSF 2
Szukaj…
Uwagi
Koncepcja Flash została zaczerpnięta z Ruby on Rails i zapewnia sposób przekazywania obiektów tymczasowych między widokami użytkownika generowanymi przez cykl życia ścian. Podobnie jak w Railsach, wszystko, co zostanie umieszczone we flashu, zostanie narażone na następny widok napotkany przez tę samą sesję użytkownika, a następnie usunięte. Należy zauważyć, że „następny widok” może mieć taki sam identyfikator widoku jak poprzedni widok.
Implementacja JSF musi zapewniać zachowanie właściwego flashowania nawet w przypadku <navigation-case> która zawiera <redirect /> . Implementacja musi zapewniać zachowanie właściwego flashowania nawet w przypadku sąsiadujących żądań GET w tej samej sesji. Pozwala to aplikacjom Faces na pełne wykorzystanie wzorca projektowego „Post / Redirect / Get”.
Demonstracja użycia Flash Scope
Fasola 1
@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>
Fasola 2
@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>