struts2 Action生命周期
Struts2.0中的對象既然都是線程安全的,都不是單例模式,那麽它究竟何時創建,何時銷毀呢?
這個和struts2.0中的配置有關,我們來看struts.properties
### Note: short-hand notation is supported in some cases, such as "spring"
### Alternatively, you can provide a com.opensymphony.xwork2.ObjectFactory subclass name here
如果我們使用的是com.opensymphony.xwork2.ObjectFactory ,老實說,我也沒有研究過,xwork有一套像spring一樣的IOC機制,小巧而簡潔,有興趣的朋友可以去研究下。struts2.0中的Action默認就是使用這種工廠模式的,我們來看
<result name="success">/input.jsp</result>
</action>
class屬性必須寫類的全名,通過這種方式配置後,action對象的生命周期到底怎麽樣,你就認命吧,反正你就記住xwork有一個對象池,它會自己分配的,應對每次客戶端的請求,它都會創建一個新的實例,至於這個實例何時銷毀,由XWORK來控制。
接下來,我們用spring來控制action的生命周期,關於action和spring的集成,我這裏就不累述了。
<result name="testFTL" type="freemarker">/ftl/test.jsp</result>
</action>
這裏的class是spring配置文件中bean的id
我們來看看spring文檔中關於生命周期這個章節
Table 3.4. Bean scopes
Scope | Description |
---|---|
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 |
session |
Scopes a single bean definition to the lifecycle of a HTTP |
global session |
Scopes a single bean definition to the lifecycle of a global HTTP |
是不是一目了然?
當然我們要使用request、session等,必須在web.xml中配置
...
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
...
</web-app>
準備好這些之後,我們來對request這個scope進行下測試
<bean id="index" class="hdu.management.action.IndexAction"
scope="request"
destroy-method="destroy"
init-method="init"/>
</beans>
配置好後,發現每次刷新頁面,都會建立一個新的實例,運行完後就銷毀這個實例,這個效果和默認的是一樣的,只是我們這個運行完後會立即銷毀,而默認的不是立即銷毀,由xwork優化銷毀
如果設置為session,其實相當於ejb中的狀態bean,對於每個session來說用的都是同一個實例,當然,一旦把瀏覽器關閉,或者超時,對象就會銷亡。
struts2 Action生命周期