拦截器(Interceptor),在AOP(Aspect-OrientedProgramming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
Struts2将它的核心功能放到拦截器中实现,而不是分散到Action中实现,有利于系统的解耦,使得功能的实现类似于个人电脑的组装,变成了可插拔的,需要某个功能就“插入”一个拦截器,不需要某个功能就“拔出”一个拦截器。你可以任意组合拦截器来为Action提供附加的功能,而不需要修改Action的代码。
如下图:
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; } }
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN"> <html> <head> <title>My JSP ‘index.jsp‘ starting page</title> </head> <body> ${message } </body> </html>
<?xml version="1.0"encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD StrutsConfiguration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="hello" namespace="/hello"extends="struts-default"> <interceptors> <interceptor name="myinterceptor" class="util.MyInterceptor"> <param name="name">计时拦截器</param> </interceptor> </interceptors> <action name="login" class="action.HelloAction"> <result name="success"> /index.jsp </result> <interceptor-ref name="myinterceptor"> <param name="name">HelloAction 计时拦截器</param> </interceptor-ref> </action> </package> </struts>
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; } }
添加两个方法用来测试
public String add() { message="add"; return SUCCESS; } public String delete() { message="delete"; return SUCCESS; }
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; } }
<?xml version="1.0"encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD StrutsConfiguration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="hello" namespace="/hello"extends="struts-default"> <interceptors> <interceptor name="myinterceptor" class="util.MyInterceptor"> <param name="name">计时拦截器1</param> </interceptor> <interceptor name="methodInteceptor" class="util.MethodInteceptor"> <param name="name">计时拦截器2</param> </interceptor> </interceptors> <action name="*" class="action.HelloAction"method="{1}"> <result name="success"> /index.jsp </result> <interceptor-ref name="myinterceptor"> <param name="name">HelloAction 计时拦截器1</param> </interceptor-ref> <interceptor-ref name="methodInteceptor"> <param name="name">HelloAction 计时拦截器2</param> <param name="excludeMethods">add,delete</param> <param name="includeMethods">execute</param> </interceptor-ref> </action> </package> </struts>
解释说明:
MethodFilterInterceptor通过指定included/excluded方法列表来选择拦截器或排除的方法,可以设置的参数如下:
excludeMethods-------要排除的方法。
includeMethods--------要拦截的方法
由于 struts.xml 文件中国将 add与delete 方法排除故不生效。所以出现如下状况!
访问:http://localhost:8080/interceptor/hello/execute
访问http://localhost:8080/interceptor/hello/add
struts2入门教程四(拦截器),布布扣,bubuko.com
原文:http://blog.csdn.net/wang9258/article/details/21038497