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によるリクエストパラメーターの受信と大差がありません。より重要なことはページパラメーターはリクエスト時に値を受け取るだけでなく、タグでそのパラメーターが定義された画面へのリンクを張ると、明示的にでパラメーターを指定しない限り、value属性(かPageコンテキスト)の現在値で自動的にURLにパラメーターを付加してくれるという点ですね。さらに、その画面に対するリダイレクト時にも自動的にも親切にパラメーターが付加されます。ある意味ページパラメーターは双方向に値をやり取りできるinout型のパラメーターのように機能するということです。たとえば、userHomeにuserId=3が設定されている状態であるとして、などで上記ページへリンクすると?userId=3が自動的にURLに付け加わります。結果として、ページパラメーターを定義した画面を表示し続ける限り、ページパラメーターの値が維持されるということです。これは真の意味でページスコープの状態保持機構として機能することです。(一方、SeamのPageスコープのコンテキストはUIツリーに対して状態を保持するため、リダイレクトを含めてGET時には同一画面への遷移であっても状態が維持されません。)URLに埋め込むことになるため、基本的にStringや数値などの文字列化しやすい値型に限られますが、idなどの状態を持ちまわる機構としては非常に便利といえます。
さらに、単一画面内での状態遷移だけでなく、一連の画面で同一名のページパラメーターを定義しておけば、複数画面間で状態を持ちまわることも簡単にできるのです。これも会話スコープと違い、会話の終了時やタイムアウト時にもクリアされる心配がなく、その画面間を遷移する限り状態を維持できます。実際JBoss Toolsやseam-genで生成した画面では詳細画面と編集画面の間や親子関係のエンティティの関連をドリルダウンする際にこのページパラメーターを使った状態を持ち回りテクニックが多用されています。さらに、一覧検索画面ではソートや検索パラメーターの状態保持にも利用されています。このようにURLパラメーターやhiddenタグでidを持ちまわる手法は従来のWeb開発では一般的な手法でしたが、ページパラメーターを利用するとSeamでもよりスマートにこの状態持ち回りテクニックが利用できるということです。実際上は何をサーバー側で状態保持して、何をページパラメーターで保持するのか、使い分けを考える必要があります。基本的にはRESTの考え方でリソースを特定するidや検索キーのようなものにページパラメーターを使うとしっくりくることが多いと思います。サーバー側では永続コンテキストなどそれ以外の状態を保持します。
なお、JSF2.0ではSeamのページ定義ファイルに相当するものがないため(画面遷移定義におけるJSFとSeamの思想の違いについて)宣言の仕方は大きく異なるものの、概念的にはページパラメーターが取り込まれています。おそらくほとんど同じ使い方ができるものと思います。