Struts1與Struts2的那些事

一、概述

        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可以很容易的通過設置屬性調用方法來進行測試。當然依賴注入的支持也使得測試變得簡單。

輸入處理

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是老牌框架,應用很廣泛,有很好的羣衆基礎,開發人員比較好招,項目開發的風險小,成本更低!所以兩者的選用視情況而定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章