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>
バッキング Bean:
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>