2016-04-20 5 views
2

ich durch ein Beispiel werde in Anghel Leonard Buch Mastering Java Server Faces 2.2.flash.keep & flash.setKeepMessages (true) auf Umleitung

Der Autor zeigt anhand eines Beispiels, wie die Daten für die nächste Anforderung für die Umleitung beim Erstellen der Bean beibehalten werden: @RequestScoped.

enter image description here enter image description here

Dies ist der Code für index.xhtml-

<h:body> 
    <f:metadata> 
     <f:event type="preRenderView" 
      listener="#{playersBean.pullValuesFromFlashAction}"/> 
    </f:metadata> 
    <h:messages /> 
    <h:form>      
     Name: <h:inputText value="#{playersBean.playerName}"/> 
     Surname: <h:inputText value="#{playersBean.playerSurname}"/> 
     <h:commandButton value="Register" 
      action="#{playersBean.addValuesToFlashAction()}"/>   
    </h:form> 
</h:body> 

terms.xhtml-

<h:body> 
    <h:messages /> 
    Hello, <h:outputText value="#{flash.keep.playerName} #{flash.keep.playerSurname}"/>  
    <br/><br/>Terms &amp; Conditions ... ... ... ... ... 
    <h:form> 
     <h:commandButton value="Reject" 
      action="#{playersBean.termsRejectedAction()}" /> 
     <h:commandButton value="Accept" 
      action="#{playersBean.termsAcceptedAction()}" /> 
    </h:form> 
</h:body> 

done.xhtml-

<h:head> 
    <title></title> 
</h:head> 
<h:body> 
    <f:metadata> 
     <f:event type="preRenderView" 
      listener="#{playersBean.pullValuesFromFlashAction}"/> 
    </f:metadata> 
    <h:messages /> 
    <h:outputText value="#{playersBean.playerName} #{playersBean.playerSurname}"/> 
     successfully registered!   
</h:body> 

Und der Träger Bohnen-

@ManagedBean 
@RequestScoped 
public class PlayersBean { 

    private final static Logger logger = Logger.getLogger(PlayersBean.class.getName()); 
    private String playerName; 
    private String playerSurname; 
    public PlayersBean() { 
    } 
    public String getPlayerName() { 
     return playerName; 
    } 
    public void setPlayerName(String playerName) { 
     this.playerName = playerName; 
    } 
    public String getPlayerSurname() { 
     return playerSurname; 
    } 
    public void setPlayerSurname(String playerSurname) { 
     this.playerSurname = playerSurname; 
    } 
    public String addValuesToFlashAction() { 

     Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash(); 
     flash.put("playerName", playerName); 
     flash.put("playerSurname", playerSurname); 
     return "terms?faces-redirect=true"; 
    } 
    public void pullValuesFromFlashAction(ComponentSystemEvent e) { 
     Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash(); 
     playerName = (String) flash.get("playerName"); 
     playerSurname = (String) flash.get("playerSurname"); 
    } 
    public String termsAcceptedAction() { 
     Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash(); 

     flash.setKeepMessages(true); 
     pullValuesFromFlashAction(null); 

     //do something with firstName, lastName 
     logger.log(Level.INFO, "First name: {0}", playerName); 
     logger.log(Level.INFO, "Last name: {0}", playerSurname); 

     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Terms accepted and player registered!")); 
     return "done?faces-redirect=true"; 
    } 
    public String termsRejectedAction() { 
     Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash(); 

     flash.setKeepMessages(true); 
     pullValuesFromFlashAction(null); 

     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Terms rejected! Player not registered!")); 
     return "index?faces-redirect=true"; 
    } 
} 

Ich denke, es gibt keine Notwendigkeit für diese Lines-

flash.setKeepMessages(true); 
pullValuesFromFlashAction(null); 

als flash.keep auf terms.xhtml Seite den gleichen Zweck dient 2 war. Der Autor scheint hier verwirrt zu sein.

Oder bin ich völlig falsch & sie dienen definitiv einen Zweck hier.

Antwort

2

Der vom Autor gewählte Code ist ein wenig verwirrend, aber aus meiner Sicht tut er genau das, was er tun soll.

flash.setKeepMessages (wahr);

Diese Zeile teilt JSF mit, dass Sie die FacesMessage im Flash-Bereich behalten möchten. Dies ist eine Voraussetzung, wenn eine Umleitung vorgenommen wird, da mehr als eine nachfolgende Anforderung beteiligt ist und die Nachrichten andernfalls von einer Anforderung zur nächsten ablaufen würden. Die Linie ist erforderlich.

pullValuesFromFlashAction (null);

Die Linie macht nichts besonderes, greift nur den Namen und den Nachnamen aus dem Flash-Bereich. Es ist einfach richtig, es von preRenderView aufzurufen, um Bean-Daten aus dem Flash-Bereich zu laden, aber es ist redundant, um es von den Aktionsmethoden aufzurufen (es sei denn, Sie möchten einige Protokollierung durchführen, um die Parameter richtig einzustellen). Wie auch immer, wenn Sie mit JSF beginnen, empfehle ich Ihnen, JSF 2.2 zu verwenden, das einen parameterlosen Ersatz für die preRenderView Methoden hat, genannt viewAction.

Last but not least würde ich Ihnen empfehlen, durch an answer zu gehen Ich habe vor einiger Zeit ein Beispiel für den Umgang mit dem Flash-Scope gezeigt, Sie könnten es interessant finden.

Siehe auch: