Struts 2 攔截器之攔截器的配置

jopen 8年前發布 | 12K 次閱讀 Struts2 Web框架

          攔截器體系是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>


 

      從上面的結構中可以看出,一個攔截器棧是由多個攔截器組成的。但是從程序功能上看,攔截器和攔截器棧是統一的,它們包含的方法都會在Actionexecute方法執行之前執行。

          由于攔截器棧和攔截器的功能幾乎完全相同,所以我們可以將攔截器棧當成一個更大的攔截器。

          攔截器棧中也可以包含攔截器棧。

          配置如下:

<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.../>元素:該元素用于定義單個的攔截器,定義攔截器是只需要指定兩個屬性:nameclass,分別指定攔截器的名字和實現類。

         <interceptor-stack.../>元素:該元素用于定義攔截器棧,該元素中包含多個<interceptor-ref.../>用于將多個攔截器或攔截器棧組合成一個新的攔截器棧。

         <interceptor-ref.../>元素:該元素引用一個攔截器或攔截器棧,表明應用指定攔截器。該元素只需要指定一個name屬性,該屬性值為一個已經定義的攔截器或攔截器棧。

         <param.../>元素:該元素用于為攔截器指定參數。

         <default-interceptor-red.../>該元素為指定包配置默認攔截器。

 

讀李剛《輕量級 Java EE 企業應用實戰》

來自: http://blog.csdn.net/chenssy/article/details/7351086

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!