JSF 2.0のGETパラメータの受け取り
で、GETで移動できるようになったのはいいけど、そのパラメータはどうやって受け取るの?ブックマーカブルなURLどうすんの?
とJSFを知っている人は思うに違いない。今までだとExternalContextを使って取得していた。
せっかく便利な管理Bean(sunの翻訳だとこれが正式みたい)があるのにそれがそのままでは使われない。
JSF 2.0ではそれが改善された。
<f:metadata> <f:viewParam name="name" value="#{HogeBean.text}"/> </f:metadata>
とテンプレートにセットしておくと「HogeBean#setText(String)」が呼ばれる。
セットされるのはよいのだが、それをつかって処理するタイミングはあるのか。
JSFのフェーズを見るとプリレンダーフェーズがそれに該当する。woodstockの拡張ではあったが、標準のJSFのAPIでそれを簡単に呼び出す方法はあるのか。
ある。
<f:metadata> <f:viewParam name="name" value="#{HogeBean.text}"/> <f:event type="preRenderView" listener="#{HogeBean.preRender}"/> </f:metadata>
このように記述することによってレンダリングの直前に指定したメソッドが呼ばれる。
たとえば以下のような管理Beanがあったとすると
public class HogeBean { String text = ""; public String getText() { return text; } public void setText(String text) { System.out.println("せったーがよばれた:" + text); this.text = text; } public void preRender(){ System.out.println("ぷりれんだ:" + text); } }
「?name=link」というGETパラメータで実行すると結果は以下のようになる。
情報: せったーがよばれた:link
情報: ぷりれんだ:link
「f:event」はほかにもValidateの前後などフェーズが指定できる。これによって複数の値を元にバリデーションすることやAjaxによるpost時のメッセージ管理等かなり融通が利くようになる。
JSFはもともとテンプレートをベースに考えるのだが(これがアクションベースとの最大の違い)、JSF 2.0ではそれが加速された感じか。JSF2.0ではさらにテンプレートをロジックと完全なXHTMLベースのテンプレートの2つに分離できるので(参照)、テンプレートが複雑だからロジックを探すのが大変ということになることもないと思われる。
Webアプリで重要なのは大量のコンポーネントと複数のボタンやリンクでのサブミット時に柔軟に対応できるかどうかだと思うので、JSF 2.0の恩恵はかなりあるかと思われる。シンプルなリンクとURLベースでのアクション分離程度ならばどのフレームワークでも容易なためそこはもはや論点ではない。あとはAjaxによる画面更新がどれだけ簡単になるかだが、これもJSF 2.0は相性がよい。scriptでの送信方法も用意されていてscriptと共存できるようになってるあたりもポイントが高い。
GETとAJAXとテンプレートの問題を解決してしまったJSF 2.0は、もはやJSF 1.xとは別物といってよいパワーアップぶりだ。今後複数のWebフレームワークで同じ動きをするものを勉強がてら書いてみたいと思う。Cubbyもなにやら2.0がでてるし、T2も新しいのが出てるし。
そのためにもまずは世界樹の迷宮をだな…今週末までにはけりをつけたいところ。