(總結)Struts1和Struts2的區別


以前學的時候我們就是直接接觸struts2,也沒太關心這個struts1,正好我們公司用的是struts1,上網看過很多寫這方面的博文的,寫的也都很好、講解的很詳細、但是各有各的優點、我就總結了一下拿出來給大家分享,如果不對的我也很喜歡大家提出來我們共同進步!


重點的就這幾條吧:

1) 在Action實現類方面的對比:Struts 1要求Action類繼承一個抽象基類;Struts 1的一個具體問題是使用抽象類編程而不是接口。Struts 2 Action類可以實現一個Action接口,也可以實現其他接口,使可選和定製的服務成爲可能。Struts 2提供一個ActionSupport基類去實現常用的接口。即使Action接口不是必須實現的,只有一個包含execute方法的POJO類都可以用作Struts 2的Action。 
2) 線程模式方面的對比:Struts 1 Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有的請求。單例策略限制了Struts 1 Action能做的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的;Struts 2 Action對象爲每一個請求產生一個實例,因此沒有線程安全問題。 
3) Servlet依賴方面的對比:Struts 1 Action依賴於Servlet API,因爲Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。Struts 2 Action不再依賴於Servlet API,從而允許Action脫離Web容器運行,從而降低了測試Action的難度。 當然,如果Action需要直接訪問HttpServletRequest和HttpServletResponse參數,Struts 2 Action仍然可以訪問它們。但是,大部分時候,Action都無需直接訪問HttpServetRequest和HttpServletResponse,從而給開發者更多靈活的選擇。 
4) 可測性方面的對比:測試Struts 1 Action的一個主要問題是execute方法依賴於Servlet API,這使得Action的測試要依賴於Web容器。爲了脫離Web容器測試Struts 1的Action,必須藉助於第三方擴展:Struts TestCase,該擴展下包含了系列的Mock對象(模擬了HttpServetRequest和HttpServletResponse對象),從而可以脫離Web容器測試Struts 1的Action類。Struts 2 Action可以通過初始化、設置屬性、調用方法來測試。 
5) 封裝請求參數的對比:Struts 1使用ActionForm對象封裝用戶的請求參數,所有的ActionForm必須繼承一個基類:ActionForm。普通的JavaBean不能用作ActionForm,因此,開發者必須創建大量的ActionForm類封裝用戶請求參數。雖然Struts 1提供了動態ActionForm來簡化ActionForm的開發,但依然需要在配置文件中定義ActionForm;Struts 2直接使用Action屬性來封裝用戶請求屬性,避免了開發者需要大量開發ActionForm類的煩瑣,實際上,這些屬性還可以是包含子屬性的Rich對象類型。如果開發者依然懷念Struts 1 ActionForm的模式,Struts 2提供了ModelDriven模式,可以讓開發者使用單獨的Model對象來封裝用戶請求參數,但該Model對象無需繼承任何Struts 2基類,是一個POJO,從而降低了代碼污染。 
6) 表達式語言方面的對比:Struts 1整合了JSTL,因此可以使用JSTL表達式語言。這種表達式語言有基本對象圖遍歷,但在對集合和索引屬性的支持上則功能不強;Struts 2可以使用JSTL,但它整合了一種更強大和靈活的表達式語言:OGNL(Object Graph Notation Language),因此,Struts 2下的表達式語言功能更加強大。 
7) — 綁定值到視圖的對比:Struts 1使用標準JSP機制把對象綁定到視圖頁面;Struts 2使用“ValueStack”技術,使標籤庫能夠訪問值,而不需要把對象和視圖頁面綁定在一起。 
8) 類型轉換的對比:Struts 1 ActionForm 屬性通常都是String類型。Struts 1使用Commons-Beanutils進行類型轉換,每個類一個轉換器,轉換器是不可配置的;Struts 2使用OGNL進行類型轉換,支持基本數據類型和常用對象之間的轉換。 
9) 數據校驗的對比:Struts 1支持在ActionForm重寫validate方法中手動校驗,或者通過整合Commons alidator框架來完成數據校驗。Struts 2支持通過重寫validate方法進行校驗,也支持整合XWork校驗框架進行校驗。 
10) Action執行控制的對比:Struts 1支持每一個模塊對應一個請求處理(即生命週期的概念),但是模塊中的所有Action必須共享相同的生命週期。Struts 2支持通過攔截器堆棧(Interceptor Stacks)爲每一個Action創建不同的生命週期。開發者可以根據需要創建相應堆棧,從而和不同的Action一起使用。 
11) 捕獲輸入:Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因爲其他JavaBean不能用作ActionForm,開發者經常創建多餘的類捕獲輸入。動態Bean(DynaBeans)可以作爲創建傳統ActionForm的選擇,但是,開發者可能是在重新描述(創建)已經存在的JavaBean(仍然會導致有冗餘的javabean)。Struts 2直接使用Action屬性作爲輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過 web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種 ModelDriven 特性簡化了taglib對POJO輸入對象的引用。


Struts的第一個版本是在2001年5月份發佈的。它的最初設想是通過結合JSP和Servlet,使Web應用的視圖和業務/應用邏輯得以清晰地分離開來。在Struts之前,最常見的做法是在JSP中加入業務和應用邏輯,或者在Servlet中通過println()來生成視圖。

自從第一版發佈以來,Struts實際上已成爲業界公認的Web應用標準。它的炙手可熱也爲自己帶來了改進和變更,所以不但要跟上對Web應用框架不斷變化的需求,而且要與日漸增多競爭激烈的衆多框架的特性相融合。到最後,產生了幾個下一代Struts的解決方案。其中兩個最受矚目的方案是Shale和Struts Ti。

Shale是一個基於構件的框架,並在最近成爲Apache的頂級項目。而Struts Ti則是在Struts的成功經驗基礎上繼續堅持對前端控制器(Front Controller)和MVC(model-view-controller)模式進行改進。WebWork項目是在2002年3月發佈的,它對Struts式框架進行了革命性改進,引進了不少新的思想、概念和功能,但和原Struts代碼並不兼容。WebWork是一個成熟的框架,經過了好幾次重大的改進與發佈。在2005年12月,WebWork與Struts Ti宣佈合併。與此同時,Struts Ti改名爲Struts Action Framework 2.0,成爲Struts真正的繼承者。最後要注意的是,並不是說Struts或WebWork項目已經停止開發了。由於人們對這兩個項目的興趣仍然很高,而且也有很多開發者仍然願意使用它們,因此這兩個項目還在繼續開發中,繼續修復Bug,改進功能和繼續添加新功能。

攔截器 Interceptor(以下譯爲攔截器),在AOP(Aspect-Oriented Programming)中用於在某個方法或字段被訪問之前,進行攔截然後在之前或之後加入某些操作。

攔截是AOP的一種實現策略。在Webwork的中文文檔的解釋爲——攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行。同時也提供了一種可以提取action中可重用的部分的方式。Struts1.x的標準框架中不提供任何形式的攔截器,雖一個名爲SAIF的附加項目則實現了這樣的功能,但它的適用的範圍還很有限。

攔截器是Struts2的一個強有力的工具,有許多功能(feature)都是構建於它之上,如國際化、轉換器,校驗等。談到攔截器,還有一個流行的詞——攔截器鏈(Interceptor Chain,在Struts2中稱爲攔截器棧Interceptor Stack)。

攔截器鏈就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。

Struts 2的攔截器實現相對比較簡單。當請求到達Struts2的ServletDispatcher時,Struts 2會查找配置文件,並根據其配置實例化相對的攔截器對象,然後串成一個列表(list),最後一一地調用列表中的攔截器,Struts 2已經提供豐富多樣功能齊全的攔截器實現。

Struts2是WebWork的升級,而不是Struts 1.x的升級。雖然Struts 2提供了與Struts1.x的兼容,但已經不是Struts1.x的升級。對於已有Struts1.x開發經驗的開發者而言,Struts1.x的開發 經驗對於Struts2並沒有太大的幫助;相反,對於已經有WebWork開發經驗的開發者而言,WebWork的開發經驗對Struts2的開發將有很 好的借鑑意義。


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