轉載 - Struts2 攔截器詳細配置過程

出處:http://www.blogjava.net/zzzlyr/archive/2009/10/12/297998.htmlhtml

Struts2 攔截器詳細配置過程java

1:全部攔截器的超級接口Interceptor ,Action去實現這個接口;服務器

 Interceptor 它其中有三個方法(init(),destroy() ,interceptor()):jsp

      Init()方法:在服務器起動的時候加載一次,而且只加載一次;ide

      Destroy()方法:當攔截器銷燬時執行的方法;spa

      Interceptor()方法:其中裏邊有一個參數invocation.net

public String intercept(ActionInvocation invocation) throws xception {htm

       System.out.println("interceptor!!");blog

       String result=invocation.invoke();繼承

       return result;

    }

Invocation.invoke()是若是隻有一個攔截器執行完這個方法後,會返回給視圖,若是有多個攔截器,它順序的執行完全部的攔截器,才返回給視圖.

2:能夠在系統初始化中給攔截器指定默認的參數(也包括了定義攔截器方式)以下:

    在攔截器類中把hello當作屬性set/get方式注入到攔截器類中;

      <interceptors>

           <!-- 先定義攔截器 -->

           <interceptor name="myInterceptor" class="com.zzz.struts2.interceptor.MyInterceptor">

              <!-- 指定系統初始化給攔截器的參數 -->

              <param name="hello">張釗釗</param>

           </interceptor>

           <!-- 加到本身設置的攔截器棧裏邊去 -->

           <interceptor-stack name="myStack">

              <interceptor-ref name="myInterceptor">

              </interceptor-ref>

              <interceptor-ref name="defaultStack"></interceptor-ref>

           </interceptor-stack>

       </interceptors>

       <!-- 改變系統默認的攔截器,改爲本身的默認攔截器,而且一個系統只能有一個默認的攔截器,這樣這個攔截器棧會默認應用到全部的Action上去 -->

       <default-interceptor-ref name="myStack">

       </default-interceptor-ref>

       也能夠在使用攔截器的時候給它設置參數:

       就是在一個action 的reslut下面配置上以下:

    <action name="register"

           class="com.zzz.struts2.action.RegisterAction">

           <result name="success">/success.jsp</result>

           <!-- result 它其中還有一個信息轉發類型 type=""記住,若是不轉向JSP,轉向圖表,能夠改變type=""值 -->

           <result name="input">/register.jsp</result>

          

           <interceptor-ref name="myInterceptor">

              <param name="hello">welcome</param>

           </interceptor-ref>

           <interceptor-ref name="myStack"></interceptor-ref>

       </action>

2.攔截器,攔截器棧和默認的攔截器之間的關係

1:攔截器和攔截器棧是一個級別的,也就是說一個攔截器棧中包括許多攔截器, 一個攔截器棧中還能夠包括許多攔截器棧,配置以下方式:

<interceptors>

           <!-- 先定義攔截器 -->

           <interceptor name="myInterceptor" class="com.zzz.struts2.interceptor.MyInterceptor">

              <!-- 指定系統初始化給攔截器的參數 -->

              <param name="hello">張釗釗</param>

           </interceptor>

           <!-- 加到本身設置的攔截器棧裏邊去 -->

           <interceptor-stack name="myStack">

              <interceptor-ref name="myInterceptor">

              </interceptor-ref>

              <interceptor-ref name="defaultStack"></interceptor-ref>

           </interceptor-stack>

       </interceptors>

攔截器的使用:1.先定義;2.在引用使用;

<interceptor name="myInterceptor" class="com.zzz.struts2.interceptor.MyInterceptor">

<interceptor-ref name="myInterceptor">

              </interceptor-ref>

 2:struts2中有一個系統默認的攔截器棧是 defaultStack,若是你手動引用本身的攔截器,系統默認的攔截器棧將不起做用;這樣必需手動引入系統的攔截器棧<interceptor-ref name="defaultStack">

              </interceptor-ref>

若是想改變系統默認的攔截器棧,能夠這樣配置:

<default-interceptor-ref name="myStack">

</default-interceptor-ref>其中myStack是本身定義的攔截器棧名字;

若是攔截器棧中有多個攔截器,在執行action以前的順序跟配置攔截器的順序一致,而在action以後執行的順序是相反的;

 

3:抽象的攔截器類AbstractInterceptor

1:Interceptor這個超級攔截器接口,有三方法須要實現,可是若是不想使用init();

    destroy()方法,能夠去繼承這個抽象攔截器類;

它的使用跟上邊的沒有什麼區別;

 

4:方法過濾攔截器MethodFilterInterceptor

1:上邊的攔截器都要是針對整個action的,若是針對某個方法進行攔截能夠去繼承這個類;

它的使用跟上邊的使用方法差很少,只是須要要配置它對那個方法進行攔截,方法過濾攔截器最好不要配置到本身設置默認的攔截器棧裏邊,本身手動配置.

interceptor-ref name="myInterceptor3">

              <param name="includeMethods">execute</param>

              <param name="excludeMethods">execute</param>

           </interceptor-ref>

           <interceptor-ref name="defaultStack"></interceptor-ref>

其中includeMethods ,excludeMethods是固定寫法: includeMethods 包含攔截那些方法,多個方法須要用」,」隔開; excludeMehtods是排除攔截的那些方法;

5:鑑聽器PreResultListener接口

1:它的鑑聽點在攔截器執行完某個action方法後,在渲染視圖以前作一些事情;讓某個類去實現這個接口;

而後向須要它的攔截器中註冊進去以下代碼:

publicclass MyInterceptor3 extends MethodFilterInterceptor {

    privatestaticfinallongserialVersionUID = 3756655410194005443L;

    @Override

    protected String doIntercept(ActionInvocation invocation) throws Exception {

       //把鑑聽器註冊到攔截中去;

       invocation.addPreResultListener(new MyListener());

       System.out.println("my Interceptor3");

       String result=arg0.invoke();

       System.out.println("my interceptor3 finshed!");

       return result;

    }

}

相關文章
相關標籤/搜索