拦截器概念:
拦截器(Interceptor),在AOP(Aspect-OrientedProgramming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为――拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
Struts2将它的核心功能放到拦截器中实现,而不是分散到Action中实现,有利于系统的解耦,使得功能的实现类似于个人电脑的组装,变成了可插拔的,需要某个功能就“插入”一个拦截器,不需要某个功能就“拔出”一个拦截器。你可以任意组合拦截器来为Action提供附加的功能,而不需要修改Action的代码。
拦截器工作方式
如下图:

Struts2内置拦截器




自定义 计时拦截器
一:继承AbstractInterceptor 抽象类
Java 代码
package action;
import com.opensymphony.xwork2.ActionSupport;
public classHelloAction extends ActionSupport {
private String message;
@Override
public String execute() throws Exception {
message="Hello";
return super.execute();
}
public String getMessage() {
return message;
}
public void setMessage(Stringmessage) {
this.message = message;
}
}
Jsp代码:----仅为测试用
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>My JSP 'index.jsp' starting page ${message }
Struts.xml
计时拦截器 /index.jsp HelloAction 计时拦截器
自定义的拦截器―java代码
package util;
import java.util.Date;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public classMyInterceptor extends AbstractInterceptor{
/**
*
*/
private static final long serialVersionUID= 1L;
private String name;
@Override
public Stringintercept(ActionInvocation invocation) throws Exception {
System.out.println("调用前"+new Date());
long start=System.currentTimeMillis();
Stringresult=invocation.invoke();
long end=System.currentTimeMillis();
System.out.println("调用后"+new Date());
System.out.println(name+"用时"+(end-start));
return result;
}
public void setName(String name) {
this.name = name;
}
}
效果图

二:继承MethodFilterInterceptZ http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcjwvaDI+CjxoMz5KYXZhtPrC6zwvaDM+CjxwPiDM7bzTwb249re9t6jTw8C0suLK1DwvcD4KPHA+IDwvcD4KPHByZSBjbGFzcz0="brush:java;">public String add() { message="add"; return SUCCESS; } public String delete() { message="delete"; return SUCCESS; }
自定义的拦截器―java代码
package util;
import java.util.Date;
importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MethodInteceptor extendsMethodFilterInterceptor {
/**
*
*/
privatestatic final long serialVersionUID = 1L;
privateString name;
@Override
publicString doIntercept(ActionInvocation invocation) throws Exception {
System.out.println(name+"调用前"+newDate());
longstart=System.currentTimeMillis();
Stringresult=invocation.invoke();
longend=System.currentTimeMillis();
System.out.println(name+"调用后"+newDate());
System.out.println(name+"用时"+(end-start));
returnresult;
}
publicvoid setName(String name) {
this.name= name;
}
}
Struts.xml
计时拦截器1 计时拦截器2 /index.jsp HelloAction 计时拦截器1 HelloAction 计时拦截器2 add,delete execute
效果图:
解释说明:
MethodFilterInterceptor通过指定included/excluded方法列表来选择拦截器或排除的方法,可以设置的参数如下:
excludeMethods-------要排除的方法。
includeMethods--------要拦截的方法
由于 struts.xml 文件中国将 add与delete 方法排除故不生效。所以出现如下状况!
访问:http://localhost:8080/interceptor/hello/execute

访问http://localhost:8080/int