struts 2和struts 1區別

       Sruts2從本質上來看源於Webwork,它同時具有Struts和Webwork的優點,並且使用了java1.5的註釋爲程序員提供了另外一種配置方案,雖然Struts2有許多優點,但它在使用上和Struts1.x有很大的不同。因此,要想從Stuts1.x跨越到Struts2,還需要進一步學習。因此要想從Struts1.x跨越到Struts2,還需要進一步學習。因此,本章全面介紹Struts 2的工作原理以及它與Struts 1.x的區別。Struts2雖然是在Struts 1的基礎上發展起來的,但實質上市以webWork爲核心,Struts 2爲傳統Struts 1注入了WebWork的設計理念,統一了Struts1和WebWork兩個框架,允許Struts1和WebWork開發者同時使用Struts 2框架。對於傳統的Struts 1.x開發者,Struts 2也提供了很好的向後兼容性,Struts 2可與Struts 1.x有機整合,從而保證Struts 1.x開發者能平穩過渡到Struts 2。

 

Action類:

Struts1.x:struts1.x 要求Action繼承一個抽象基類;Struts 1.x的一個具體問題是使用抽象類編程而不是接口。

Struts2.x:Struts2.x的Action類可以實現一個Action接口,也可以實現其他接口,聯同其他接口一起來實現可選擇和自定義的服務。Struts2.x提供一個名叫ActionSupport的基類來實現一般使用的接口。當然Action接口不是必須的,任何使用execute方法的POJO對象可以被當作Struts 2.x的Action對象來使用。

 

線程模型:

 

Struts1.x:struts1.x 的Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有請求,單例類策略造成了一定的限制,並且給開發帶來了額外開銷。Action資源必須是線程安全或者同步的。

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

 

可測試性:

 

Struts1.x:測試Struts 1.x的Action的一個主要問題是execute方法依賴於Servlet API,這使得Action的測試要依賴Web容器,爲了脫離Web容器測試Struts1.x的Action,必須藉助於第三方擴展,若Struts TestCase,提供了一套Struts1的模擬對象來進行測試。

Struts2.x:Struts 2.x的Action可以通過初始化、設置屬性、調用方法來測試。依賴注入的支持也使測試變得更簡單。

 

Servlet依賴:

Struts1.x:struts 1.x的Action類依賴於servlet API,但Action被調用時,以HttpServletRequest和HttpServletResponse作爲參數傳給execute方法.

Struts2.x:struts 2.x的Action不再依賴於Servlet API從而允許Action脫離Web容器運行,允許Action被獨立的測試。從而降低了測試Action的難度,當然,如果Action需要直接方法HttpServletRequest和HttpServletResponse參數,Struts 2.x的Action仍然可以訪問他們。一般情況下,Action都無需直接訪問HttpServletRequest和HttpServletResponse從而給開發者更多的靈活選擇。

 

封裝請求參數:

Struts1.x:struts 1.x使用ActionForm對象來捕獲輸入。像Action一樣,所有的ActionForm必須擴展基類。因爲其他的JavaBean不能作爲ActionForm使用,開發者經常創建多餘的類來捕獲輸入。DynamicBeans可以被用來作爲替代ActionForm的類來創建。但是,開發者可能是在重新描述已經存在的JavaBean。

Struts2.x:Struts2.x直接使用Action屬性作爲輸入屬性,消除了對第二輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過web頁面上的taglibs訪問。Struts2.x也支持ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種ModelDriven特性簡化了taglib對POJO輸入對象的引用。

 

表達式語言:

Struts1.x:Struts1.x整合了JSTL,因此可以使用JSTL表達式語言。這種表達式語言有基本對象圖遍歷,但在對集合和索引屬性的支持上很弱。

Struts2.x:Struts2.x可以使用JSTL,但它整合了一種更強大和靈活的表達式語言:OGNL(Object Graph Notation Language),因此Struts2.x下的表達式語言功能更加強大。

 

綁定值到視圖:

Struts1.x:struts1.x使用標準JSP機制來綁定對象到頁面上下文。

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

 

類型轉換:

Struts1.x:struts1.x的ActionForm屬性經常都是String。Struts1.x使用Commons-Beanutils來進行類型轉換。轉換每一個類,而不是爲每一個實例配置。

Struts2.x:struts2.x使用OGNL進行類型轉換,支持基本數據類型和常用對象之間的轉換.

 

數據校驗:

Struts1.x:struts1.x支持ActionForm重寫validate方法中手動校驗,或者通過Commons-Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。

Struts2.x:struts2.x支持通過重寫validate方法進行校驗,也支持整合XWork校驗框架進行校驗。

 

Action執行控制:

Struts1.x:Struts1.x支持每一個模塊有單獨的Request Processors(生命週期),但是模塊中的所有Action必須共享相同的聲明週期。

Struts2.x:struts2.x支持通過攔截器堆棧(Interceptor Stacks)爲沒一個Action創建不同的聲明週期。開發者可以根據需要創建相應堆棧,從而和不同的Action一起使用。

 

注:Struts2提供了與Strus1.x的兼容,當已經不是Struts1.x的升級。

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