




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、13.4 Struts2.0 攔截器1截攔器的作用和意義1截攔器的定義與配置2默認截攔器分析34截攔器棧5截攔器示例-訪問控制23.4.1 攔截器的作用和意義截攔器是Struts2中最重要的概念之一,Struts中有80%的功能都通過截攔器實現.截攔器意義:提高更高層次的解耦,無須侵入框架本身便可以添加新的功能.截攔器是AOP的一種實現,底層通過動態代理模式完成3.4.1 攔截器的作用和意義攔截器的優點:簡化Action的實現,攔截器能把很多功能從Action中獨立出來,大量減少了Action的代碼。通用代碼模塊化,從Action中把功能分離出來,放到攔截器去實現,這樣能把一些在多個Actio
2、n中通用的代碼進行模塊化,封裝在一個或幾個攔截器里面。提高重用性,當通用的功能代碼被封裝在攔截器里面,實現了代碼模塊化過后,就可以對不同的Action,根據功能需要,來配置相同的攔截器了。實現AOP,Struts2通過攔截器實現了AOP(面向切面編程)。43.4.1 攔截器的作用和意義Struts截攔器與Action的關系 攔截器(Interceptor)是Struts2最強大的特性之一,它是一種可以讓你在Action執行之前和Result執行之后進行一些功能處理的機制。 將一些功能放到截攔器,可以降低Action的復雜性,提高重用性.截攔器的典型使用封裝請求參數文件上傳異常處理.3.4.2
3、攔截器的定義與配置什么是攔截器 (Interceptor) 在Struts 2文檔中對攔截器的解釋為攔截器是動態攔截Action調用的對象。攔截器是動態攔截Action調用的對象。它提供了一種機制 可以使開發者可以定義在一個Action執行的前后執行一個特定的功能模塊,同時也提供了一種可以提取Action中可重用的部分的方式。攔截器是Struts 2的核心組成部分。很多功能(feature)都是構建在攔截器基礎之上的,例如文件的上傳和下載、國際化、轉換器和數據校驗等,Struts 2利用內建的攔截器,完成了框架內的大部分操作3.4.2 攔截器的定義與配置官方給出的Struts2系統架構圖中關于
4、攔截器的部分:這個圖清晰的描述出了攔截器的運行地位,就是用來負責在Action執行之前和Result執行之后處理一些功能的類。也就是說,上圖示意了有3個攔截器的類,分別是Interceptor1、Interceptor2、Interceptor3,它們分別執行不同的功能處理,而運行的時機就是在Action執行之前和Result執行之后。3.4.2 攔截器的定義與配置3.4.2 攔截器的定義與配置3.4.2 攔截器的定義與配置攔截器的實現原理 Struts 2的攔截器實現相對簡單。當請求到達Struts 2的ServletDispatcher時,Struts 2會查找配置文件,并根據其配置實例化
5、相對的攔截器對象,然后串成一個列表(list),最后一個一個地調用列表中的攔截器。3.4.2 攔截器的定義與配置Action執行命令Action攔截器(1)攔截器(2)攔截器(3)攔截器(.)執行返回攔截器鏈攔截器的工作原理如下圖3.4.2 攔截器的定義與配置3.4.2 攔截器的定義與配置要點如果Action配置了多個截攔器,截攔器的執行順序與配置順序相同截攔器可以注入屬性值,在struts.xml文件中通過value實現,作用于interceptor或interceptor-ref.通過intercept的返回值,可以改變請求的流程控制(*).一般來說, invocation.invoke(
6、)方法總是要調用的. 因為Action定義了截攔器,所以默認截攔器將失效.如果要用到默認截攔器提供的功能,必須顯示配置在Action中.3.4.2 攔截器的定義與配置方法過濾一般情況下,Action的任何一個方法執行時都會調用截攔器.通過繼承自MethodFilterInterceptor的截攔器可以指定哪些方法會執行截攔器,哪些不會.執行動作定義在String doIntercept(ActionInvocation invocation)方法中.excludeMethods:指定哪些方法不調用截攔器(黑名單)includeMethods:指定哪些方法會調用截攔器(白名單)如果include
7、Methods和excludeMethods沖突, includeMethods取勝.3.4.2 攔截器的定義與配置方法過濾示例/success.jspm1,m2m2注:m1方法不調用methodint截攔器,m2會調用截攔器3.4.2 攔截器的定義與配置要點如果不指定excludeMethods和includeMethods,則所有方法都會被截攔器截攔.如果方法在excludeMethods和includeMethods都配置了,則includeMethods取勝.如果需要過濾多個方法,方法名之間用逗號隔開.163.4.3 默認截攔器分析如果沒有為Action指定截攔器,則使用default
8、Stack作為默認截攔器下面的功能由默認截攔器提供請求參數封裝文件上傳類型轉換異常處理3.4.3 默認截攔器分析如果希望所有Action都被某個截攔器或截攔器棧截攔,可以使用指定默認截攔器如果Action顯示定義了截攔器,則默認截攔器失效,必須顯示指定默認截攔器.3.4.3 默認截攔器分析struts-default.xml概要說明struts-default.xml文件是struts2框架默認加載的配置文件。它定義struts2一些核心的bean和攔截器。 這些攔截器是以key-value對的形式配置在struts-default.xml中,其中name是攔截器名字,就是后面使用該攔截器的引
9、用點,value則指定攔截器的實現類 3.4.3 默認攔截器分析預定義的攔截器 Struts2中已經定義好的預定義攔截器。Struts2的預定義攔截器都定義在struts-default.xml文件的struts-default包內。1:params攔截器 這個攔截器是必不可少的,因為就是它把請求參數設置到相應的Action的屬性去的,并自動進行類型轉換。2:modelDriven攔截器 如果Action實現ModelDriven接口,它將getModel()取得的模型對象存入OgnlValueStack中。3.4.3 默認攔截器分析3:execption攔截器 在拋出異常的時候,這個攔截器起
10、作用。它是Struts2的錯誤處理機制()的基礎,任何應用都應該引用這個攔截器,而且引用的時候,最好把它放在第一位,讓它能捕獲所有的異常。7:validation攔截器 調用驗證框架讀取 *-validation.xml文件,并且應用在這些文件中聲明的校驗。3.4.4 自定義攔截器自定義的攔截器 所謂自定義的攔截器,就是由我們自己定義并實現的攔截器,而不是由Struts2定義好的攔截器。在Struts2中編寫攔截類,有如下二種方式:實現Interceptor此接口繼承AbstractInterceptor類(一般會選擇此種方式)3.4.4 自定義攔截器Interceptor此接口 在Strut
11、s2里面,要實現自定義的攔截器是非常簡單的,只要寫一個實現Interceptor接口的類就可以了。所有的攔截器都要實現erceptor.Interceptor接口,這個接口中定義如下:public interface Interceptor extends Serializable void destroy(); void init(); String intercept(ActionInvocation invocation) throws Exception; 方法的基本說明如下:init方法就類似于構造方法,用于初始化一些相關資源destory方法類似于析構方法,用于釋放資源interc
12、ept方法,就是攔截器執行的處理方法,我們要實現的功能主要就寫在這個方法里面。3.4.4 自定義攔截器截攔器是一個繼承自AbstractInterceptor抽象類或實現Interceptor接口的類,可以重寫的方法:public void init():執行初始化動作public void destroy():執行銷毀動作String intercept(ActionInvocation invocation):執行截攔動作參數invocation:包含了Action的引用, invocation.invoke()方法用于將控制權轉給下一個截攔器或者調用Action的execute()方法.
13、返回值為邏輯視圖AbstractInterceptor為init和destroy方法提供了默認實現.3.4.4 自定義攔截器編寫攔截器類無論選擇哪種方式創建攔截器,都需要對下述三個方法進行override。三個方法如下:void init();此方法在攔截器實例創建之后,intercept()方法被調用之前調用,用于初始化攔截器所需要資源。void destroy(); 該方法在攔截器實例清除之前調用,用于釋放在init()方法中分配的資源。該方法只執行一次。String intercept(ActionInvocation invocation) throws Exception; 該方法在
14、Action執行之前被調用,攔截器為Action提供的附加功能在該方 法中實現。利用invocation參數,可以獲取action執行的狀態。在intercept()方法中,如果要繼續執行后續部分,可以調用invocation.invoke()。對于intercept方法,再說明幾點: (1)在intercept方法中寫“invocation.invoke();”,這句話的意思是繼續運行攔截器后續的處理,如果這個攔截器后面還有攔截器,那么會繼續運行,一直到運行Action,然后執行Result。如果intercept方法中沒有寫“invocation.invoke();” 就不再繼續向后運行了
15、,換句話說,后續的攔截器和Action就不再執行了。而是在這里返回Result字符串,直接去進行Result處理了。(2)在“invocation.invoke();”這句話之前寫的功能,會在Action運行之前執行3.4.4 自定義攔截器(3)在“invocation.invoke();”這句話之后寫的功能,會在Result運行之后執行(4)intercept方法的返回值就是最終要返回的Result字符串,這個只是在前面沒有執行Result的時候才有效,也就是前面沒有“invocation.invoke();”這句話的時候,這個返回值就相當于是最終要返回的Result字符串,然后才執行相應的
16、Result處理。3.4.4 自定義攔截器定義攔截器類public class AroundInterceptor extends AbstractInterceptor public void init()System.out.println(“這是一個初始化方法”)public String intercept(ActionInvocation invocation) throws Exception String result=;System.out.println(我是在action的execute方法執行之前動作);result=invocation.invoke();System.
17、out.println(我是在action的execute方法執行之后動作);return result; public void destroy()System.out.println(“這是一個清理方法”)注意:在編寫攔截器時要注意,攔截器必順是無狀態的,換句話 說,在攔截器類中不應該有實例變量。這是因為struts2對每一個Action的請求使用的是同一個攔截器實例來處理,如果攔截器有狀態,在多線程并發情況下,攔截器的狀態將不可測。3.4.4 自定義攔截器配置攔截器配置攔截器 攔截器需要在struts.xml中進行配置才能為action提供服務。要為action配置引用攔截器,首先需要在
18、interceptors元素中使用interceptor元素定義攔截器,然后 在action中使用interceptor-ref元素指定引用的攔截器。Interceptor元素有兩個必需的屬性:name和class,前者指定攔截器的名字,后者指定攔截器的完整類名。 比如對如前面的攔截器,需要如下配置:3.4.4 自定義攔截器配置攔截器 /Timer.jsp 3.4.4 自定義攔截器配置攔截器配置攔截器 如果在一個action需要多個攔截器,需要如何配置?另外,對于多個攔截器之間的執行順序又是怎么樣啦? 對于上述問題有二個解決方法: 為一個Action配置多個攔截器 將多個攔截器配為一個攔截器棧,然后在action中引用3.4.4 自定義攔截器配置多個攔截器 /Timer.jsp 通過為action配置多個攔截器,注意攔截執行順序以在配置中出現的的先后順序執行3.4.4 自定義攔截器配置攔截器棧 !配置攔截器棧
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年西寧城市職業技術學院單招職業傾向性考試題庫及參考答案
- 2025年西南財經大學天府學院單招職業技能測試題庫及答案一套
- 透析園藝師考試知識網試題及答案
- 2025年襄陽科技職業學院單招職業技能考試題庫審定版
- 經理面試題目及答案大全
- 2025年西安明德理工學院單招綜合素質考試題庫1套
- 2025年西安海棠職業學院單招職業技能考試題庫新版
- 2025年西安信息職業大學單招職業傾向性考試題庫匯編
- 2025年西安交通工程學院單招職業適應性測試題庫含答案
- 2025年西南財經大學天府學院單招綜合素質考試題庫及答案一套
- 海底撈銷售凈利率分析報告
- 佛教協會學習管理制度
- 2023年司法鑒定科學研究院事業編制招聘14人筆試參考題庫(共500題)答案詳解版
- 《爺爺的爺爺哪里來》共讀指導設計
- 個人業績相關信息采集表
- 宣傳片專題片視頻拍攝方案(技術方案)
- 水準測量平差表(含公式可自動計算)
- 機電安裝工程危險源識別評價清單1-發網上
- 腫瘤療效評估新標準-mRECIST標準
- 全國普通高等學校招生統一考試(上海卷)考試手冊
- 260噸汽車吊地基承載力驗算
評論
0/150
提交評論