Struts2 攔截器詳細配置過程
Struts2 攔截器詳細配置過程
1:所有攔截器的超級介面Interceptor ,Action去實現這個介面;
Interceptor 它其中有三個方法(init(),destroy() ,interceptor()):
Init()方法:在伺服器起動的時候載入一次,並且只加載一次;
Destroy()方法:當攔截器銷燬時執行的方法;
Interceptor()方法:其中裡邊有一個引數invocation
public String intercept(ActionInvocation invocation) throws xception {
System.out.println("interceptor!!");
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;
}
}