【Struts】:Struts1和Struts2的區別與聯絡

連江偉發表於2016-04-30

        之前的兩篇博文分別介紹了Struts1和Struts2這兩個框架的概念和簡單的使用流程,但是沒有對這個兩個框架之間的不同進行詳細的說明,接下來就來看看兩者到底有哪些不同的地方吧。

        區別一:Struts1的Action類必須要繼承Action,而Struts2的則可以不繼承

        在使用Struts1進行開發的時候,必須要繼承Struts1的抽象基類Action,並且要重寫抽象類的execute()方法,這就導致了其Action必須要依賴ServletAPI,因為每當訪問Action的時候,必須要呼叫execute方法,這就需要兩個引數request和response,這樣就造成了Struts1模式下的Action很難測試,必須要Servlet容器的支援才可以。

        而Struts2可以不繼承任何類或者介面,這就保證了Action類的獨立性,當然可以實現一個Action介面(在Struts2中Action是一個介面),也可以實現其他的介面,使得可選和定製服務成為了可能,Struts2提供了一個ActionSupport基類去實現常用的介面,但是Action介面不是必須的,任何有execute方法(沒有引數)的POJO物件都可以作為Struts2的Action物件去使用。這樣一來,Action就可以通過初始化、屬性設定、呼叫方法等進行測試,可測性大大的提高,同時消除了對Servlet API的依賴,使得Action無需依賴容器而可以單獨進行測試。

        區別二:Struts1是執行緒不安全的,而Struts2是執行緒安全的

        Struts1的Action是單例模式,在執行的時候,只有一個Action例項來處理所有的請求,單例模式的策略限制了Action的功能,因此我們在開發的過程中必須要保證Action資源是執行緒安全的或者同步的,否則會出現執行緒安全問題。

        而Struts2的Action是多例的,會為每一個請求建立一個例項,因此不存線上程安全問題。

        區別三:Struts1使用ActionForm接收表單資料,而Struts2直接讓Action來收集表單資料

        Struts1收集資料通常使用ActionForm,而ActionForm還需要繼承。使ActionFrom的複用率降低,如果專案非常大的話就會產生大量的ActionForm,這給維護工作帶了非常大的工作量,但是其好處是將資料的收集和控制進行了很好的分離。

        Struts2在收集表單資料方面可採用的方式就比較多了,可以直接讓Action來收集表單資料,但也可以採用類似於ActionForm的方式來收集資料,Struts2採用了ModelDriven的方式來支援類似Struts1的ActionForm方式,當然了Struts2也支援使用ActionForm的方式,因此Struts2更加的靈活

        區別四:Struts1和Struts2常用的表示式語言不同

        Struts1中我們通常使用JSTL表示式語言,這種標籤庫是整合在Struts1框架裡面的,因此多數人使用JSTL EL表示式去操作頁面的資料,這種EL支援基本物件的圖遍歷,但是對集合和索引屬性的支援就比較弱了。

        而Struts2既可以使用JSTL,但是增加了更加強大和靈活的表示式語言——“Object Graph Notation Language”(OGNL),它通過簡單一致的表示式語法,可以存取物件的任意屬性,呼叫物件的方法,遍歷整個物件的結構圖,實現欄位型別轉化等功能。因此Struts2將OGNL作為了預設的表示式語言。

        區別五:兩者的型別轉換不同

        Struts1中對ActionForm的型別轉換採用commons-beanutils工具,而定義一個轉換器,將會對所有的ActionForm起作用,因此無法針對某一個ActionForm來配置是否使用該型別的轉換器。

        Struts2則使用OGNL進行型別轉換,功能更加強大,可以實現針對不同的型別進行不同的配置,並且提供了基本和常用物件的轉換器,無需我們自己寫。

        區別六:校驗方式不同

        Struts1採用覆蓋ActionFrom中的validate()方法或者採用驗證框架commonsvalidator進行驗證

        而Struts2支援使用覆蓋validate()方法來完成驗證,同時也支援使用XWork驗證框架進行驗證

        區別七:後臺向頁面傳值技術不同

        Struts1使用標準的JSP機制把物件繫結到頁面中去,而Struts2則引入了“ValueStack”技術,這樣就可以使用tiglib去訪問值,不用去把物件和頁面繫結起來。

        區別八:Action的執行控制不同

        Struts1支援一個模組一個單獨的RequestProcessors(生命週期),但是模組中的所有Action必須共享相同的生命週期。

        Struts2則引入了攔截器機制,有了攔截器棧的概念(Interceptor Stacks),通過攔截器棧可以為每一個Action配置不同的生命週期,這樣一來能夠根據需求提供不同的方案,更加靈活方便了。

        小結一下:

Struts2仍然是一個基於請求驅動的MVC框架,但是並不是Struts1的升級版,從上面可以看出Struts2與Struts1的體系結構差異非常大。相反,Struts2採用了另一個優秀的MVC框架WebWork的核心設計,因此Struts2是WebWork的一個升級版,雖然相容Struts1,但是大家要清楚它並不是Struts1的升級版。

相關文章