我有一个视图范围的 JSF 托管 bean。在这个托管 bean 的动作监听器方法中<p:commandButton>
,我重定向到另一个页面,如下所示。
public void register() {
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
Flash flash = context.getFlash();
flash.setKeepMessages(true);
flash.put("emailId", emailId);
context.redirect(((HttpServletRequest) context.getRequest()).getContextPath()+"/page.jsf");
}
page.jsf
绑定到请求范围的 bean,我在其中接收存储在 flash 范围中的电子邮件地址,如下所示。
<ui:define name="metaData">
<f:metadata>
<f:viewAction action="#{requestScopedBean.init}"/>
</f:metadata>
</ui:define>
public void init() {
String emailId = (String) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("emailId");
System.out.println("emailId = "+emailId);
}
电子邮件地址在目标 bean 中不可用。目标 bean 中的电子邮件地址仅用于向已注册的用户显示消息已发送到该地址,以便可以验证电子邮件地址。
它在服务器终端上产生以下警告。
警告:JSF1095:在我们尝试为 flash 设置传出 cookie 时,响应已经提交。存储到闪存中的任何值在下一次请求时都将不可用。
为什么会这样?我的 Mojarra 版本是 2.2.7