比較內容 |
Struts |
WebWork2 |
Action 類 |
在Struts里面,每一個 Action Class都需要擴展org.apache.struts.action.Action;這個在Java編程中會引來一些問題,就是關于多種繼承的問題 |
Webwork僅僅需要implement com.opensymphony.xwork.Action Interface,您也可以implement其它的interface來實現更多的功能,譬如:validate(驗證),localware(國際化)等,當然 webwork2也提供了一個類ActionSupport 集成了以上功能。Developer可以根據需要實現不同的功能。 |
線程模型 |
Struts Actions必須是thread-safe方式,它僅僅允許一個實例去處理所有的請求。所以action用到的所有的資源都必須統一同步,這個就引起了線程安全的問題。 |
Webwork 2 actions每一個請求對應一個action,因此沒有線程的安全問題。實際上Servlet 容器對應每一個請求會產生許多Object,這種一個請求產生許多object的例子沒有證明對性能產生太多的影響。現在Web容器都是這么處理Servlet的。 |
Servlet的依賴 |
Struts處理一個Action時候必須要依賴ServletRequest and ServletResponse。所以這一層擺脫不了Server容器。而serveltRequest可能會被web層的Context使用。 |
Webwork2 每一個action不依賴任何層和任何容器。他們使用Request和response是通過ActionContext,所以這個對于邏輯層的分離是很重要的。 |
測試 |
因為Struts的每一個action都必須用到request和response所以都必須通過web層來進行測試。這就導致了許多測試struts都要通過web容器(盡管現在有許多測試方法cactus mock 等)。 |
Webwork的action能夠通過賦予一定的屬性。就可以執行。同時您可以使用一個mock的實例去測試,而不是通過啟動web容器來進行測試。 |
FormBean |
Struts 需要一個FormBeans針對每一個Form。而使用DynaBeans實際上沒有太大的意義。不能夠很好的處理現有的模型。 |
Webwork 能夠動態的收集web的數據然后在賦值給bean。同時它還能夠使用FormBean模式。Webwork2還允許現有的ModelDrvien進行導入處理。能夠處理它就像處理action自己的屬性一樣。 |
前端表達語言 |
Struts大部分使用的是JSTL EL(JSP2。0)去獲得數據的。在Collection上面處理顯得很弱。 |
Webwork前端可以使用JSTL同時也可以使用多種表現形式。譬如:velocity freemaker jspparer xml等等。Webwork2 利用ongl建立一個valuestack來搜集數據 |
類型的轉換 |
Struts FormBeans把所有的數據都作為string類型。得到一個自己需要的類型然后展示給用戶是很困難的。 |
Webwork2 數據都是轉換成Java中的類型。這個根據Form的類型自動轉換。然后操作這些bean十分方便。 |
對Action 執行前和后的處理 |
Struts處理action的時候是基于class的hierarchies,很難在action處理前和后進行操作。 |
Webwork2 允許您處理action可以通過interceptor,就是在每一個action處理前或者后進行其它操作。 |
驗證處理 |
因為struts的FormBean的屬性都被認為是string類型。許多類型的驗證都要進行類型轉換的處理。FormBean對一個驗證鏈的處理顯然不行。 |
而webwork2的驗證采用的是interceptor設計模式。它的這種驗證方式決定了它十分靈活。而且一個驗證可以重復不斷的使用僅僅需要一個XML文件的定義。實際上webwork2的驗證是采用了xwork的驗證框架。 |
Action的鏈的控制 |
Struts里面每一個action對應一個處理,如果一個action轉向另外一個action就很困難了。 |
Webwork使用一個強大的DispatcherChain去處理這個action鏈。很方便的從一個處理到另外一個處理。 |