Struts 2 攔截器之攔截器的配置
攔截器體系是Struts 2框架的重要組成部分,我們可以把Struts 2理解成一個空容器,而大量的內建攔截器完成了該框架的大部分操作。</span> Struts 2攔截器是可插拔式的設計:如果我們需要使用某個攔截器,只需要在配置文件中應用該攔截器即可;如果不需要使用該攔截器,只需要在配置文件中取消應用攔截器。但是不管是否應用某個攔截器,對于Struts 2框架都不會有任何影響。
攔截器與Action的關系
以下主要講一些關于攔截器的配置
1、配置攔截器
在struts.xml文件中定義攔截器只需要為攔截器類指定一個攔截器名,就可以完成攔截器的定義。定義攔截器使用<interceptor.../>元素,如下:
<!-- 通過指定攔截器名和攔截器實現類來定義攔截器--> <interceptor name="攔截器名" class="攔截器實現類" />
如果還需要在配置攔截器時傳入攔截器參數。可以在<interceptor.../>元素中使用<param.../>子元素。如下:
<interceptor name="攔截器名" class="攔截器實現類"> <param name="參數名">參數值</param> ........ </interceptor>
2、配置攔截器棧
除了配置攔截器,還可以把多個攔截器連在一起組成攔截器棧。定義攔截器棧使用<interceptor-stack.../>元素,攔截器棧是由多個攔截器組成。因此需要在<interceptor-stack.../>元素中使用<interceptor-ref.../>元素來定義多個攔截器引用。
配置攔截器棧如下:
<interceptor-stack name="攔截器棧名"> <interceptor-ref name="攔截器名" /> <interceptor-ref name="攔截器名" /> ......... </interceptor-stack>
從上面的結構中可以看出,一個攔截器棧是由多個攔截器組成的。但是從程序功能上看,攔截器和攔截器棧是統一的,它們包含的方法都會在Action的execute方法執行之前執行。
由于攔截器棧和攔截器的功能幾乎完全相同,所以我們可以將攔截器棧當成一個更大的攔截器。
攔截器棧中也可以包含攔截器棧。
配置如下:
<interceptor-stack name="攔截器棧一"> <interceptor-ref name="攔截器一" /> <interceptor-ref name="攔截器二" /> ....... </interceptor-stack> <interceptor-stack name="攔截器棧二"> <interceptor-ref name="攔截器三" /> <interceptor-ref name="攔截器棧一" /> ....... </interceptor-stack>
在上面的配置片段中,第二個攔截器棧包含了第一個攔截器棧,其實質的情況就是攔截器棧二由三個攔截器組成:攔截器一、攔截器二、攔截器三。
系統為攔截器指定參數有如下兩個時機:
1、定義攔截器時指定參數值:這種參數值將作為攔截器參數的默認參數值。
2、使用攔截器時指定參數值:在配置Action時為攔截器參數指定值。
下面是在配置攔截器棧時為攔截器動態指定參數值:
<interceoptor-stack name="攔截器棧一"> <interceptor-ref name="攔截器一" /> <!-- 為攔截器分別定義了兩個參數值--> <param name="參數一">參數值</param> <param name="參數二">參數值</param> </interceptor> <interceptor-ref name="攔截器二" /> .................. </interceptor-stack> <interceptor-stack name="攔截器棧二"> <interceptor-ref name="攔截器三" /> <interceptor-ref name="攔截器棧一" /> ............... </interceptor-stack>
注:如果在兩個時機為同一個參數指定不同的參數值,則使用攔截器時指定的參數值將會覆蓋默認的參數值。
3、配置默認攔截器
當配置一個包時,可以為其指定默認攔截器。一旦為某個包指定了默認攔截器,如果該包中的Action沒有顯示指定攔截器,則默認的攔截器將會起到作用。如果我們為該包中的Action顯示應用了某個攔截器,則默認的攔截器不會起作用。
配置默認攔截器使用<default-interceptor-ref.../>元素,該元素作為<package.../>元素的子元素使用,為該包下的所有Action配置默認的攔截器。而且每個<package../>元素中只能包含一個<default-interceptor-ref.../>子元素,即沒一個包只能指定一個默認攔截器。如果我們需要多個攔截器共同作為默認攔截器,則應該將這些攔截器定義成一個攔截器棧,然后把這個攔截器棧配置成默認攔截器即可。
默認攔截器配置如下:
<package name="包名"> <interceptors> <!-- 定義攔截器--> <interceptor .../> <!-- 定義攔截器棧--> <interceptor-stack .../> </interceptors> <!-- 配置該包下的默認攔截器--> <default-interceptor-ref name="攔截器名或者攔截器棧名" /> <!-- 配置多個Action--> <action ../> ......... </package>
配置默認攔截器是一種攔截器的方式——避免在每個Action中單獨配置攔截器,通過在該包下配置攔截器,可以實現為該包下所以Action同時配置相同的攔截器。
經過上面的介紹。可以看出與攔截器相關的配置元素如下:
<interceptor.../>元素:該元素用于定義攔截器,所有的攔截器和攔截器棧都在該元素下定義。該元素包含<interceptor.../>和<interceptor-stack.../>子元素,分別用于定義攔截器和攔截器棧。
<interceptor.../>元素:該元素用于定義單個的攔截器,定義攔截器是只需要指定兩個屬性:name和class,分別指定攔截器的名字和實現類。
<interceptor-stack.../>元素:該元素用于定義攔截器棧,該元素中包含多個<interceptor-ref.../>用于將多個攔截器或攔截器棧組合成一個新的攔截器棧。
<interceptor-ref.../>元素:該元素引用一個攔截器或攔截器棧,表明應用指定攔截器。該元素只需要指定一個name屬性,該屬性值為一個已經定義的攔截器或攔截器棧。
<param.../>元素:該元素用于為攔截器指定參數。
<default-interceptor-red.../>該元素為指定包配置默認攔截器。
讀李剛《輕量級 Java EE 企業應用實戰》