上一篇文章中說道,Struts2不是Struts1的升級,它們之間並沒有什麼血緣的關係。那麼,它們兩者之間的區別到底是什麼?下面,且聽小編給您娓娓道來。
Action類
- Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口
- Struts2中,Action類可以實現一個Action接口,也可以實現其他接口使可選和定製的服務成爲可能。Struts2提供了一個ActionSupport基類去實現常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象
線程模式
- Struts1 Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有的請求,存在線程的安全性問題
- Struts2 Action對象爲每一個請求產生一個實例,是多實例的,在線程上沒有安全問題
Servlet依賴
- Struts1 Action依賴於Servlet API,因爲當一個Action被調用時,HttpServletRequest和HttpServletResponse被傳遞給execute方法
- Struts2 Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始化的Request和response。但是,其他的元素減少或者消除了直接訪問HttpServletRequest和HttpServletResponse的必要性
可測試性
- Struts1的Action測試性不好,由於Action依賴於Servlet API,所以需要容器支持
- Struts2的Action測試性好,因爲Struts2的Action是一個POJO對象,所以可以直接寫一個單元測試完成
ActionForm
- Struts1收集數據通常使用ActionForm,而ActionForm還需要繼承,使ActionForm的複用率降低。另外項目非常大會建立很多ActionForm給維護帶來工作量,但也有好處:數據的收集和控制進行了很好的分離。
- Struts2直接用Action來收集數據,也可以採用ActionForm。Struts2採用了ModelDriven的方式來支持類似的Struts1的ActionForm方式,比較靈活。
表達式語言
- Struts1整合了JSTL,這種EL有基本的對象遍歷,但是對集合和索引屬性的支持很弱。
- Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言——OGNL(Object Graph Notation Language)
綁定值到頁面(View)
- Struts1使用標準的JSP機制把對象綁定到頁面中來訪問
- Struts2使用“ValueStack”技術,使taglib能夠訪問而不需要把你的頁面和對象綁定起來。
類型轉換
- Struts1 ActionForm的類型轉換採用commons-beanutils工具,而定義完成一個轉換器,將對所有的ActionForm起作用,而不能針對某一ActionForm來配置是否使用此類型的轉換器
- Struts2使用OGNL進行類型轉換,功能更加強大,轉換過程可以針對某個類型進行配置
校驗
- Struts1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。
- Struts2支持通過validate方法和XWork校驗框架進行校驗。
Action執行控制
- Struts1支持每一個模塊有單獨的Request Processors(生命週期),但是模塊中的所有Action必須共享相同的生命週期
- Struts2支持通過攔截器堆棧爲每一個Action創建不同的生命週期。堆棧能夠根據需要和不同的Action一起使用