1

我有两个页面 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 时,用户必须提交付款方式,但在此页面中,它显示金额为 null,这是在上一页中输入的。两个页面都使用相同的 bean,并且 bean 的范围是请求范围。

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

4

3 回答 3

4

好吧,如果您的 beanRequestScoped比您的两个页面都没有相同的 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()是不可变的。

于 2013-02-26T10:20:43.913 回答
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}" />
于 2013-02-26T10:38:42.847 回答
1

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

在 URL 中使用隐藏变量或 GET 参数不是好的做法,尤其是对于银行应用程序。在安全性如此重要的地方,不要在小内存占用空间上妥协。

如果闪存范围图简化了案例,您可以使用它,但我不会这样做。

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

于 2013-02-26T10:24:42.707 回答