8.3. GET 要求を使った対話の開始
ページが Faces でない要求 (HTTP GET 要求など) 経由でアクセスされる場合、 JSF はトリガされるアクションリスナーを定義しません。これはユーザーがページをブックマークする、または
<h:outputLink> からそのページに移動する場合に発生します。
ページがアクセスされたら直ちに対話を開始したい場合があります。 JSF アクションメソッドがないため、アクションに
@Begin アノテーションを付けることはできません。
このページが状態をコンテキスト変数にフェッチする必要がある場合、 さらなる問題が発生します。 すでに、この問題を解決する 2 つの方法を見てきました。 Seam コンポーネントにその状態が保持される場合、
@Create メソッドでその状態をフェッチできます。 状態が保持されていなければ、 コンテキスト変数に対して @Factory メソッドを定義することができます。
いずれの方法もうまくいかない場合、 Seam では
pages.xml ファイルに ページアクション を定義することができます。
<pages>
<page view-id="/messageList.jsp" action="#{messageManager.list}"/>
...
</pages>
<pages>
<page view-id="/messageList.jsp" action="#{messageManager.list}"/>
...
</pages>
レスポンス出力フェーズの始め、つまりページのレンダリング開始直前にこのアクションメソッドが呼び出されます。 ページアクションが null 以外の結果を返す場合、 Seam は適切な JSF および Seam ナビゲーションルールを処理するため、 まったく異なるページがレンダリングされることがあります。
ページのレンダリング前にしたいことが対話の開始 だけ の場合、組み込みアクションメソッドを次のように使用できます。
<pages>
<page view-id="/messageList.jsp" action="#{conversation.begin}"/>
...
</pages>
<pages>
<page view-id="/messageList.jsp" action="#{conversation.begin}"/>
...
</pages>
また、 この組み込みアクションは JSF コントロールから呼び出すこともでき、 同様に
#{conversation.end} を使って対話を終了します。
以下のように既存の対話への参加、 ネストした対話やページフロー、 アトミックな対話の開始などの制御に
<begin-conversation> エレメントを使用することができます。
また、
<end-conversation> エレメントもあります。
これでページがアクセスされた直後に対話を開始できるオプションは 5 種類になりました。
@Createメソッドに@Beginアノテーションを追加する@Factoryメソッドに@Beginアノテーションを追加する- Seam ページアクションメソッドに
@Beginアノテーションを追加する pages.xmlで<begin-conversation>を使用する#{conversation.begin}を Seam ページアクションメソッドとして使用する