拦截器概念:
拦截器(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"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
${message }
</body>
</html>
Struts.xml
<?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>
自定义的拦截器—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;
}
}
效果图
二:继承MethodFilterInterceptor
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 extends MethodFilterInterceptor {
/**
*
*/
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
<?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