天天看點

Struts2重新學習2之struts2和struts1的差別

1) 在Action實作類方面的對比:Struts 1要求Action類繼承一個抽象基類;Struts 1的一個具體問題是使用抽象類程式設計而不是接口。Struts 2 Action類可以實作一個Action接口,也可以實作其他接口,使可選和定制的服務成為可能。Struts 2提供一個ActionSupport基類去實作常用的接口。即使Action接口不是必須實作的,隻有一個包含execute方法的POJO類都可以用 作Struts 2的Action。

2) 線程模式方面的對比:Struts 1

Action是單例模式并且必須是線程安全的,因為僅有Action的一個執行個體來處理所有的請求。單例政策限制了Struts 1

Action能做的事,并且要在開發時特别小心。Action資源必須是線程安全的或同步的;Struts 2

Action對象為每一個請求産生一個執行個體,是以沒有線程安全問題。

3) Servlet依賴方面的對比:Struts 1

Action依賴于Servlet API,因為Struts 1

Action的execute方法中有HttpServletRequest和HttpServletResponse方法。Struts 2

Action不再依賴于Servlet API,進而允許Action脫離Web容器運作,進而降低了測試Action的難度。

當然,如果Action需要直接通路HttpServletRequest和HttpServletResponse參數,Struts 2

Action仍然可以通路它們。但是,大部分時候,Action都無需直接通路HttpServetRequest和

HttpServletResponse,進而給開發者更多靈活的選擇。

4) 可測性方面的對比:測試Struts 1

Action的一個主要問題是execute方法依賴于Servlet

API,這使得Action的測試要依賴于Web容器。為了脫離Web容器測試Struts 1的Action,必須借助于第三方擴充:Struts

TestCase,該擴充下包含了系列的Mock對象(模拟了HttpServetRequest和HttpServletResponse對象),進而

可以脫離Web容器測試Struts 1的Action類。Struts 2 Action可以通過初始化、設定屬性、調用方法來測試。

5)

封裝請求參數的對比:Struts

1使用ActionForm對象封裝使用者的請求參數,所有的ActionForm必須繼承一個基類:ActionForm。普通的JavaBean不能用

作ActionForm,是以,開發者必須建立大量的ActionForm類封裝使用者請求參數。雖然Struts

1提供了動态ActionForm來簡化ActionForm的開發,但依然需要在配置檔案中定義ActionForm;Struts

2直接使用Action屬性來封裝使用者請求屬性,避免了開發者需要大量開發ActionForm類的煩瑣,實際上,這些屬性還可以是包含子屬性的Rich

對象類型。如果開發者依然懷念Struts 1 ActionForm的模式,Struts

2提供了ModelDriven模式,可以讓開發者使用單獨的Model對象來封裝使用者請求參數,但該Model對象無需繼承任何Struts

2基類,是一個POJO,進而降低了代碼污染。

6) 表達式語言方面的對比:Struts

1整合了JSTL,是以可以使用JSTL表達式語言。這種表達式語言有基本對象圖周遊,但在對集合和索引屬性的支援上則功能不強;Struts

2可以使用JSTL,但它整合了一種更強大和靈活的表達式語言:OGNL(Object Graph Notation

Language),是以,Struts 2下的表達式語言功能更加強大。

7) — 綁定值到視圖的對比:Struts 1使用标準JSP機制把對象綁定到視圖頁面;Struts 2使用“ValueStack”技術,使标簽庫能夠通路值,而不需要把對象和視圖頁面綁定在一起。

8)

類型轉換的對比:Struts 1 ActionForm 屬性通常都是String類型。Struts

1使用Commons-Beanutils進行類型轉換,每個類一個轉換器,轉換器是不可配置的;Struts

2使用OGNL進行類型轉換,支援基本資料類型和常用對象之間的轉換。

9) 資料校驗的對比:Struts

1支援在ActionForm重寫validate方法中手動校驗,或者通過整合Commons alidator架構來完成資料校驗。Struts

2支援通過重寫validate方法進行校驗,也支援整合XWork校驗架構進行校驗。

10) Action執行控制的對比:Struts

1支援每一個子產品對應一個請求處理(即生命周期的概念),但是子產品中的所有Action必須共享相同的生命周期。Struts

2支援通過攔截器堆棧(Interceptor

Stacks)為每一個Action建立不同的生命周期。開發者可以根據需要建立相應堆棧,進而和不同的Action一起使用。

11)

捕獲輸入:Struts1

使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發者經

常建立多餘的類捕獲輸入。動态Bean(DynaBeans)可以作為建立傳統ActionForm的選擇,但是,開發者可能是在重新描述(建立)已經存

在的JavaBean(仍然會導緻有備援的javabean)。Struts

2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過

web頁面上的taglibs通路。Struts2也支援ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種

ModelDriven 特性簡化了taglib對POJO輸入對象的引用。