一、inperceptor配置使用过程
1.配置拦截器
2.使用拦截器
通过下图可以知道,拦截器需要先在<interceptors></interceptors>中配置,然后通过<interceptor-ref name=""></interceptor-ref>使用。
二、配置默认拦截器
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="tags" namespace="/" extends="struts-default">
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="" class=""></interceptor>
<interceptor name="" class=""></interceptor>
<interceptor-stack name="">
<interceptor-ref name=""></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置默认拦截器 ,默认拦截器需要指定name属性,这个name属性值是一个已经定义好的拦截器(栈)的名字-->
<!-- 当action没有显式应用拦截器时,该action所在包的默认拦截器才会生效 -->
<default-interceptor-ref name=""></default-interceptor-ref>
<action name="tags" class="com.ru.action.tagAction">
<!-- 使用拦截器 -->
<interceptor-ref name=""></interceptor-ref>
<result name="ok" >
/WEB-INF/jsp/tags.jsp
</result>
</action>
</package>
</struts>
三、实现拦截器类
1..Struts2规定用户自定义拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接口。
该接口声明了3个方法:
void init();
void destroy();
String intercept(ActionInvocation invocation) throws Exception;
其中,init和destroy方法会在程序开始和结束时各执行一遍,不管使用了该拦截器与否,只要在struts.xml中声明了该Struts2拦截器就会被执行。
intercept方法就是拦截的主体了,每次拦截器生效时都会执行其中的逻辑。
2..不过,struts中又提供了几个抽象类来简化这一步骤。
1、public abstract class AbstractInterceptor implements Interceptor;(普通拦截器类) |
(1)其中AbstractInterceptor提供了init()和destroy()的空实现,使用时只需要覆盖intercept()方法;
(2)而MethodFilterInterceptor则提供了includeMethods和excludeMethods两个属性,用来过滤执行该过滤器的action的方法。可以通过param来加入或者排除需要过滤的方法。
下面是通过继承AbstractInterceptor()方法实现自定义拦截器类
package com.ru.interceptor; import java.util.Date; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import com.ru.action.InterceptorAction; public class SimpleInterceptor extends AbstractInterceptor { //通过配置过滤器传递过滤器的name参数 private String name; public void setName(String name) { this.name = name; } //ActionInvocation这个参数可以获取被拦截的action实例 @Override public String intercept(ActionInvocation invocation) throws Exception { //通过ActionInvocation参数得到InterceptorAction对象 InterceptorAction action=(InterceptorAction)invocation.getAction(); System.out.println(name+"拦截器被执行----------"+"开始执行action的时间是:"+new Date()); long startTime=System.currentTimeMillis(); //执行下一个拦截器 //如果没有下一个拦截器,执行action的excute()方法 String result=invocation.invoke(); System.out.println(name+"拦截器结束动作-------开始执行action的excute()方法"); long endTime=System.currentTimeMillis(); //返回result return result; } }
struts.xml配置和使用拦截器
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="tags" namespace="/" extends="struts-default"> <!-- 配置拦截器 --> <interceptors> <interceptor name="SimpleInterceptor" class="com.ru.interceptor.SimpleInterceptor"> <param name="name">simpleIn</param> </interceptor> </interceptors> <!-- 配置默认拦截器 ,默认拦截器需要指定name属性,这个name属性值是一个已经定义好的拦截器(栈)的名字--> <!-- 当action没有显式应用拦截器时,该action所在包的默认拦截器才会生效 --> <action name="interceptor" class="com.ru.action.InterceptorAction"> <!-- 使用拦截器 --> <interceptor-ref name="SimpleInterceptor"></interceptor-ref> <result name="sucess"> /WEB-INF/jsp/interceptor.jsp </result> </action> </package> </struts>
四、拦截方法的拦截器
在Action中使用拦截器,默认情况下回拦截Action中所有的方法,但是在某些情况下,可能只需要拦截Action中的一个或多个方法,有时候也希望不拦截某个方法,这个在Struts2中是怎么实现的呢 ?
拦截器方法过滤:让拦截器有选择的拦截Action中的某个方法!
Struts2中提供了一个MethodFilterInterceptor类,开发者自定义的拦截器只需要继承该类就可以使用这个方法过滤的功能,来拦截Action中特定的方法!
MethodFilerInterceptor实现方法过滤中用到的两个参数
execludeMethods:该参数指定拦截器拒绝拦截的方法列表,多个方法用“,”隔开,指定了这个参数,拦截器不会拦截指定列表中的方法,就是所谓的黑名单 |
includeMethods:该参数指定拦截器需要拦截的方法列表,如果指定了参数,则指定的Action在执行前会被拦截,即白名单。 |
主要方法:
①protectedabstractStringdoIntercept(ActionInvocationinvocation)throwsException; 必须重写此方法,实现拦截。
②String interceptor(ActionInvocation invocation):继承自AbstractInterceptor类,方法不需要强制重写
③void setExcludeMethods(String excludeMethods):设置拦截器黑名单,参数为Action一方法名。拦截器不拦截该方法
④void setIncludeMethods(String includeMethods):设置拦截器白名单,参数为Action一方法名。拦截器会拦截该方法
⑤Set<String>getExcludeMethodsSet():获得拦截器的黑名单
⑥Set<String>getIncludeMethodsSet():获得拦截器的白名单
实例:
(1)方法过滤拦截器(与普通拦截器不同点只有一点,继承的类不同)
package com.ru.interceptor; import java.util.Date; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; import com.ru.action.InterceptorAction; public class MethodFInterceptor extends MethodFilterInterceptor { private String name; public void setName(String name) { this.name = name; } @Override protected String doIntercept(ActionInvocation invocation) throws Exception { //通过ActionInvocation参数得到InterceptorAction对象 InterceptorAction action=(InterceptorAction)invocation.getAction(); System.out.println(name+"拦截器被执行----------"+"开始执行action的时间是:"+new Date()); long startTime=System.currentTimeMillis(); //执行下一个拦截器 //如果没有下一个拦截器,执行action的excute()方法 String result=invocation.invoke(); System.out.println(name+"拦截器结束动作-------开始执行action的excute()方法--当前时间是:"+new Date()); long endTime=System.currentTimeMillis(); //返回result return result; } }
(2)struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="tags" namespace="/" extends="struts-default"> <!-- 配置拦截器 --> <interceptors> <!-- 这个就是方法拦截器 --> <interceptor name="MethodFInterceptor" class="com.ru.interceptor.MethodFInterceptor"> <param name="name">MethodFilterInterceptor</param> </interceptor> </interceptors> <action name="my*" class="com.ru.action.InterceptorAction" method="{1}"> <!-- 使用方法拦截器 --> <interceptor-ref name="MethodFInterceptor"> <!-- 配置不过滤的方法 --> <param name="excludeMethods">execute</param> <!-- 配置过滤的方法 ,如果多个方法可以使用","分割--> <param name="includeMethods">function,function2</param> </interceptor-ref> <result name="ok"> /WEB-INF/jsp/ok.jsp </result> </action> </package> </struts>