1. 程式人生 > >struts2 Action生命周期

struts2 Action生命周期

created singleton marker blog bre 安全 repl 默認 運行

Struts2.0中的對象既然都是線程安全的,都不是單例模式,那麽它究竟何時創建,何時銷毀呢?

這個和struts2.0中的配置有關,我們來看struts.properties

技術分享### if specified, the default object factory can be overridden here
技術分享### Note: short-hand notation is supported in some cases, such as "spring"
技術分享### Alternatively, you can provide a com.opensymphony.xwork2.ObjectFactory subclass name here
技術分享
struts.objectFactory = spring


如果我們使用的是com.opensymphony.xwork2.ObjectFactory ,老實說,我也沒有研究過,xwork有一套像spring一樣的IOC機制,小巧而簡潔,有興趣的朋友可以去研究下。struts2.0中的Action默認就是使用這種工廠模式的,我們來看

技術分享 <action name="index" class="hdu.management.action.IndexAction">
技術分享 <result name="success">/input.jsp</result>
技術分享
<result name="testFTL" type="freemarker">/ftl/test.jsp</result>
技術分享 </action>


class屬性必須寫類的全名,通過這種方式配置後,action對象的生命周期到底怎麽樣,你就認命吧,反正你就記住xwork有一個對象池,它會自己分配的,應對每次客戶端的請求,它都會創建一個新的實例,至於這個實例何時銷毀,由XWORK來控制。


接下來,我們用spring來控制action的生命周期,關於action和spring的集成,我這裏就不累述了。

技術分享 <action name="index" class="index">
技術分享
<result name="success">/input.jsp</result>
技術分享 <result name="testFTL" type="freemarker">/ftl/test.jsp</result>
技術分享 </action>


這裏的class是spring配置文件中bean的id

我們來看看spring文檔中關於生命周期這個章節

Table 3.4. Bean scopes

ScopeDescription

singleton

Scopes a single bean definition to a single object instance per spring IoC Container.

prototype

Scopes a single bean definition to any number of object instances.

request

Scopes a single bean definition to the lifecycle of a single HTTP request; that is each and every HTTP request will have its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.

session

Scopes a single bean definition to the lifecycle of a HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.

global session

Scopes a single bean definition to the lifecycle of a global HTTP Session. Typically only valid when used in a portlet context. Only valid in the context of a web-aware Spring ApplicationContext.



是不是一目了然?

當然我們要使用request、session等,必須在web.xml中配置

技術分享<web-app>
技術分享 ...
技術分享 <listener>
技術分享 <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
技術分享 </listener>
技術分享 ...
技術分享</web-app>


準備好這些之後,我們來對request這個scope進行下測試

技術分享<beans>
技術分享
技術分享 <bean id="index" class="hdu.management.action.IndexAction"
技術分享 scope="request"
技術分享 destroy-method="destroy"
技術分享 init-method="init"/>
技術分享
技術分享</beans>


配置好後,發現每次刷新頁面,都會建立一個新的實例,運行完後就銷毀這個實例,這個效果和默認的是一樣的,只是我們這個運行完後會立即銷毀,而默認的不是立即銷毀,由xwork優化銷毀

如果設置為session,其實相當於ejb中的狀態bean,對於每個session來說用的都是同一個實例,當然,一旦把瀏覽器關閉,或者超時,對象就會銷亡。

struts2 Action生命周期