第8章 対話とワークスペースの管理
本章では Seam の対話モデルについて詳細に説明していきます。
Seam 対話 の概念は、3 つの別々のコンセプトが組み合わさり生まれました。
- ワークスペース というコンセプトと、効率的なワークスペースの管理。
- 楽観的なセマンティクスの アプリケーショントランザクション というコンセプト。 ステートレスアーキテクチャをベースとする既存のフレームワークでは、拡張永続のコンテキストを効率的に管理することはできませんでした。
- ワークフロー タスク というコンセプト。
こうした考えを統一しフレームワークで強力にサポートすることで、 以前よりすっきりしたコードでより豊かで効率的なアプリケーションを可能にするパワフルな構成概念を得ました。
8.1. Seam の対話モデル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
これまで見てきた例は、以下の規則を用いたシンプルな対話モデルで動作します。
- JSF 要求ライフサイクルのレスポンス出力フェーズ、 アプリケーション起動フェーズ、モデル値の更新フェーズ、バリデーション実行フェーズ、リクエスト値の適用フェーズなどの間は対話コンテキストは常にアクティブとなります。
- JSF 要求ライフサイクルのビュー復元フェーズの終了時に、Seam はそれまでの長期実行の全対話コンテキストの復元を試みます。 長期実行の対話コンテキストが存在しない場合は、Seam は一時的な新しい対話コンテキストを作成します。
@Beginメソッドが出てくると、 一時的な対話コンテキストは長期実行の対話に昇格します。@Endメソッドが出てくると、 すべての長期実行の対話コンテキストは一時的な対話に降格されます。- JSF 要求ライフサイクルであるレスポンス出力フェーズの終わりには、Seam は長期実行の対話コンテキストの内容を記憶するか、 一時的な対話コンテキストの内容を破棄します。
- Faces 要求 (JSF ポストバック) はすべて対話コンテキストを伝播します。 デフォルトでは、 Faces ではない要求 (GET 要求など) は対話コンテキストを伝播しません。
- JSF 要求のライフサイクルがリダイレクトで短縮される場合、 対話が既に
@End(beforeRedirect=true)で終了されていない限り Seam は透過的に現在の対話コンテキストを格納して復元します。
Seam は透過的に対話コンテキスト (一時的な対話コンテキストを含む) を JSF ポストバックおよびリダイレクト全体に伝播します。 特に何も付けなければ Faces でない要求 (GET 要求など) は対話コンテキストを伝播せず新たな一時対話内で処理されます。常にではありませんが、これが通常求められる動作です。
Faces でない要求全体に Seam の対話を伝播させたい場合、 要求パラメータとして Seam 対話 ID を明示的にコード化する必要があります。
<a href="main.jsf?#{manager.conversationIdParameter}=#{conversation.id}">
Continue
</a>
<a href="main.jsf?#{manager.conversationIdParameter}=#{conversation.id}">
Continue
</a>
または、 JSFの場合
<h:outputLink value="main.jsf">
<f:param name="#{manager.conversationIdParameter}"
value="#{conversation.id}"/>
<h:outputText value="Continue"/>
</h:outputLink>
<h:outputLink value="main.jsf">
<f:param name="#{manager.conversationIdParameter}"
value="#{conversation.id}"/>
<h:outputText value="Continue"/>
</h:outputLink>
Seam タグライブラリを使用する場合、 以下は等価です。
<h:outputLink value="main.jsf"> <s:conversationId/> <h:outputText value="Continue"/> </h:outputLink>
<h:outputLink value="main.jsf">
<s:conversationId/>
<h:outputText value="Continue"/>
</h:outputLink>
ポストバック用の対話コンテキストの伝播を無効にするコード例を以下に示します。
<h:commandLink action="main" value="Exit"> <f:param name="conversationPropagation" value="none"/> </h:commandLink>
<h:commandLink action="main" value="Exit">
<f:param name="conversationPropagation" value="none"/>
</h:commandLink>
以下は Seam タグライブラリと同等です。
<h:commandLink action="main" value="Exit"> <s:conversationPropagation type="none"/> </h:commandLink>
<h:commandLink action="main" value="Exit">
<s:conversationPropagation type="none"/>
</h:commandLink>
注記
対話コンテキストの伝播を無効にすることと、対話を終了することは同じでは ありません。
conversationPropagation 要求パラメータまたは <s:conversationPropagation> タグを使って対話の開始と終了を行う、またはネストされた対話を開始することができます。
<h:commandLink action="main" value="Exit"> <s:conversationPropagation type="end"/> </h:commandLink>
<h:commandLink action="main" value="Exit">
<s:conversationPropagation type="end"/>
</h:commandLink>
<h:commandLink action="main" value="Select Child"> <s:conversationPropagation type="nested"/> </h:commandLink>
<h:commandLink action="main" value="Select Child">
<s:conversationPropagation type="nested"/>
</h:commandLink>
<h:commandLink action="main" value="Select Hotel"> <s:conversationPropagation type="begin"/> </h:commandLink>
<h:commandLink action="main" value="Select Hotel">
<s:conversationPropagation type="begin"/>
</h:commandLink>
<h:commandLink action="main" value="Select Hotel"> <s:conversationPropagation type="join"/> </h:commandLink>
<h:commandLink action="main" value="Select Hotel">
<s:conversationPropagation type="join"/>
</h:commandLink>
この対話モデルにより、 マルチウィンドウ操作に正常に動作するアプリケーションの構築が容易になります。多くのアプリケーションに必要なのはこれだけです。 複雑なアプリケーションの中には以下の追加要件の両方あるいはどちらかを必要とするものがあります。
- 対話には、 連続的に実行したり同時に実行する多くの小さな単位のユーザーの操作も含まれます。より小さい ネストされた対話 には単独の対話状態セットがあり、また外側の対話状態へのアクセスもあります。
- ユーザーは同じブラウザのウィンドウ内でいくつもの対話を切り換えることができます。 この機能は ワークスペース管理 と呼ばれます。