7.2. ページアクション
Seam ページアクションはページのレンダリングの直前に発生するイベントです。 ページアクションは
WEB-INF/pages.xml で宣言します。 特定の JSF ビュー ID に対してページアクションを定義することも可能です。
<pages>
<page view-id="/hello.jsp" action="#{helloWorld.sayHello}"/>
</pages>
<pages>
<page view-id="/hello.jsp" action="#{helloWorld.sayHello}"/>
</pages>
あるいは、
view-id へのサフィックスとして * ワイルドカードを使用し、パターンに一致するすべてのビュー ID に適用するアクションを指定します。
<pages>
<page view-id="/hello/*" action="#{helloWorld.sayHello}"/>
</pages>
<pages>
<page view-id="/hello/*" action="#{helloWorld.sayHello}"/>
</pages>
注記
<page> エレメントが細かなページ記述子で定義されている場合は暗黙的に定義されるため view-id 属性を省略することができます。
複数のワイルドカード化されたページアクションが現在のビュー ID に一致する場合は、Seam は指定が明確でないアクションから指定が明確なアクションの順ですべてのアクションを呼び出します。
ページアクションのメソッドは JSF の結果を返すことができます。 その結果 が null でなければ、 Seam はビューへの移動に定義済みナビゲーションルールを使用します。
<page> エレメントに記載されている ビュー ID は実際の JSP や Facelet ページに対応する必要がありません。 このため、 ページアクションを使って Struts や WebWork のような従来のアクション指向のフレームワーク機能を再生することができます。 HTTP GET など Faces 以外の要求への応答に複雑な動作を行う場合に便利です。
複数または条件付きのページアクションは
<action> タグを使って指定できます。
ページアクションは初期の要求 (Faces 以外) とポストバック (Faces) 要求の両方で実行されます。 ページアクションを使用してデータをロードするとポストバックで実行されている標準の JSF アクションと競合する場合があります。 ページアクションを無効にするひとつの方法として、初期要求でのみ
true に解決する条件を設定します。
この条件は
ResponseStateManager#isPostback(FacesContext) を参照して要求がポストバックであるかどうかを判断します。 ResponseStateManager には FacesContext.getCurrentInstance().getRenderKit(). getResponseStateManager() を使ってアクセスします。
Seam はこの冗長性の少ない結果を得ることができる組み込みの条件を提供しています。
on-postback 属性を false に設定するとポストバックでページアクションを無効にすることができます。
on-postback 属性はデフォルトでは true に設定され後方互換性を維持します。 ただし、 false を使用することも多々あります。