2013-02-26 14 views
1

我有两个页面myaccount.xhtml和selectbank.xhtml 在我的帐户页面中有一个用于填充帐户的选项,用户将输入金额当用户按提交按钮时,它将使用以下bean方法转到选择银行页面。jsf2.0 - 如何在请求范围内获取其他jsf页面的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方法访问该值而不传递此值。 为了我的满意,我使用会话范围,然后它工作,但我知道这不是正确的方式,因为我开始使用每个页面的会话范围,那么它将不会有效。 谢谢

回答

4

那么,如果你的豆是RequestScoped比你没有相同的豆这两个页面。这些bean是为每个请求重新创建的,因此您应该传递参数。您gotoPayMethod()到的变化return语句:

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

selectbank.xhtml地址:

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

适应给你的财产和bean名称。

如果使用的参数是不是你可以在会话中添加这个参数,而从会议第二豆删除它,当您检索它的解决方案:

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

去除属性第二个建设是必要的,因为MapgetSessionMap()返回是不可变的。

+0

URL在银行应用程序是有风险的GET,而不是一个很好的做法。应该避免,其实绝不应该用我的看法。 – 2013-02-26 10:22:38

1

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

在URL中使用隐藏变量或GET参数并不是很好的做法,特别是对于银行应用程序。在安全性如此重要的地方,不要在小记忆印记上妥协。

如果闪光示波器映射简化了您可以使用它的情况,但我不会去做这样的事情。

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

+0

我从来没有听说过会话范围,但现在我知道如何使用它,谢谢现在我有三种不同的选择,我可以根据自己的需要使用它.., – chinmay91 2013-02-26 14:26:00

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:从selectbank.xhtml

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

} 

详情:

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