8.5. <s:link> と <s:button> の使用
JSF コマンドリンクは常に JavaScript でフォームサブミットを行います。 これによりウェブブラウザの「新しいウィンドウで開く」または「新しいタブで開く」機能が動作しない問題が発生します。純粋な JSF でこの機能が必要な場合は、
<h:outputLink> を使用する必要があります。 ただし、 このメソッドには重要な制限が 2 つあります。
- JSF にはアクションリスナーを
<h:outputLink>につなげる方法は備わっていません。 - また、実際のフォームサブミットがないため JSF は選択された
DataModelの行を伝播しません。
Seam は ページアクション という概念で 1 番目の問題を解決しますが、 2 番目の問題は解決しません。 要求パラメータを渡しサーバー側で選択されたオブジェクトを再度クエリすることでこの問題に対処することは可能です。いくつかのケースでは (Seam ブログのサンプルアプリケーションなど) これが最善策となります。 これは RESTful でありサーバー側の状態を必要としないためブックマーク機能に対応します。ブックマークを必要としない他のケースでは
@DataModel と @DataModelSelection が透過的かつ便利です。
この機能を補ってさらに対話伝播をより簡略化するために、 Seam は
<s:link> JSF タグを提供します。
このリンクは JSF ID だけ指定できます。
<s:link view="/login.xhtml" value="Login"/>
<s:link view="/login.xhtml" value="Login"/>
また、 アクションメソッドを指定することもできます。 この場合アクションの結果は最終的なページを確定します。
<s:link action="#{login.logout}" value="Logout"/>
<s:link action="#{login.logout}" value="Logout"/>
JSF ビュー ID とアクションメソッドの両方を指定すると、 アクションメソッドが null 以外の結果を返さない限りそのビューが使用されます。
<s:link view="/loggedOut.xhtml" action="#{login.logout}" value="Logout"/>
<s:link view="/loggedOut.xhtml" action="#{login.logout}" value="Logout"/>
リンクは
<h:dataTable> 内で使用する DataModel の選択された行を自動的に伝播します。
<s:link view="/hotel.xhtml" action="#{hotelSearch.selectHotel}"
value="#{hotel.name}"/>
<s:link view="/hotel.xhtml" action="#{hotelSearch.selectHotel}"
value="#{hotel.name}"/>
既存の対話のスコープを残しておくことができます。
<s:link view="/main.xhtml" propagation="none"/>
<s:link view="/main.xhtml" propagation="none"/>
対話を開始、 終了、 またはネストすることができます。
<s:link action="#{issueEditor.viewComment}" propagation="nest"/>
<s:link action="#{issueEditor.viewComment}" propagation="nest"/>
リンクが対話を開始すると、ページプローの使用を指定することができます。
<s:link action="#{documentEditor.getDocument}" propagation="begin"
pageflow="EditDocument"/>
<s:link action="#{documentEditor.getDocument}" propagation="begin"
pageflow="EditDocument"/>
以下のように
taskInstance 属性は jBPM タスクリストで使用します。例は 「Seam と jBPM を使ったアプリケーションの全容 : DVD ストアサンプル」 を参照してください。
<s:link action="#{documentApproval.approveOrReject}"
taskInstance="#{task}"/>
<s:link action="#{documentApproval.approveOrReject}"
taskInstance="#{task}"/>
最後に「リンク」をボタンとしてレンダリングさせたい場合は
<s:button> を使用します。
<s:button action="#{login.logout}" value="Logout"/>
<s:button action="#{login.logout}" value="Logout"/>