Struts 2
簡介:
Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合并的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構差別巨大。Struts 2以WebWork為核心,采用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts 2可以理解為WebWork的更新產品。雖然從Struts 1到Struts 2有著太大的變化,但是相對于WebWork,Struts 2的變化很小。
優點:
架構簡單——易于擴展
標記庫很容易利用FreeMarker或者Velocity來定制
基于控制器或者基于頁面的導航
缺點:
文檔組織得很差
對新特征過分關注
通過Google搜索到的大多是Struts 1.x的文檔
Struts2對Struts1對比:
Struts2對Struts1進行了巨大的改進。主要表現在如下幾個方面:
在Action的實現方面
Struts1要求必須統一擴展自Action類,而Struts2中可以是一個POJO。
線程模型方面
Struts1的Action是單實例的,一個Action的實例處理所有的請求。Struts2的Action是一個請求對應一個實例(每次請求時都新new出一個對象),沒有線程安全方面的問題。
Servlet依賴方面
Struts1的Action依賴于Servlet API,比如Action的execute方法的參數就包括request和response對象。這使程序難于測試。Struts2中的Action不再依賴于Servlet API,有利于測試,并且實現TDD。
封裝請求參數
Struts1中強制使用ActionForm對象封裝請求的參數。Struts2可以選擇使用POJO類來封裝請求的參數,或者直接使用Action的屬性。
表達式語言方面
Struts1中整合了EL,但是EL對集合和索引的支持不強,Struts2整合了OGNL(Object Graph NavigationLanguage)。
綁定值到視圖技術
Struts1使用標準的jsp,Struts2使用“ValueStack”技術。
類型轉換
Struts1中的ActionForm基本使用String類型的屬性。Struts2中使用OGNL進行轉換,可以更方便的使用。
Struts1中支持覆蓋validate方法或者使用Validator框架。Struts2支持重寫validate方法或者使用XWork的驗證框架。
Action執行控制的對比
Struts1支持每一個模塊對應一個請求處理,但是模塊中的所有Action必須共享相同的生命周期。Struts2支持通過攔截器堆棧為每一個Action創建不同的生命周期。
攔截器的應用
攔截器,在AOP(aspect-Oriented PRogramming)中用于在某個方法或字段被訪問之前,進行攔截然后在之前或之后加入某些操作。攔截是AOP的一種實現策略。
在Webwork的中文文檔的解釋為——攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前后執行的代碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提取action中可重用的部分的方式。
談到攔截器,還有一個詞大家應該知道——攔截器鏈(Interceptor Chain,在Struts 2中稱為攔截器棧Interceptor Stack)。攔截器鏈就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。
1.攔截器的實現原理:
大部分時候,攔截器方法都是通過代理的方式來調用的。Struts 2的攔截器實現相對簡單。當請求到達Struts 2的ServletDispatcher時,Struts 2會查找配置文件,并根據其配置實例化相對的攔截器對象,然后串成一個列表(list),最后一個一個地調用列表中的攔截器。
2.攔截器的配置
Struts 2已經為您提供豐富多樣的,功能齊全的攔截器實現。大家可以至struts2的jar包內的struts-default.xml查看關于默認的攔截器與攔截器鏈的配置。
在struts.xml文件中定義攔截器,攔截器棧:
<package name="my" extends="struts-default" namespace="/manage">
<interceptors>
<!-- 定義攔截器 -->
<interceptor name="攔截器名" class="攔截器實現類"/>
<!-- 定義攔截器棧 -->
<interceptor-stack name="攔截器棧名">
<interceptor-ref name="攔截器一"/>
<interceptor-ref name="攔截器二"/>
</interceptor-stack>
</interceptors>
......
</package>
新聞熱點
疑難解答