看看別人的總結:前4個缺點是致命的,
Action 類 |
在 Struts 里面,每一個 Action 類必需要繼承一個抽象的類 org.apache.struts.action.Action 。這個在 Java 編程中會引來一些問題,就是關于多種繼承的問題。 |
WebWork 的 Action 類僅需要實現接口 com.opensymphony.xwork.Action ,也可以實現其它的接口來實現更多的功能,譬如: validate (驗證), localware( 國際化 ) 等。當然,它也提供了一個類 ActionSupport 集成了上面的所有功能,我們在開發中可以根據需要選擇。 |
線程模型 |
Struts 的 Action 必需是 thread - safe 方式,它僅僅允許一個實例去處理所有的請求。所以 action 用到的所有的資源都必需統一同步,這個就引起了線程安全的問題。 |
在 WebWork 中,每個請求對應一個 Action ,因此沒有線程的安全問題。實際上 Servlet 容器對每個請求也產生多個對象,它也沒有證明對性能和垃圾回收產生太多的影響。 |
Servlet 的依賴 |
Struts 處理 Action 時必需要依賴 ServletRequest 和 ServletResponse ,所有它擺脫不了 Servlet 容器。 |
WebWork 的 Action 不用依賴 Web 層和其它的容器。它可以通過 ActionContext ,直接去訪問 Request 和 Response ,但這個是可選的,只有在必需的請求下使用。 |
測試 |
Struts 的每個 Action 都同 Web 層耦合在一起,這樣它的測試依賴于 Web 容器,單元測試也很難實現。不過有一個 Junit 的擴展工具 Struts TestCase 可以實現它的單元測試。 |
Webwork 的 action 能夠通過賦予一定的屬性,就可以執行單元測試。同時也可以使用一個 mock 的實例去測試,而不是通過啟動 web 容器來進行測試。 |
FormBean |
Struts 要求有 FormBean 對應每一個表單,而且 FormBean 必需繼承抽象類 ActionForm 。而使用 DynaBeans 實際上沒有太大的意義。不能夠很好的處理現有的模型。 |
Webwork 能夠動態的收集 web 的數據然后再賦值給 bean 。它也可以使用 FormBean 的形式, FormBean 可以是普通的 DTO 和域對象,它不用重新根據域對象來生成新的 FormBean ,也不需繼承抽象類 ActionForm 。 |
前端表達式語言 |
Struts 集成了 JSTL ,所以它主要使用 JSTL 的表達式語言來獲取數據。可是 JSTL 的表達式語言在 Collection 和索引屬性方面處理顯得很弱。 |
WebWork 的表達式語言使用了功能強大的 OGNL 。它使用 OGNL 建立一個 OgnlValueStack 來搜索數據。 Webwork 前端也可以使用 JSTL ,但它同時支持: velocity 、 freemaker 、 jspparer 、 xml 。 |
類型的轉換 |
Struts 的 FormBean 把所有的數據都作為 String 類型,它可以使用工具 Commons-Beanutils 進行類型轉化。但它的轉化都是在 Class 級別,而且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是非常困難的。 |
WebWork 使用 OGNL 進行類型轉化,提供了所有基本類型的轉化功能。類型轉化可以直接對一個 Class 進行( Class 級別)轉化,也可以對 Class 的字段進行類型轉化。它使用攔截器可以很容易的將類型轉化的錯誤信息返回給用戶,而且錯誤信息可以對應到一個相應的字段。 |
對 Action 執行前和后的處理 |
Struts 處理 Action 的時候是基于 class 的 hierarchies ,很難在 action 處理前和后進行操作。 |
Webwork2 允許您處理 Action 可以通過攔截器,就是在每一個 Action 處理前或者后進行其它操作。它的攔截器可以在配置文件中動態添加,這樣 Action 和攔截器之間完全解藕,更好的實現了組件化。 |
驗證處理 |
Struts 的驗證是調用 FormBean 的 validator() 方法,其實就是對 FormBean 的驗證。它一般使用框架 Commons Validation 進行數據驗證處理。它使用了一個全局的配置文件 validation.xml 定義了 FormBean 的驗證信息。 Struts 的 FormBean 屬性都被認為是 String 類型,所以它在驗證時也需要額外的類型轉化。 |
WebWork 使用 Xwork 的驗證框架進行驗證處理,它可以通過配置攔截器來激活。它可以為每個需要驗證的 Class 指定一個 xml 驗證文件,也可以為一個 Class 在不同的情況指定不同的 xml 驗證文件。 WebWork 證可以給每個 Action 類指定對應的驗證文件,也可以給 Action 的字段去指定驗證文件。通過攔截器來組裝 Action 和其驗證文件,使它們之間完全解藕。 |
對 Action 執行的控制 |
Struts 創建一個 Action ,如果想控制它的執行順序將會非常困難。甚至你要重新去寫 Servlet 來實現你的這個功能需求。 |
在這個方面, WebWork 的攔截器棧提供了強大的功能。 Action 的所有切面功能都有攔截器來實現(比如:取得 request 請求參數、驗證處理等),這樣你就可以用攔截器棧來組織攔截器的執行順序。例如:你需要在使用 request 請求參數來設置 Action 屬性之前,使用 IoC 框架設置 Action 的屬性,反之已然。這時,你就可以為 package 或 Action 指定一個攔截器棧來實現。 |
?
?
?
WebWork
的項目資源
下面是我在研究 WebWork 時,使用的資源和研究過的項目,希望能對你能有幫助。
1、? 當然就是 WebWork 的官方網站: http://www.opensymphony.com/webwork/
里面有最新的 WebWork 文檔和它的一個 wiki
2、? 一本好書: Java Open Source Programming : with XDoclet, JUnit, WebWork, Hibernate ,里面有很好的 WebWork 教程。它附帶的源代碼可以去 http://www.amazon.com/ 下載,里面的 petsoar 是一個非常好的 WebWork 開源項目。
3、? Confluence ( http://www.atlassian.com/software/confluence )是專業的 J2EE wiki, 用于知識管理和項目組交流。它使用的架構是 webwork2+Spring+Hibernate 。 Confluence 雖是商業軟件,不過對于 OpenSource 的項目它全部免費提供。它的架構思想很值得我們去學習。
4、? OpenReports(http://www.opensourcesoft.net) 是一個開源的項目,基于 Web 的報表系統。它用到的技術有: WebWork 2.0 、 Velocity 和 Hibernate 。
參考資料
?