私はJSF の PRG パターンに関する Balusc ブログを読んでいました。
この記事は JSF 1.2 を対象としています。JSF 2.0 の場合、これは新しい Flash スコープを使用して簡単に実現できます。
flash
スコープが同じことを達成するのにどのように役立つかを知りたかったのですか?
レンダー レスポンス フェーズの前に呼び出しFlash#setKeepMessages()
てtrue
、Faces メッセージをフラッシュ スコープに格納faces-redirect=true
し、結果にクエリ文字列パラメータを追加してリダイレクトを実行するよう JSF に指示します。
public String submit() {
// ...
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Success!", null));
context.getExternalContext().getFlash().setKeepMessages(true);
return "nextpage?faces-redirect-true";
}
この方法では、faces コンテキストから faces メッセージを収集し、リダイレクト前にそれらをセッションに格納し、firstnext リクエストでそれらをセッションから削除し、リダイレクト後に faces コンテキストに再度追加するフェーズ リスナーは必要ありません。
フラッシュ スコープもほぼ同じように機能します。メッセージは、一意の識別子によってセッションに保存されます。この識別子は、応答で Cookie として渡されます。これらのメッセージ (および Cookie) は、Cookie を返した最初の次の要求でセッションから削除されます (これは、 、結局のところ、より堅牢な実装ですが、エンドユーザーがまったく同じ瞬間に同じセッションで 2 つの HTTP 要求を送信する可能性はほとんどありません (またはそれがロボットである必要があります)。