我有两页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方法传递此值的情况下访问该值。 只是为了我的满意,我使用会话范围,然后它工作,但我知道这不是正确的方式,因为我开始使用每个页面的会话范围,然后它将不会有效。 感谢
答案 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范围地图简化了你可以使用它的情况,但我不会去做这样的事情。
更新:忘了提及你也可以查看对话范围。