Seamのページパラメーターは奥が深い
会話スコープによるサーバー側での状態保持やバイジェクションなどの機能と比較して、地味目な機能のため、初心者にはあまりよく理解されていない傾向があるようですが、Seamのページパラメーター機能は実に奥が深くて、便利な機能だと思います。宣言の仕方は、ページ定義のxmlファイルにて以下のようにタグを書くことで行います。
<page xmlns="http://jboss.com/products/seam/pages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.2.xsd"> <param name="userFrom"/> <param name="userId" value="#{userHome.userId}"/> </page>
名前のとおり、画面のパラメーターということで、画面が受け取る情報を宣言し、これをEL式でBeanのプロパティにバインドすることで、画面表示時にBeanの値にパラメーターが設定されます。(また、上記のnameFromのようにvalue属性を省略するとBeanではなくPageコンテキストに値が直接格納されます。)
画面が値を受け取る機構として、ここまでは理解しやすいのですが、この点だけでは@RequestParameterによるリクエストパラメーターの受信と大差がありません。より重要なことはページパラメーターはリクエスト時に値を受け取るだけでなく、
さらに、単一画面内での状態遷移だけでなく、一連の画面で同一名のページパラメーターを定義しておけば、複数画面間で状態を持ちまわることも簡単にできるのです。これも会話スコープと違い、会話の終了時やタイムアウト時にもクリアされる心配がなく、その画面間を遷移する限り状態を維持できます。実際JBoss Toolsやseam-genで生成した画面では詳細画面と編集画面の間や親子関係のエンティティの関連をドリルダウンする際にこのページパラメーターを使った状態を持ち回りテクニックが多用されています。さらに、一覧検索画面ではソートや検索パラメーターの状態保持にも利用されています。このようにURLパラメーターやhiddenタグでidを持ちまわる手法は従来のWeb開発では一般的な手法でしたが、ページパラメーターを利用するとSeamでもよりスマートにこの状態持ち回りテクニックが利用できるということです。実際上は何をサーバー側で状態保持して、何をページパラメーターで保持するのか、使い分けを考える必要があります。基本的にはRESTの考え方でリソースを特定するidや検索キーのようなものにページパラメーターを使うとしっくりくることが多いと思います。サーバー側では永続コンテキストなどそれ以外の状態を保持します。
なお、JSF2.0ではSeamのページ定義ファイルに相当するものがないため(画面遷移定義におけるJSFとSeamの思想の違いについて)宣言の仕方は大きく異なるものの、概念的にはページパラメーターが取り込まれています。おそらくほとんど同じ使い方ができるものと思います。