Tapestry学習ノート(7)


VisitオブジェクトとGlobalオブジェクトはTapestryフレームワークのオブジェクトコンテナであり、VisitオブジェクトとGlobalオブジェクトに任意の情報を格納できます.VisitオブジェクトとGlobalオブジェクトの違いは、ライフサイクルが異なることです.
Visitオブジェクト
Visitオブジェクトは、アプリケーションロジックとデータを格納するTapestryアプリケーションのオブジェクトコンテナです.このオブジェクトは、アプリケーション内のすべてのページとコンポーネントによって共有され、Webアプリケーション内のクライアントの特殊な情報が含まれます.このオブジェクトは、典型的なサーブレットアプリケーションでHttpSessionが果たす役割に似ています.実際,Visitオブジェクトは最終的にHttpSessionの属性として格納される.
アプリケーションでセッションに関連するいくつかのデータを使用するために、TapestryはVisitオブジェクトを提供します.TapestryはVisitオブジェクトのタイプも知らないし、気にしない.Tapestryフレームワークは、Visitオブジェクトのタイプ定義には何の要求もなく、アプリケーションごとに独自のVisitクラスを定義できます.Tapestryプロパティ注入によって得られるHiveMindフレームワークによって提供されるVisitオブジェクトでも、AbstractPageクラスのpublic Object getVisit()メソッドによって取得されるVisitオブジェクトでも、Tapestryはその具体的なタイプを指定していません.そのため、取得したVisitオブジェクトを強制的にタイプ変換する必要があります.例:
  MyVisit vist =(MyVisit)getVisit();

VisitオブジェクトはTapestryフレームワークによって自動的に作成され、Tapestryフレームワークの起動時にアプリケーション仕様ファイルを読み込むことで、Visitオブジェクトの構成情報がTapestryフレームワークのエンジンオブジェクトに格納されます.したがって、アプリケーション仕様ファイルで独自のVisitオブジェクトクラスを任意に定義できます.
<meta key=”org.apache.tapestry.visit-class” value=”com.tapestry4.engine.MyVisit”/>

クライアントが要求してHttpSessionオブジェクトが作成されると、Tapestryはアプリケーション内のVisitオブジェクトの構成情報を読み込み、Visitオブジェクトインスタンスを作成し、HttpSessionオブジェクトのライフサイクルが終了したことを知る.
必要に応じて、アプリケーションのHiveMindプロファイルhivemoduleでのみ、HiveMindフレームワークでVisitオブジェクトを作成できます.xmlでは以下のように構成します.
<contribution configuration-id=”tapestry.state.ApplicationObjects”>
	<state-object name=”flowStore” scope=”session”>
		<create-instance class=”com.tapestry.engine.FlowStore”/>
	</state-object>
</contribution>
構成Hivemindが提供するidはtapestryである.state.ApplicationObjectsのconfiguration.
Hivemindフレームワークのstateステータスオブジェクトを作成します.名前はflowStore、宣言サイクルはsessionです.この状態オブジェクトはcomである.tapestry.engine.FlowStoreクラスのインスタンス.
ページにflowStoreという名前のVisitオブジェクトを取得する必要がある場合は、Tapestryプロパティで注入することができます.
	<inject property=”myVisitobj” type=”state” object=”flowstore”/>

要素のType属性はここにstate状態オブジェクトが注入されていることを示し、Object属性はflowStoreという名前のVisitオブジェクトが注入されていることを示しています.
Globalオブジェクト
Globalオブジェクトは、グローバルなアプリケーションロジックとデータを格納するアプリケーション空間です.GlobalオブジェクトはVisitオブジェクトと同様に機能しますが、そのライフサイクルはアプリケーションの全サイクルです.Globalオブジェクトは、すべてのアプリケーションエンジンオブジェクトとセッションで共有されます.実際,Globalオブジェクトは最終的に最も1つのサーブレットContextの属性として格納される.Globalオブジェクトを指定しない場合、Tapestryはスレッド保護HashMapを使用して置き換えます.
TapestryはGlobalオブジェクトのタイプも知らないし、関心もない.TapestryフレームワークはGlobalオブジェクトのクラス定義に何の要求もなく、アプリケーションごとに独自のVisitクラスを定義できます.Tapestryプロパティ注入によって得られたHiveMindフレームワークが提供するGlobalオブジェクトでも、AbstractPageクラスのpublic Object getGlobal()メソッドによって得られたGlobalオブジェクトでも、Tapestryには特定のタイプは指定されていません.したがって、取得したGlobalオブジェクトを強制的にタイプ変換する必要があります.例:
MyGlobal global =(MyGlobal)getGlobal();
アプリケーション仕様ファイルで独自のGlobalオブジェクトクラスを任意に定義できます.
<meta key=”org.apache.tapestry.global-class” value=”com.tapestry4.engine.MyGlobal”/>
アプリケーションが起動され、サーブレットContextオブジェクトが作成されると、Tapestryはアプリケーション仕様のGlobalオブジェクトの構成情報を読み込み、Globalオブジェクトインスタンスを作成し、アプリケーションが閉じるまでサーブレットContextオブジェクトに格納します.
必要に応じて、アプリケーションのHivemindプロファイルhivemoduleでのみ、HivemindフレームワークでGlobalオブジェクトを作成できます.xmlでは以下のように構成します.
<contribution configuration-id=”tapestry.state.applicationObject”>
	<state-object name=”flowstore” scope=”application”>
		<create-instance class=”com.tapestry.engine.FlowStore”/>
</state-object>
</contribution>
Hivemindフレームワークのstateステータスオブジェクトを作成します.名前はflowStore、ライフサイクルはアプリケーションです.この状態オブジェクトはcom,tapestry.Engine,FlowStoreクラスのインスタンス.
このflowStoreという名前のGlobalオブジェクトをページで取得する必要がある場合は、Tapestryプロパティで注入することができます.
<inject property=”myVisitObj” type=”state” object=”flowStore”/>
実際には、要素の使用方法については、TapestryプロパティにVisitオブジェクトを注入することとGlobalオブジェクトを注入することには何の違いもありません.重要なのは、この注入されたオブジェクトインスタンス自体のライフサイクルがsessionなのかアプリケーションなのかです.
VisitオブジェクトでもGlobalオブジェクトでも、特定のオブジェクトクラスではなく、2つの異なるライフサイクルのオブジェクトを指すことに注意してください.構成されている限り、どのJavaクラスもVisitオブジェクトまたはGlobalオブジェクトになります.