struts.xml 配置详解之三 拦截器配置
1. 拦截器( Interceptor )配置
拦截器能在action 被调用之前和被调用之后执行一些“代码”。Struts2 框架的大部分核心功能都是通过拦截器来实现的,如防止重复提交、类型转换、对象封装、校验、文件上传、页面预装载等等,都是在拦截器的帮助下实现的。
每一个拦截器都是独立装载的(pluggable) ,我们可以根据实际的需要为每一个action 配置它所需要的拦截器,例如,一个action 需要用来类型装换、文件上传,那么我们可以给它设置相应的两个拦截器。
1.1 、拦截器配置
代码清单 1 : struts.xml 片段
< package name = "loginTest" extends = "struts-default">
< interceptors >
<!-- 定义名为 timer 的拦截器 -->
< interceptor name = "timer"
class = "com.opensymphony.xwork2.interceptor.TimerInterceptor" />
<!-- 定义名为 params 的拦截器 -->
< interceptor name = "params"
class = "com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
</ interceptors >
< action name = "login" class = "com.coderdream.action.LoginAction">
< result name = "success"> /msg/loginSuc.jsp </ result >
<!-- 为 login action 指定拦截器引用,当 login action 被调用时,
timer 和 params 拦截器也会被调用 -->
< interceptor-ref name = "timer" />
< interceptor-ref name = "params" />
</ action >
</ package >
1.2 、拦截器栈配置
拦截器栈注意点:
1、 拦截器栈即引用其他拦截器,也可以引用其他拦截器栈;
2、 引用其他拦截器栈必须是当前包中 的栈,或者是“父”包中 的栈,如某包继承在默认包,则可以引用默认包中的栈;
代码清单 2 : struts.xml 片段
< package name = "loginTest" extends = "struts-default">
< interceptors >
<!-- 定义名为 loginStack 的拦截器栈,拦截器栈可以包含其他拦截器栈,
同时,该栈必须在本包或者 “ 父 ” 包中,如此处的 “struts-default” 包中 -->
< interceptor-stack name = "loginStack">
< interceptor-ref name = "timer" />
< interceptor-ref name = "params" />
< interceptor-ref name = "basicStack" />
</ interceptor-stack >
</ interceptors >
< action name = "login" class = "com.coderdream.action.LoginAction">
< result name = "success"> /msg /loginSuc.jsp
</ result >
< result name = "input"> /msg /loginFail.jsp
</ result >
<!-- 为 login actin 指定拦截器引用,引用名既可以是拦截器名,
也可以是拦截器栈名 -->
< interceptor-ref name = "loginStack" />
</ action >
</ package >
1.3 、默认拦截器栈引用
代码清单 3 : struts.xml 片段
< package name = "loginTest" extends = "struts-default">
< interceptors >
<!-- 定义名为 loginStack 的拦截器栈 -->
< interceptor-stack name = "loginStack">
< interceptor-ref name = "timer" />
< interceptor-ref name = "params" />
< interceptor-ref name = "basicStack" />
</ interceptor-stack >
</ interceptors >
<!-- 定义默认拦截器栈的引用 -->
< default-interceptor-ref name = "loginStack" />
<!-- 包中的所有 action 都将使用默认的拦截器栈引用 -->
< action name = "login" class = "com.coderdream.action.LoginAction">
< result name = "success"> /msg/loginSuc.jsp </ result >
</ action >
< action name = "user" class = "com.coderdream.action.UserAction">
< result name = "success"> /msg/userSuc.jsp </ result >
</ action >
</ package >
在struts 的默认配置文件的默认包中,定义了默认拦截器栈的引用:
代码清单 4 : struts-default.xml 片段
< package name = "struts-default" abstract = "true">
< default-interceptor-ref name = "defaultStack"/>
</ package >
所以,如果在action 中定义了其他的拦截器引用,那么这个action 将不再使用默认的拦截器引用。
代码清单 5 : struts.xml 片段
< package name = "loginTest" extends = "struts-default">
< action name = "login" class = "com.coderdream.action.LoginAction">
< result name = "success"> /msg/loginSuc.jsp </ result >
<!-- 为 login action 指定拦截器引用,默认的拦截器不再起作用 -->
< interceptor-ref name = "timer" />
</ action >
</ package >
我的联系方式: 85337464
我的博客: http://coderdream.iteye.com