JSFのリダイレクトの仕組みとFlashスコープについて

JSF2.0におけるリダイレクトの仕組みとFlashスコープについて簡単に。。。

1.クライアントがサーバにリクエストを送信
2.リクエストスコープのデータをBeanに配置。
3.サーバ側で任意の処理を実行。
4.ナビゲーションルールに従い次のページをクライアントに表示。この時が設定されていた場合、次ページのレンダリングを行うのではなくリダイレクト先のURLをHTTP302のステータスと一緒にクライアントに返信。
5.一連のリクエストが終了。(リクエストスコープのデータもこのタイミングで削除されます。)
6.次にクライアントは302ステータスを受信し、新たにGETメソッドで4で送られてきたリダイレクト先のURLをサーバに問い合わせる。
7.サーバはクライアントからのGETメソッドに従って、リダイレクト先となる新たなページを表示。

HTTPのステータスで3XXシリーズはリダイレクションを表します。4において、正確にはLocationヘッダに次に表示するURLが設定されています。ブラウザは6でHTTP302ステータスを受け取ると、Locationの内容を参照し、サーバに問い合わせに行きます。

これが一連のリダイレクトの流れです。リクエストスコープに保持しているデータは5のタイミングで削除されるためリダイレクト先に引き継ぐことができません。リダイレクト先にまでデータを引き継ぎたい場合は、JSF2.0ではFlashスコープを利用する必要があります。

JSF2.0でFlashスコープを利用するには、3でリダイレクト先に引き継ぎたいデータを以下のように設定します。

FacesContext.getCurrentInstance().getExternalContext().getFlash().put("userId", user.getUserId());

リダイレクト先のページでFlashスコープのデータを表示するには次のよう宣言するだけです。

#{flash.userId}

FlashスコープはRailsFlash機能に影響を受けたものであることは間違いないと思います。Railsの考え方は多くのフレームワークに影響を及ぼしているということを改めて認識させられます!