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 方法后 , 在渲染视图之前做一些事情;让某个类去实现这个接口;
然后向需要它的拦截器中注册进去如下代码:
public class MyInterceptor3 extends MethodFilterInterceptor {
private static final long serialVersionUID = 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;
}
}