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;
}
}