struts2拦截器的方法过滤功能在Action动态方法调用中的应用 .
拦截器是指动态拦截Action调用的对象,在执行Action中的方法之前,系统会首先执行struts.xml引用的拦截器,它能够在Action执行前后做一些相应的工作。但是,有些时候我们并不需要拦截器对Action中的某些方法进行拦截,于是就出现了拦截器的方法过滤功能,其具体实现是这样的:要实现此功能首先必须继承MethodFilterInterceptor类,然后重写此类中的doIntercept方法即可,此类中还有两个方法,分别是exclude和include,前者用来设置不需要拦截的方法,后者用来设置需要拦截的方法。
众所周知,平常我们在struts.xml中配置Action是往往是这样的:
<action name="action的名称" class="类名" method="Action中的方法">
</action>
如果需要使用拦截器的话,就在action标签内加入<interceptor-ref>调用需要的拦截器。但是这样的话,我们要拦截器的方法过滤功能有什么用呢,如果我们不想给此方法使用拦截器,直接不用<interceptor-ref>标签引入拦截器就可以了,为什么要煞费苦心的开发方法过滤功能呢?
答案是这样的:原来我们动态调用Action中的方法来处理业务逻辑有两种方式,一种是在<action>标签中指定method属性,一种是在<action>标签中不指定method属性,显然上面提到的是指定method属性;不指定method属性的方式如下所示:
<s:form action="Action的名称!方法名称">
然后再配置Action如下:
<action name="action的名称" class="类名">
</action>
在这种方式下,如果在视图页面中有多个按钮,每个按钮提交事件给同一个Action,但是对应Action中不同的方法,而在struts.xml文件中只配置一次Action。如果Action中的有些方法需要拦截,有些方法不需要拦截,这时拦截器的方法过滤功能就起到它的作用了,可以通过方法过滤功能来设置需要拦截和不需要拦截的方法。
说了不少了,还是给大家一个演示的例子吧,这个例子就是采用不指定method的方法调用,并且使用了方法过滤功能:
———————————————————————————————————————
视图:index.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<s:form name="form1" action="public!execute1.action">
<s:submit value="测试1"></s:submit>
</s:form>
<s:form name="form2" action="public!execute2.action"><br>
</s:form>
<s:form name="form3" action="public!execute3.action">
<s:submit value="测试3"></s:submit>
</s:form>
</body>
</html>
Action:MethodFilterAction.java
package dr.action;
import com.opensymphony.xwork2.ActionSupport;
public class MethodFilterAction extends ActionSupport{
public String execute(){
System.out.println("excute方法执行!");
return SUCCESS;
}
public String execute1(){
System.out.println("excute1方法执行!");
return SUCCESS;
}
public String execute2(){
System.out.println("excute2方法执行!");
return SUCCESS;
}
public String execute3(){
System.out.println("excute3方法执行!");
return SUCCESS;
}
}
拦截器:MethodInterceptor.java
package dr.interceptor;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.opensymphony.xwork2.ActionInvocation;
public class MethodInterceptor extends MethodFilterInterceptor{
public String doIntercept(ActionInvocation ai)throws Exception{
System.out.println("拦截器起作用了!");
return ai.invoke();
}
}
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="struts2" extends="struts-default">
<interceptors>
<interceptor name="methodInterceptor" class="dr.interceptor.MethodInterceptor"></interceptor>
</interceptors>
<action name="public" class="dr.action.MethodFilterAction">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="methodInterceptor">
<param name="excludeMethods">execute,execute2,execute3</param>
</interceptor-ref>
<result name="success">/index.jsp</result>
</action>
</package>
</struts>