1. 程式人生 > >Struts1與Struts2的那些事

Struts1與Struts2的那些事

需求 ict cin data lap 升級 otto requires exec

一、概述

Struts1ActionServlet作為核心控制器,由ActionServlet負責攔截用戶的全部請求。Struts1框架有3個重要組成部分:ActionActionFormActionForward對象。

ActionForm必須實現ActionForm的基類,設計上並非真正的POJO

ActionForward就是一個邏輯視圖,通過在配置文件裏定義ActionFoward的映射,完畢邏輯視圖名和實際視圖資源之間的映射

Struts2核心控制器:FilterDispatcher

。它事實上並非一個陌生的Web框架,Struts2是以Webwork的設計思想為核心。吸收了Struts1的長處,因此。能夠覺得Struts2是Struts1和Webwork結合的產物。

由此可見Struts1Struts2有著藕斷絲連的關系,先從斷說起,Struts2並非Struts1的升級。它在實現原理和編程應用上與Struts1都全然不同。能夠說徹底拋棄了Struts1的框架。何為連?盡管WebWork在設計上確實要比struts1先進,但因為用戶習慣問題。所以非常難被普及,僅僅有掛羊頭賣狗肉才會被市場逐步接受,基於這些原因。WebWork開發團隊與Struts1開發團隊開始合作。借struts1之名。行WebWork之實,推出了Struts2。

通過以上對二者的簡單了解,主要從下面10點來說明他們之間有什麽差別:

二、對照

特征

Struts 1

Struts 2

Action類

Struts1的action須要去繼承一個抽象基類。一個普遍問題就是Struts1是面向抽象類編程來取代接口編程

Struts2的action能夠實現一個Action接口,也能夠同一時候實現一些其它的接口來添置一些附加的,經常使用的服務。Struts2提供一個基類ActionSupport實現了一些經常使用的接口。盡管Action接口不是必須的。不論什麽附帶execute方法的POJO對象都能夠作為Struts2的action對象。

線程模型

Struts1的action是單例的並且必須是線程安全的。由於該類會僅僅有唯一一個引用來為action處理全部的請求。單例策略會限制Struts1的action的功能以及須要擴展的額外的功能(The singleton strategy places restrictions on what can be done with Struts 1 Actions and requires extra care to develop)。

Struts1的action必須是線程安全的而且是同步的。

Struts2的Action對象是針對每個請求的,所以自然也就不存在線程安全問題了。

(實踐中。servlet容器給每個請求產生很多丟棄的對象,而且不會導致性能和垃圾回收問題)

Servlet的依賴

Struts1的Action依賴於Servlet API,由於當Action被調用的時候HttpServletRequest和HttpServletResponse對象是通過execute方法進行處理的。

Struts2的Action和容器的連接並不緊密。通常servlet上下文被描繪成簡單的Map映射。同意Action被單獨測試。當然,假設須要的話Struts2的Action也能夠通過訪問初始的request和response來完畢一些功能。

然而,其它的一些架構元素導致減少或者刪除了直接訪問request和response的需求。

易測試性

測試Struts1的Action有一個大障礙就是execute方法是直接暴露於servlet API的。

Struts2的Action能夠非常easy的通過設置屬性調用方法來進行測試。

當然依賴註入的支持也使得測試變得簡單。

輸入處理

Struts1使用一個ActionForm對象來獲取用戶的輸入。和action一樣。全部的ActionForm都必須繼承自一個基類。由於其它的javaBean不能被用作ActionForm,開發人員通常要寫一些多余的類來獲取用戶輸入。

DynaBean能夠被用做生成ActionForm類的一個選擇,可是開發人員須要對現有的javaBean進行重寫。

Struts2使用Action屬性作為輸入屬性,除掉了對於輸入對象的需求。

輸入屬性能夠是一個擁有他自己的屬性的對象。

Action屬性是通過標簽和web頁面交互。Struts2也支持ActionForm模型,就是POJO的Form對象和POJO的Action。

多數的對象類型。包含商業邏輯對象和領域對象都能夠作為輸入/輸入對象。模式驅動特征簡化了標簽和POJO輸入對象的關系。

表達式語言

Struts1和JSTL結合,所以他能夠使用JSTL的EL。

Struts2也支持JSTL,可是這個框架也支持更加強大的表達式語言OGNL.

表現層和類型值的綁定

Struts1使用標準的JSP機制將對象綁定到page context來進行訪問。

Struts2使用”ValueStack”技術,所以標簽不用將視圖和表現的對象結合就能夠得到值.ValueStack策略同意通過一系列可能具有同樣屬性名字可是不同屬性類型的的類型來完畢視圖的重用,

類型轉換

Struts1的ActionForm通常都是String類型。Struts1通過Commons-Beanutils實現類型轉換。

Struts2使用OGNL實現類型轉換,框架包括了對基礎和公共類型的轉換器。

驗證

Struts1支持通過ActionForm中的validate方法實現手工驗證。也能夠通過擴展通用的驗證框架進行驗證。對於同一個類能夠有不同的驗證。可是不能關聯到子對象的驗證。

Struts2也支持通過validate方法進行手工驗證以及Xwork驗證框架進行驗證。Xwork驗證框架支持將驗證鏈接到子屬性,子屬性使用了為屬性類型和驗證上下文定義的驗證。

Action運行的控制

Struts1支持為每個模塊分配請求處理(生命周期)。可是一個模塊中的全部Action必須分享同樣的生命周期。

Struts2支持通過攔截器棧為每一個Action創建不同的生命周期。通常對於不同的Action依據須要都要有相應的棧被創建和使用。

三、總結

通過以上對Struts1Struts2的對照。讓我們更明白了它們各自的優缺點。非常顯然Struts2是站在前輩的基礎上設計出來。它會改善和完好Struts1中的一些缺陷,Struts1中的一些懸而未決問題在Struts2得到了解決。可是struts1是老牌框架,應用非常廣泛。有非常好的群眾基礎,開發者比較好招。項目開發的風險小,成本更低。所以兩者的選用視情況而定。

Struts1與Struts2的那些事