struts2中Action單例和多例

struts2的action是多實例的,也就是每次請求產生一個Action對象。因爲:struts2的Action中包含數據,例如你在頁面填寫的數據就會包含在Action的成員變量裏面。如果Action是單實例的話,這些數據在多線程的環境下就會相互影響,例如造成別人填寫的數據被你看到了。而struts1的Action是單實例的,因爲他的數據保存在Form類中,多線程環境下,Action只負責處理一些邏輯,並沒有數據,也就是大家把它當做一個工具使用。同樣servlet也是單實例的。
項目採用了Struts2+Spring的裝配模式,Spring管理Struts2的Action自動設置爲單例。這樣Action的生命週期爲服務器的生命週期,也就是說不關閉服務器,Action一直存在,Action中的屬性也一直存在。
這種現象好處在於,分頁對象所需要的數據對象存在於Action中是不被銷燬的直到頁面重新對數據對象輸入查詢條件。
這樣做的缺點在於,一,兩個瀏覽器同時操作一個頁面,會在查詢等條件的保存上產生衝突,致使A瀏覽器的查詢條件影響到B瀏覽器的查詢結果;二,沒有良好設計的系統中,重用Action和多次利用Action的時候無法有效甄別數據的有效性。

因此思考是否可以通過一些辦法來解決此類問題。
辦法一:設置Action bean的生命週期爲Session,即每個瀏覽器的打開影響着一套Action的生命週期,解決不同用戶互相影響的問題;
(通常和spring整合使用的時候,在struts.xml文件要配置一個元素 或者在struts.property文件中配置 struts.objectFactory = spring 。。。可以在spring的配置文件中的bean元素裏用一個scope屬性來配置action是用什麼生命週期,singleton,prototype,request,session等等)
辦法二:通過設置過濾器或者攔截器,或者設置類中的單獨屬性,判斷查詢條件是否由理想對象傳來,如果不是則銷燬值對象,如果是則繼承值對象的查詢條件。
一些關於攔截器的資料:http://blog.csdn.net/feng_sundy/archive/2007/10/11/1820668.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章