2

我正在阅读Anghel Leonard书中Mastering Java Server Faces 2.2中的一个示例。

作者通过一个示例演示了如何在创建 bean 时为下一个重定向请求保留数据@RequestScoped

在此处输入图像描述 在此处输入图像描述

这是 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>

还有后盾——

@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";
    }
}

我认为不需要这两条线-

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

因为在 terms.xhtml 页面上的 flash.keep 具有相同的目的。在这里,作者似乎很困惑。

或者我完全错了&他们确实在这里有一个目的。

4

1 回答 1

2

从我的角度来看,作者选择的代码有点令人困惑,但是,它完成了它的意图。

flash.setKeepMessages(true);

此行告诉 JSF 您希望将 保留FacesMessage在 flash 范围内。这是进行重定向时的一项要求,因为涉及多个后续请求,否则消息将从一个请求到另一个请求而死。线是必要的。

pullValuesFromFlashAction(null);

该行没有什么特别的,只是从闪存范围中获取姓名和姓氏。调用它preRenderView来从 flash 作用域加载 bean 数据是正确的,但是从操作方法调用它是多余的(除非您想进行一些日志记录以查看参数是否正确设置)。无论如何,如果您从 JSF 开始,我鼓励您使用 JSF 2.2,它对preRenderView方法进行了无参数替换,称为viewAction.

最后但并非最不重要的一点是,我建议您阅读我前段时间提出的一个答案,该答案显示了一个处理闪光灯范围的示例,您可能会觉得它很有趣。

也可以看看:

于 2016-04-20T19:54:45.557 回答