Struts2的拦截器体系是一种AOP设计哲学。Strut2的拦截器可以动态地拦截发送到指定Action的请求,通过拦截器机制,可以在Action执行前后插入某些代码,通过这种方式可以把多个Action中需要重复指定的代码提取出来,在拦截器中定义,从而提供更好的代码重用。拦截器体系是Struts2的一个重要组成部分,Struts2框架就是由大量的内置拦截器来实现的。另外,它是即插即用的,即当我们需要使用某个拦截器时,只需要在配置文件中应用中该拦截器即可,如果不需要使用拦截器,也只需要取消在配置文件中该拦截器,不管是否应用某个拦截器,对于整个Strut2框架不会有任何影响的。
Struts框架提供了很多拦截器,它实现Struts2的大部分功能,能满意大部分应用的能用功能,但要实现系统逻辑相关的功能时,需要使用用户自定义拦截器:
如果用户要开发自己的拦截类,需要实现Interceptor接口,它包括三个方法:
Init()
destroy()
intercept(ActionInvocation action)
一般来说只需要实现最后一个方法即可,所以Struts2提供了一个AbstractInterceptor类,它提供了init和destory方法的空实现。在实际的开发中时,只需要继承AbstractInterceptor来实现自定义拦截器。下面实现一个简单的拦截器:
实现拦截器类(SimpleInterceptor.java):
package
my;
import java.util.Date;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.ActionInvocation;
public class SimpleInterceptor extends AbstractInterceptor
{
private String name;
public void setName(String name)
{
this.name = name;
}
public String intercept(ActionInvocation invocation)throws Exception
{
LoginAction action = (LoginAction)invocation.getAction();
System.out.println(name+"拦截器的动作:开始执行登录Action的时间为:"+new Date());
if(action.getTip().equals("flying"))
{
System.out.println("user name error");
return "input";
}
long start = System.currentTimeMillis();
String result = invocation.invoke();
System.out.println(name+"拦截器的动作:执行完登录Action的时间为:" + new Date());
long end = System.currentTimeMillis();
System.out.println("拦截器的动作:执行action事件的时间是:"+(end-start)+"毫秒");
return result;
}
}
配置拦截器(Struts.xml):
import java.util.Date;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.ActionInvocation;
public class SimpleInterceptor extends AbstractInterceptor
{
private String name;
public void setName(String name)
{
this.name = name;
}
public String intercept(ActionInvocation invocation)throws Exception
{
LoginAction action = (LoginAction)invocation.getAction();
System.out.println(name+"拦截器的动作:开始执行登录Action的时间为:"+new Date());
if(action.getTip().equals("flying"))
{
System.out.println("user name error");
return "input";
}
long start = System.currentTimeMillis();
String result = invocation.invoke();
System.out.println(name+"拦截器的动作:执行完登录Action的时间为:" + new Date());
long end = System.currentTimeMillis();
System.out.println("拦截器的动作:执行action事件的时间是:"+(end-start)+"毫秒");
return result;
}
}
<?
xml version="1.0" encoding="UTF-8"
?>
<! DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< package name ="strutsqs" extends ="struts-default" >
< interceptors >
< interceptor name ="mysimple" class ="my.SimpleInterceptor" >
< param name ="name" > simple </ param >
</ interceptor >
</ interceptors >
< action name ="Login" class ="my.LoginAction" >
< result name ="input" > /login.jsp </ result >
< result name ="success" > /success.jsp </ result >
< interceptor-ref name ="defaultStack" />
< interceptor-ref name ="mysimple" >
< param name ="name" > my </ param >
</ interceptor-ref >
</ action >
</ package >
</ struts >
<! DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< package name ="strutsqs" extends ="struts-default" >
< interceptors >
< interceptor name ="mysimple" class ="my.SimpleInterceptor" >
< param name ="name" > simple </ param >
</ interceptor >
</ interceptors >
< action name ="Login" class ="my.LoginAction" >
< result name ="input" > /login.jsp </ result >
< result name ="success" > /success.jsp </ result >
< interceptor-ref name ="defaultStack" />
< interceptor-ref name ="mysimple" >
< param name ="name" > my </ param >
</ interceptor-ref >
</ action >
</ package >
</ struts >
这样即实现一个简单的拦截器,默认下,譔拦截器拦截了Action中的所有方法,如果我们只需要拦截某个方法,Struts2提供了一个MethodFilterInterceptor类对Action中方法过滤的功能,MethodFilterInterceptor是AbstractInterceptor类的子类,如果要实现拦截器方法过滤功能,则需要继承MethodFilterInterceptor。用户只需要重写MethodFilterInteceptor中的doInterceptor(ActionInvocation action)即可。其内容实际上与interceptor一样。
为了实现方法过滤只需要在interceptor的配置文件里设置两个属性:
excludeMethods:指定不需要拦截的方法名
includeMethods:指定需要拦截的方法名
若一个方法同时出现中,则该方法将被拦截。
一个方法过滤的拦截器实现(SimpleInterceptor.java)与上面的一样:
package
my;
import java.util.Date;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.opensymphony.xwork2.ActionInvocation;
public class SimpleInterceptor extends MethodFilterInterceptor
{
private String name;
public void setName(String name)
{
this.name = name;
}
public String doIntercept(ActionInvocation invocation)throws Exception
{
LoginAction action = (LoginAction)invocation.getAction();
System.out.println(name+"拦截器的动作:开始执行登录Action的时间为:"+new Date());
if(action.getTip().equals("flying"))
{
System.out.println("user name error");
return "input";
}
long start = System.currentTimeMillis();
String result = invocation.invoke();
System.out.println(name+"拦截器的动作:执行完登录Action的时间为:" + new Date());
long end = System.currentTimeMillis();
System.out.println("拦截器的动作:执行action事件的时间是:"+(end-start)+"毫秒");
return result;
}
}
import java.util.Date;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.opensymphony.xwork2.ActionInvocation;
public class SimpleInterceptor extends MethodFilterInterceptor
{
private String name;
public void setName(String name)
{
this.name = name;
}
public String doIntercept(ActionInvocation invocation)throws Exception
{
LoginAction action = (LoginAction)invocation.getAction();
System.out.println(name+"拦截器的动作:开始执行登录Action的时间为:"+new Date());
if(action.getTip().equals("flying"))
{
System.out.println("user name error");
return "input";
}
long start = System.currentTimeMillis();
String result = invocation.invoke();
System.out.println(name+"拦截器的动作:执行完登录Action的时间为:" + new Date());
long end = System.currentTimeMillis();
System.out.println("拦截器的动作:执行action事件的时间是:"+(end-start)+"毫秒");
return result;
}
}
配置方法过滤拦截器(Struts.xml):
<?
xml version="1.0" encoding="UTF-8"
?>
<! DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< package name ="strutsqs" extends ="struts-default" >
< interceptors >
< interceptor name ="mysimple" class ="my.SimpleInterceptor" >
< param name ="name" > simple </ param >
</ interceptor >
</ interceptors >
< action name ="Login" class ="my.LoginAction" >
< result name ="input" > /login.jsp </ result >
< result name ="success" > /success.jsp </ result >
< interceptor-ref name ="defaultStack" />
< interceptor-ref name ="mysimple" >
< param name ="name" > my </ param >
< param name ="excludeMethods" > execute </ param >
</ interceptor-ref >
</ action >
</ package >
</ struts >
上面只在引用拦截器时注入一个excludeMethods属性,其它的与上面的配置一样。
<! DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< package name ="strutsqs" extends ="struts-default" >
< interceptors >
< interceptor name ="mysimple" class ="my.SimpleInterceptor" >
< param name ="name" > simple </ param >
</ interceptor >
</ interceptors >
< action name ="Login" class ="my.LoginAction" >
< result name ="input" > /login.jsp </ result >
< result name ="success" > /success.jsp </ result >
< interceptor-ref name ="defaultStack" />
< interceptor-ref name ="mysimple" >
< param name ="name" > my </ param >
< param name ="excludeMethods" > execute </ param >
</ interceptor-ref >
</ action >
</ package >
</ struts >