我对 JSF 的 FlashScope 有疑问,请注意,我知道重定向应该指向与调用页面相同的基本路径。
我的情况是,当客户端从他/她的电子邮件中单击一个链接时,该操作将被初始化,然后它将加载一个带有支持 bean 的 .xhtml(具有 preRenderView 事件)页面以检查传递的参数。当参数错误时,它必须重定向到带有消息的新页面。
风景:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<f:metadata>
<f:viewParam name="dummy" />
<f:event listener="#{signupMaterialBean.initFromContext()}"
type="preRenderView"></f:event>
</f:metadata>
<h:outputText value="#{signupMaterialBean.html}" escape="false"></h:outputText>
</ui:composition>
支持豆:
public void initFromContext() {
try {
Map<String, String> params = facesContext.getExternalContext()
.getRequestParameterMap();
...
} catch (NullPointerException e) {
try {
Message message = new Message();
String msg = "Invalid parameters";
message.setMessage(msg);
JSFUtils.flashScope().put("message", message);
facesContext.getExternalContext().redirect("message.xhtml");
facesContext.responseComplete();
} catch (IOException ioe) {
}
} catch (IOException e) {
}
}
重定向有效,但 FlashScope 中保存的消息消失了。知道为什么要删除闪存范围或其他方式吗?
消息.xhtml
<ui:define name="head"></ui:define>
<ui:define name="content">
<div class="box-middle-content faded">
<div class="message">
<h:outputText escape="false" value="#{flash.message.message}"></h:outputText>
<br />
<p>
<h:outputText value="#{msgs['message.footer']}" escape="false" />
</p>
</div>
</div>
</ui:define>
</ui:composition>
JSFUtils
public class JSFUtils {
public static Flash flashScope() {
return (FacesContext.getCurrentInstance().getExternalContext()
.getFlash());
}
}
更新视图:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:of="http://omnifaces.org/functions">
<f:metadata>
<f:viewParam name="dummy"></f:viewParam>
<f:event type="postInvokeAction"
listener="#{signupMaterialBean.initFromContext}" />
</f:metadata>
<h:outputText value="#{signupMaterialBean.html}" escape="false"></h:outputText>
</ui:composition>