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の使用を推奨したい。