深入淺出,Struts1對比Struts2的缺點和比較


歡迎到我的個人域名博客:http://zhoulingyu.com


Action的構造:

1.     Struts1要求Action類繼承Action或者其他幾個基類。

2.     Struts2的Action類不需要繼承任何類,出於習慣可以繼承ActionSupport。

所以任何一個javabean都可以作爲Action,在寫起來時候沒有太多規範。理過程不再是控制死死的流程,而是通過AOP的方式將request和response進行處理。

依賴容器:

1.    Struts1基於M2開發,所以Action依賴Servlet,導致Struts1中的Action方法必須傳入HttpServletRequest和HttpServletResponse等4個參數。依賴Servlet導致依賴容器,因爲調用方法必須傳入參數,所有Struts1中Action不能單獨被測試。

2.     Struts2 Action不依賴於容器,允許Action脫離容器單獨被測試。在Struts2中需要Session和Request時,可以讓Action實現SessionAware和RequestAware接口,其實該接口只需要實現session和requeset的get,set方法,只要Action中有這兩個對象和getter,setter就可以直接獲得session和request。

IOC思想:

在獲取參數時

1.    Struts1 使用ActionForm對象捕獲輸入,這回使得結構非常的複雜,並且讓人覺得多此一舉(因爲你不但要使用ActionForm對象,還需要寫一個ActionForm,同時在xml對其配置)。或者使用session.getAttribute(),每次獲得一個參數需要使用大量的重複代碼,這樣導致了大量的代碼冗餘。最重要的是,struts1沒有將屬性當做對象來對待。

2.     Struts2在Action中加入需要的屬性,通過調用其getter,setter將頁面的參數傳入其中,最重要的事,它將頁面的屬性封裝好成爲對象,這裏用到的就是OGNL。大家或許注意到,在頁面中動態顯示的部分都是一個對象全部屬性或者是一個對象的部分屬性,比如登陸頁面,顯示(或者輸入)的是user對象的username和password屬性。這時候,直接將封裝成對象減少了大量的getAttribute,減少了代碼冗餘。

IOC或者說“依賴注入”的思想雖然由spring提出,但是在Struts2中已經可以體現,Action中的實體對象,就是通過注入的方式獲得。

面向切面(AOP):

1.    Struts1基於M2開發,沒有太優秀的抽象。

2.     Struts2中可以在源代碼中看到大量的Filter,這些大量的過濾器體現了Struts2的面向切面思想。

當然大家一定會說AOP也是Spring提出的,這裏可以感受到,好的編程思想其實一直在被優秀的程序員使用着,最後也會被人提出,我自己熱愛開源的原因就是在於開源可以向全世界分享最新,最好的思想技術。

表達式語言:

1.     Struts1整合了JSTL,因此使用JSTLEL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。

2.     Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言--"ObjectGraph Notation Language" (OGNL),同時具有一個強大的s:標籤庫。

舉個簡單例子在struts1中判斷標籤可以使用<c:if>但是沒有<c:else>而struts2中有<s:if><s:else>

視圖層的訪問:

1.    Struts 1使用標準JSP機制把對象綁定到頁面中來訪問。

2.     Struts2 使用"ValueStack"技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。

校驗:

1.    Struts 1支持在ActionForm的validate方法中手動校驗,或者通過CommonsValidator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。

2.    Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用爲屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性

線程問題:

1.    Struts1 Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有的請求。Action資源必須是線程安全的或同步的。

2.    Struts2 Action對象爲每一個請求產生一個實例,因此沒有線程安全問題。


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