何為struts2?
先看一個圖:
這個圖很明確的說明了struts2的由來,它是由webwork和struts相結合的結果,因此它不僅僅事struts1的改進版本了,而是一個完全很新的東西。Struts2網站上有這樣一段話:
Apache Struts 2 is an elegant, extensible framework for creating enterprise-ready Java web applications. The framework
is designed to streamline the full development cycle, from building, to
deploying, to maintaining applications over time.
Apache Struts 2 was originally known as WebWork 2. After working
independently for several years, the WebWork and Struts communities joined
forces to create Struts2. This new version of Struts is simpler to
use and closer to how Struts was always meant to be.
大體的意思就是:Apache的Struts 2的是一個優雅,可擴充的架構 用於建立企業級Java Web應用程式。 該架構旨在簡化整個開發週期,從建設,部署以及其他任何時間。
Apache的Struts 2的原名WebWork 2。 數年之後,WebWork和Struts的社區的聯手建立Struts 2 。 這個新版本的Struts是簡單的使用,更貼近我們想要的。
現在我們知道了,struts2是以webwork為核心的,所以和struts1沒有太大關係除了名字相似以外。
那麼struts2和struts1到底有哪些不同,網上有很多,我找了幾個明顯的,當然這不是我寫的,是我在網上找的分析的比較好的:
Action 類:
• Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類別編程而不是介面。
• Struts 2 Action類可以實現一個Action介面,也可實現其他介面,使可選和定製的服務成為可能。Struts2提供一個ActionSupport基類去 實現 常用的介面。Action介面不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。
線程模式:
• Struts1 Action是單例模式並且必須是安全執行緒的,因為僅有Action的一個執行個體來處理所有的請求。單例策略限制了Struts1 Action能作的事,並且要在開發時特別小心。Action資源必須是安全執行緒的或同步的。
• Struts2 Action對象為每一個請求產生一個執行個體,因此沒有安全執行緒問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,並且不會導致效能和記憶體回收問題)
Servlet 依賴:
• Struts1 Action 依賴於Servlet API ,因為當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。
• Struts 2 Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接存取HttpServetRequest 和 HttpServletResponse的必要性。
可測性:
• 測試Struts1
Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴於容器)。一個第三方擴充--Struts TestCase--提供了一套Struts1的類比對象(來進行測試)。
• Struts 2 Action可以通過初始化、設定屬性、調用方法來測試,“依賴注入”支援也使測試更容易。
捕獲輸入:
• Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發人員經 常建立多餘的類捕獲輸入。動態Bean(DynaBeans)可以作為建立傳統ActionForm的選擇,但是,開發人員可能是在重新描述(建立)已經存 在的JavaBean(仍然會導致有冗餘的javabean)。
• Struts 2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich物件類型。Action屬效能夠通過 web頁面上的taglibs訪問。Struts2也支援ActionForm模式。rich物件類型,包括業務對象,能夠用作輸入/輸出對象。這種
ModelDriven 特性簡化了taglib對POJO輸入對象的引用。
運算式語言:
• Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍曆,但是對集合和索引屬性的支援很弱。
• Struts2可以使用JSTL,但是也支援一個更強大和靈活的運算式語言--"Object Graph Notation Language"
(OGNL).
綁定值到頁面(view):
• Struts 1使用標準JSP機制把對象綁定到頁面中來訪問。
• Struts 2 使用 "ValueStack"技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。
類型轉換:
• Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個執行個體來說是不可配置的。
• Struts2 使用OGNL進行類型轉換。提供基本和常用對象的轉換器。
校正:
• Struts 1支援在ActionForm的validate方法中手動校正,或者通過Commons Validator的擴充來校正。同一個類可以有不同的校正內容,但不能校正子物件。
• Struts2支援通過validate方法和XWork校正架構來進行校正。XWork校正架構使用為屬性類類型定義的校正和內容校正,來支援chain校正子屬性
Action執行的控制:
• Struts1支援每一個模組有單獨的Request Processors(生命週期),但是模組中的所有Action必須共用相同的生命週期。
• Struts2支援通過攔截器堆棧(Interceptor Stacks)為每一個Action建立不同的生命週期。堆棧能夠根據需要和不同的Action一起使用。
知道了struts2
是什麼的東西後,下面開始真的學習struts2。