jsf2.0 - 如何在请求范围内获取其他jsf页面的bean中的值

时间:2013-02-26 09:57:34

标签: jsf-2

我有两页myaccount.xhtml和selectbank.xhtml 在我的帐户页面中,有一个充值帐户选项,当用户按下提交按钮时,用户将输入金额,然后使用以下bean方法转到选择银行页面。

public String gotoPayMethod() {
    FacesMessage doneMessage=new FacesMessage("Redirecting to Payment Type Page");
    FacesContext.getCurrentInstance().addMessage(null, doneMessage);
    return "SelectBank";
}

当用户转到selectbank时,用户必须提交付款方式,但在此页面中,它显示在上一页输入的金额为空。 这两个页面都使用相同的bean,bean的范围是请求范围。

那么如何在不通过URL GET方法传递此值的情况下访问该值。 只是为了我的满意,我使用会话范围,然后它工作,但我知道这不是正确的方式,因为我开始使用每个页面的会话范围,然后它将不会有效。 感谢

3 个答案:

答案 0 :(得分:4)

好吧,如果您的bean是RequestScoped,那么两个页面都没有相同的bean。这些bean是为每个请求重新创建的,因此您应该传递参数。将gotoPayMethod()的退货声明更改为:

return "SelectBank?faces-redirect=true&includeViewParams=true";

并在selectbank.xhtml上添加:

<f:metadata>
  <f:viewParam name="amount" value="#{bean.amount}" />
</f:metadata>

使其适应您的属性和bean名称。

如果使用参数不是解决方案,您可以在会话中添加此参数,并在检索时将其从第二个bean中的会话中删除:

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("amount", amount);
((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession().removeAttribute("amount");

由于从Map返回的getSessionMap()是不可变的,因此必须使用第二个删除属性的构造。

答案 1 :(得分:3)

您可以使用#{flash}对象将数据保留到下一个视图。这样您就不需要处理视图参数了。

来自myaccount.xhtml的详细信息:

<h:form>
    <h:outputText value="Enter amount: " />
    <h:inputText value="#{flash.amount}" />
    <br/>
    <h:commandButton value="Go to payment method" action="#{bean.gotoPayMethod}" />
<h:form>

Bean两种观点:

@ManagedBean
@RequestScoped
public class Bean {

    @ManagedProperty("#{flash}")
    private Flash flash;

    private int amount = -1;

    public Bean () {   }

    public String getAmount() {
        if(amount == -1) {
            int val = Integer.parseInt((String)flash.get("amount"));
            flash.keep("amount");
            amount = val;
        }
        return amount;
    }

    public Flash getFlash() {
        return flash;
    }

    public void setFlash(Flash flash) {
        this.flash = flash;
    }

    public String gotoPayMethod() {
        //do business job
        return "SelectBank?faces-redirect=true";
    }

}

来自selectbank.xhtml的详细信息:

<h:outputText value="Amount entered by user is #{bean.amount}" />

答案 2 :(得分:1)

您的用例不是简单的请求/响应周期,生命周期不止一个请求响应,这使其成为会话范围的候选者。

在URL中使用隐藏变量或GET参数并不是一种好习惯,尤其对于银行应用程序而言。安全性非常重要,不要在小内存占用上妥协。

如果flash范围地图简化了你可以使用它的情况,但我不会去做这样的事情。

更新:忘了提及你也可以查看对话范围。