天天看點

【Struts2架構】第六節攔截器-攔截器介紹和總結

一.攔截器概念

strrurs攔截器是可插拔式的攔截器:如果我們要使用某個攔截器,隻需要在配置檔案中應用該攔截器即可。

struts攔截器由struts-default.xml,struts.xml等配置檔案中進行管理。

struts2中已經預設啟動了大量通用功能的攔截器(這些攔截器以name-class對的形式配置在struts-default.xml檔案中),隻要我們配置action的package繼承了struts-default包,這些攔截器就會起作用。

攔截器幾乎完成了sturts2架構70%的工作。

sturts2幾個常用内建攔截器的介紹:

1)conversation:這是一個處理類型轉換錯誤的攔截器,它負責将類型轉換錯誤從actioncontext中取出,并轉換成action的fielderror錯誤。

2)exception:這個攔截器負責處理異常,它将異常映射成結果。

3)fileupload:這個攔截器主要用于檔案上傳,它負責解析表單中檔案域的内容。

4)i18n:這是支援國際化的攔截器,它負責把所選的語言、區域放入使用者session中。

5)params:這是最基本的一個攔截器,它負責解析http請求中的參數,并将參數值設定成action對應的屬性值。

6)scope:這是範圍轉換攔截器,它可以将action狀态資訊儲存到httpsession範圍,或者儲存到servletcontext範圍内。

7)token:這個攔截器主要用于阻止重複送出,它檢查傳到action中的token,進而防止多次送出。

隻要我們定義的包繼承了struts-default包,就可以直接使用這些攔截器。

2.配置攔截器

1.定義一個攔截器

在strust.xml中定義:

2.定義攔截器的時候傳入參數:

3.定義攔截器棧:

(攔截器棧中也可以包含攔截器棧)

4.通過為<interceptor-ref.../>元素增加<para.../>子元素,就可以在使用攔截器的時候為參數指定值:

5.定義所有的攔截器:

在struts.xml中,把所有攔截器定義在

<interceptors></interceptor>中

6.使用攔截器

在action中配置攔截器的示例:

struts.xml:

上面的配置檔案的代碼一共使用了三個攔截器(棧),其中default是系統預設的攔截器。而mysimple和later就是使用者自定義的攔截器,是以在執行login之前,這三個攔截器都會起作用。注意的是,actionx顯式應用了某個攔截器,則預設的攔截器不會起作用;如果該action需要使用該預設攔截器,則必須手動配置攔截器的引用。是以這裡為了應用系統預設的攔截器defaultstack攔截器棧,我們在配置檔案中顯式地應用了預設攔截器。

7.配置預設攔截器

配置預設攔截器使用<default-interceptor-ref.../>元素,該元素作為<package.../>元素的子元素使用,為該包下的所有action配置預設的攔截器。要注意的是,隻有當action中沒有顯式應用攔截器時,該action所在的包的預設攔截器才會生效。配置例子:

8.實作攔截器類

如果使用者要開發攔截器類,應該實作com.opensymphony.xwork2.actioninvocation接口,該接口的類定義代碼如下:

其中init()方法,在攔截器執行攔截之前調用該方法。

destory方法,在攔截器執行個體被銷毀之前。

intercept(actioninvocation invocation)方法是使用者要實作的攔截動作。

stuts2還提供了一個abstractinterceptor類,該類提供了一個init和destory方法的空實作,如果我們實作的攔截器不需要打開資源,則可以無需實作這連個方法。可見,繼承abstractinterceptor類來實作自定義攔截器會更加簡單。

下面實作了一個簡單的攔截器:

當我們執行intercept(actioninvocation invocation)方法時,可以獲得actioninvocation參數,這個參數又可以獲得被攔截的action執行個體,一旦獲得了action執行個體,幾乎獲得了全部的控制權:可以實作将http請求中的參數解析出來,設定成action的屬性(這是系統param攔截器完成的事情);也可以直接将http請求中的httpservletrequest執行個體和httpservletresponse執行個體傳給action(這是servlet-config攔截器完成的事情)......當然,也可以實作應用相關的邏輯。

轉載請注明出處:http://blog.csdn.net/acmman/article/details/47086361