Springでsessionスコープのオブジェクト

sessionやapplicationスコープのオブジェクトはSpringでも簡単に管理できる。
例えば、 applicationContext.xmlで次のように scopeで sessionを指定するだけ。

<bean id="sessionobj" class="tutorial.SessionObj" scope="session" 
     init-method="init">
</bean>

そして、参照したいActionにDIしてあげれば良い

<bean id="UserAction" class="tutorial.UserAction" scope="request">
   <property name="sessobj" ref="sessionobj"/>
</bean>

これで、ライフサイクルがsessionのオブジェクトを作ることができる。

このオブジェクトは session に id としてBeanのidが設定されているので
ognlからは次のように参照できる。

cntプロパティにアクセスするには

<s:property value="#session.sessionobj.cnt"/>

ただし、DIされているアクションがValueStackに積まれているのなら、下のように書いた方がスマート

<s:property value="sessobj.cnt"/>

以上でSpringでライフサイクルが管理されたオブジェクトとなる。

しかし、Struts2のScopeInterceptorと比較すると、Struts2ではtypeでstartやendを指定することで簡単に初期化や、破棄が行えるが、SpringではHttpSessionをごにょごにょ自分でやらないといけないので、Springの方が初期化や破棄が制御しにくいように感じられる。

というわけでフレームワークではScopeInterceptorの使用を推奨したい。