struts2的拦截器其实和过滤器是一个概念,虽然自定义的过滤器用的不多,但是struts2的核心功能都是用拦截器来实现的,异常捕获,参数绑定,和国际化等等。
写一个最简单的过滤器的例子,感受一下自定义过滤器的使用就好。
先上action
1 package demo.action;
2
3 public class InterceptorDemo {
4
5 private String name;
6
7 public String execute(){
8 System.out.println("我是Execute的方法");
9 System.out.println("name:" + name);
10 return "success";
11 }
12
13 //get/set方法略
14
15 }
16
创建一个interceptor只需要新建一个类,继承struts2的
AbstractInterceptor,重写
intercept方法
1 package demo.interceptor;
2
3 import com.opensymphony.xwork2.ActionInvocation;
4 import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
5
6 public class InterceptorDemo extends AbstractInterceptor{
7
8 private static final long serialVersionUID = -1739072578539674220L;
9
10 @Override
11 public String intercept(ActionInvocation invocation) throws Exception {
12
13 System.out.println("我是一个炫酷的拦截器");
14
15 //校验用户是否登陆等操作
16 //ServletActionContext.getContext().getSession()...
17
18 //校验用户是否有权限访问等操作
19 //invocation.getProxy().getActionName()...
20
21 return invocation.invoke();
22 }
23
24 }
25
如此一来,拦截器就创建好了,接下来就是对拦截器的配置,看到struts.xml
1 <package name="interceptorDemo" extends="struts-default" namespace="/">
2
3 <!-- 需要在包内声明拦截器,之后可以定义在action中定义对声明拦截器的引用 -->
4 <interceptors>
5 <interceptor name="InterceptorDemo" class=demo.interceptor.InterceptorDemo"/>
6 </interceptors>
7
8 <!-- 在指定的action中使用指定的拦截器 -->
9 <action name="interceptorDemo"
10 class="demo.action.InterceptorDemo"
11 method="execute">
12 <interceptor-ref name="InterceptorDemo"/>
13 </action>
14
15 </package> 将定义好的拦截器添加到某个action的定义中,让拦截器拦截对应的action,但如果如上述那样去配置的话,除了自定义拦截器的功能,struts2 的拦截器功能都会失效,action中的name值根本拿不到。配置中的每个包都会继承struts-default这个包,简单看一下struts-default.xml这个文件
1 <interceptor-stack name="defaultStack">
2 <interceptor-ref name="exception"/>
3 <interceptor-ref name="alias"/>
4 <interceptor-ref name="servletConfig"/>
5 <interceptor-ref name="i18n"/>
6 <interceptor-ref name="prepare"/>
7 <interceptor-ref name="chain"/>
8 <interceptor-ref name="scopedModelDriven"/>
9 <interceptor-ref name="modelDriven"/>
10 <interceptor-ref name="fileUpload"/>
11 <interceptor-ref name="checkbox"/>
12 <interceptor-ref name="multiselect"/>
...
<interceptor-ref name="debugging"/>
</interceptor-stack>
...
<default-interceptor-ref name="default-stack"/>
上述就是部分配置,定义了默认的拦截器栈,也就是一组拦截器,从名字就可以看出很多功能都由拦截器完成,所以,自定义的拦截器也需要引用这一组拦截器,需要在配置中添加默认拦截器栈
1 <action name="interceptorDemo"
2 class="org.duyt.action.InterceptorDemo"
3 method="execute">
4 <interceptor-ref name="InterceptorDemo"/>
5 <interceptor-ref name="defaultStack"/>
6 </action>
或者定义一组拦截器栈
1 <interceptors>
2 <interceptor name="InterceptorDemo" class="demo.interceptor.InterceptorDemo"/>
3
4 <!-- 声明的拦截器栈一定要引用defaultStack,不然struts2无法发挥作用,参数封装等最基本的功能都会失效 -->
5 <interceptor-stack name="selfStack">
6 <interceptor-ref name="InterceptorDemo"/>
7 <interceptor-ref name="defaultStack"/>
8 </interceptor-stack>
9 </interceptors>
10
11 <!-- 在指定的action中使用指定的拦截器 -->
12 <action name="interceptorDemo"
13 class="demo.action.InterceptorDemo"
14 method="execute">
15 <interceptor-ref name="selfStack"/>
16 </action>
这样,自定义的拦截器就能融入到完整的功能之中。