2009年1月5日 星期一

[Struts] Struts 1.x V.S. Struts 2.x

最近很意外的找到 RoseIndia 這個網站,裡面擁有很多的 tutorials,這篇網誌裡我將會討論在 RoseIndia 中的一篇文章:Struts 1.x Vs Struts 2.x

這篇文章中指出 10 點在 Struts 1.x 中的缺點,在 Struts 2.x 中解決的辦法。

1. Servlet Dependency

在 Struts 1.x 中,programmer 開發一個 Action 時,必須 override execute method,然而 execute method 的 parameter 卻與 HttpServletResponse, HttpServletRequest 物件有相依性,這樣造成 Action 的 execute method 就變得不單純!

反觀 Struts 2.x 中的 Action,我們只要有一個沒有任何 parameter 的 execute method 就可以成為一個 Action,也就是我們只要是一個 POJO(Plain Old Java Object)。這樣的 Action 相對於 Struts 1.x 的 Action 來說,的確是輕量(light-weight)了許多。當然,這樣當 Struts 2.x 的 Action 要使用一些 JSP 中的 Implicit Object (如:request, session 等) 就會比較不方便,其實不方便也倒是還好,為了降低物件之間的 coupling,這樣的不方便就值得了! 順帶一提,Struts 2.x 是採用 IoC 的方式解決這樣的問題。

2. Action classes

承上述中所提到的,Struts 1.x 中的 Action 必須 override execute method,因為 Struts 1.x 中的 Action 都必須 extends Action 這個 abstract class,這樣就造成了 programmer 無法寫出一個很單純的 Action,一旦物件有繼承的關係,這就造成此物件無形中的肥大!

Struts 2.x 中的 Action 是一個 POJO,也就是 programmer 不必去繼承或實作任何的 class 或 interfaces 就可以寫出一個 Action,這樣就讓 Action 物件相對的單純許多! 當然,如果你希望讓 Struts 2 提供更多服務給你所開發的 Action 物件,你可能就必須要實作一些必要的 interfaces,不過比起寄程來說,實作 interface 還是來的單純太多~

3. Validation

Struts 1.x 與 Struts 2.x 都有提供 validate method。不過,Struts 1.x 必須實作在 ActionForm 之上。

而 Struts 2.x 則是在 Action 中 implements Validatable interface 就可以,這當然比 Struts 1.x 的 ActionForm 來得輕量,畢竟繼承所造成的複雜度遠遠超過實作。

4. Threading Model

在 Struts 1.x 中,Action 一定是 thread-safe 或是 synchronized。也就是說 Action 一定是一個 Singleton。

Struts 2.x 則並非如此,每次有一個 request 進來,Struts 2.x 就會為每一個 request 所需求的 Action 初始化一個 instance。

5. Testability

在 Struts 1.x 中測試 Action 是很複雜的,因為 Action 的 execute() method 是帶有 parameter,而這些 parameters 都是 Container 物件~所以測試這樣的 Action 是比較困難的,不過還是有 StrutsTestCase for JUnit 這樣的測試 framework 提供 mock 物件。

由於 Struts 2.x 的 Action 的 execute() method 不帶任何的 parameters,所以在測試 business logic 是很簡單的,使用最原始的 JUnit 就能夠完成測試。

6. Harvesting Input

Struts 1.x 中採用 ActionForm 物件才取得使用者輸入的資料,這樣的 ActionForm 物件必須繼承 ActionForm class,而且不能使用 JavaBean 來代替,也就是 programmer 不可以使用 domain javabean 來取代,所以 programmer 必須重新撰寫一個一模一樣的物件來取得使用者的輸入資料。

在 Struts 2.x 中則不具有這樣的問題,因為 Action 物件本身就會負責取得使用者的輸入資料,而且 Action 物件屬於一個 POJO,使得 Action 物件單純許多,而且,我們還可以重複使用 domain javabean。

7. Expression Language

Struts 1.x 中只有整合 JSP 中提供的 JSTL 與 EL,然而,JSTL 與 EL 只有基本的 object navigator 功能,對於 collection-basec 與 index-based 的物件支援卻很少。

然而,Struts 2.x 中採用了 OGNL 來執行 object navigator,OGNL 對於 collection-based 與 index-based 物件支援很高,並且提供強大的 convertor將 String-based 的 HTTP 資料轉換成 Java type object。

8. Binding values into views

在 Struts 1.x 中採用標準的 JSP 資料儲存機制(也就是 page,request, session, application)。

在 Struts 2.x 中則進一步將這些 JSP 資料儲存機制放置於更高層的 ActionContext,並且提供 ValueStack 來存放 view 中所需要的資料。

9. Type Conversion

Struts 1.x 中的 ActionForm 物件的變數,通常都是以 String 為主,這是因為 HTTP 的資料都是以 String 為主要型態,programmer 必須自行使用 Commons 的 BeanUtils 來進行型態的轉換。

由於 Struts 2.x 中引進了 OGNL 的技術,使得資料型態的轉換皆由 OGNL 來處理,並且支援複雜物件的資料型態轉換。

10. Control of Action Execution

Struts 1.x 中針對每一個 module 的 Action 提供不同的 Request Processor。但是在同一個 module 中的所有 Actions 則是使用同一個 Request Processor。

而 Struts 2.x 中可以針對每一個 Action 提供不同的 interceptor stack,如此可以讓同一個 Action 在不同情況下使用圖一樣的 interceptor stack,進行使得 Action 有不一樣的 life cycle。

沒有留言: