您的位置:首页 > 编程语言 > Java开发

struts2拦截器的方法过滤功能在Action动态方法调用中的应用 .

2011-11-14 11:42 423 查看
拦截器是指动态拦截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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐