interceptor是struts2的核心。我们也可以定义自己的interceptor。
jdk代理模式是基于AOP的,struts2的interceptor也是基于AOP的。所以我们可以把interceptor理解为struts2对动态代理的一种封装,与手工实现jdk的动态代理相比,这种封装使得操作变得更为简单。
1. implements Interceptor的自定义interceptor
- package edu.hust.interceptor;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.Interceptor;
- public class MyInterceptor implements Interceptor {
- private static final long serialVersionUID = 1L;
- public void destroy() {
- System.out.println("destroy");
- }
- public void init() {
- System.out.println("**************...init...**************");
- }
- 转自:http://blog.youkuaiyun.com/luofuit/article/details/40144879
- public String intercept(ActionInvocation invocation) throws Exception {
- System.out.println("intercept start");
- String result = invocation.invoke();
- System.out.println("intercept finish");
- return result;
- }
- }
2. extends AbstractInterceptor的自定义interceptor(AbstractInterceptor 继承了Interceptor接口)。AbstractInterceptor对Intercetor接口中的init()和destroy()方法进行了重写,所以一般情况下,我们自定义拦截器时只需将intercept()方法重写就可以了。此外要注意的是:这个自定义拦截器是对整个action的拦截,即对action中所有方法(insert()、queryAll()等)都进行拦截。
- package edu.hust.interceptor;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- public class MyInterceptor2 extends AbstractInterceptor {
- private static final long serialVersionUID = 1L;
- @Override
- public String intercept(ActionInvocation invocation) throws Exception {
- System.out.println("intercept2 start");
- String result = invocation.invoke();
- System.out.println("intercept2 finish");
- return result;
- }
- }
3. extends MethodFilterInterceptor的自定义interceptor(MethodFilterInterceptor继承了AbstractInterceptor类)。MethodFilterInterceptor重写了interceptor()方法,我们无需再调用,但同时MethodFilterInterceptor又构造了doInterceptor()方法,我们需要对doInterceptor()进行重写。此外要注意的是:这个自定义拦截器是对action中某些方法的拦截,即对action中某些方法(insert()、queryAll()等)都进行拦截。实现了更细粒度的拦截。我们在struts.xml中会看到如何针对具体某个方法进行拦截。
- package edu.hust.interceptor;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
- public class MyInterceptor3 extends MethodFilterInterceptor {
- private static final long serialVersionUID = 1L;
- @Override
- protected String doIntercept(ActionInvocation invocation) throws Exception {
- System.out.println("intercept3 start");
- String result = invocation.invoke();
- System.out.println("intercept3 finish");
- return result;
- }
- }