struts2 拦截器整理

来源:互联网 发布:u3d捕鱼源码 编辑:程序博客网 时间:2024/06/10 19:31

目录

1、拦截器与Action的关系
2、拦截器格式定义
3、默认拦截器
4、拦截器抽象类
5、拦截器的执行顺序
6、拦截结果监听器
7、拦截器参数覆盖
8、内置拦截器

 

----------------------------------------------------------------------------------------------------------------------------------

 

1、拦截器与Action的关系

 

2、拦截器格式定义:

<interceptor ... />

<interceptor name="拦截器名" class="拦截器实现类"/>

带传入参数,使用<param .../>

<interceptor name="拦截器名" class="拦截器实现类" >  <!--下边的标签可以出现0至多次-->  <param name="参数名">参数值</param></interceptor>

拦截器栈,<interceptor-stack  .. . />

<interceptor-stack name="拦截器栈名1">   <interceptor-ref name="拦截器名1" />   <interceptor-ref name="拦截器名2" />    ..........  </interceptor-stack>  <interceptor-stack name="拦截器栈名2">   <interceptor-ref name="拦截器名1" />   <interceptor-ref name="拦截器名2" />    ..........  </interceptor-stack>   

  

标签说明: 

<interceptor.../>元素:该元素用于定义拦截器,所有的拦截器和拦截器栈都在该元素下定义。该元素包含<interceptor.../><interceptor-stack.../>子元素,分别用于定义拦截器和拦截器栈。

 <interceptor.../>元素:该元素用于定义单个的拦截器,定义拦截器是只需要指定两个属性:nameclass,分别指定拦截器的名字和实现类。

 <interceptor-stack.../>元素:该元素用于定义拦截器栈,该元素中包含多个<interceptor-ref.../>用于将多个拦截器或拦截器栈组合成一个新的拦截器栈。

 <interceptor-ref.../>元素:该元素引用一个拦截器或拦截器栈,表明应用指定拦截器。该元素只需要指定一个name属性,该属性值为一个已经定义的拦截器或拦截器栈。

 <param.../>元素:该元素用于为拦截器指定参数。


3、默认拦截器

<interceptor-ref name="defaultStack"/>

示例:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts><constant name="struts.custom.i18n.resources" value="globalMessages"/><constant name="struts.i18n.encoding" value="GBK"/>    <package name="lee" extends="struts-default"><interceptors><interceptor name="mysimple" class="jk.SimpleInterceptor"><param name="name">简单拦截器</param></interceptor></interceptors>        <action name="login" class="jk.LoginAction">            <result name="error">/error.jsp</result>            <result name="success">/welcome.jsp</result> <!-- 拦截器一般配置在result元素之后! --><interceptor-ref name="defaultStack"/><interceptor-ref name="mysimple"><param name="name">改名后的拦截器</param></interceptor-ref>        </action>    </package></struts> 

说明:只有当Action 中没有显示指定拦截器时,该Action所在包的默认拦截器才会对该Action生效

4、拦截器抽象类

AbstractInterceptor:实现自定义拦截器

MethodFilterInterceptor:实现自定义拦截器并支持方法过滤

示例:

1) AbstractInterceptor

struts.xml 文件:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts><constant name="struts.custom.i18n.resources" value="globalMessages"/><constant name="struts.i18n.encoding" value="GBK"/>    <package name="lee" extends="struts-default"><interceptors><interceptor name="mysimple" class="jk.SimpleInterceptor"><param name="name">简单拦截器</param></interceptor></interceptors>        <action name="login" class="jk.LoginAction">            <result name="error">/error.jsp</result>            <result name="success">/welcome.jsp</result> <!-- 拦截器一般配置在result元素之后! --><interceptor-ref name="defaultStack"/><interceptor-ref name="mysimple"><param name="name">改名后的拦截器</param></interceptor-ref>        </action>    </package></struts>    

SimpleInterceptor.java :

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());long start = System.currentTimeMillis();String result = invocation.invoke();System.out.println(name + " 拦截器的动作---------" + "执行完登陆Action的时间为:" + new Date());long end = System.currentTimeMillis();System.out.println(name + " 拦截器的动作---------" + "执行完该Action的事件为" + (end - start) + "毫秒");return result;    }}

2)过滤类型拦截器(MethodFilterInterceptor)

struts.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts><constant name="struts.custom.i18n.resources" value="globalMessages"/><constant name="struts.i18n.encoding" value="GBK"/>    <package name="lee" extends="struts-default"><interceptors><interceptor name="myfilter" class="jk.MyFilterInterceptor"><param name="name">方法过滤拦截器</param></interceptor></interceptors>        <action name="login" class="jk.LoginAction">            <result name="error">/error.jsp</result>            <result name="success">/welcome.jsp</result> <!-- 拦截器一般配置在result元素之后! --><interceptor-ref name="defaultStack"/><interceptor-ref name="myfilter"><param name="name">改名后的方法过滤拦截器</param><param name="excludeMethods">execute,haha</param><param name="includeMethods">execute</param></interceptor-ref>        </action>    </package></struts>    

MyFilterInterceptor.java

public class MyFilterInterceptor 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());long start = System.currentTimeMillis();String result = invocation.invoke();System.out.println(name + " 拦截器的动作---------" + "执行完登陆Action的时间为:" + new Date());long end = System.currentTimeMillis();System.out.println(name + " 拦截器的动作---------" + "执行完该Action的事件为" + (end - start) + "毫秒");return result;}}


说明:参数名为:

excludeMethods的字符串所列出的方法都不会被拦截

includeMethods的字符串所列出的方法都会被拦截

当excludeMethods与includeMethods同时出现时,以includeMethods为主。

5、拦截器的执行顺序

系统中配置的拦截器的顺序不同,系统中执行拦截器的顺序也不一样。

通常是,先执行的拦截器最后执行完,与栈的原理相同,也就算说,先进后出

示例:

?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts><constant name="struts.custom.i18n.resources" value="globalMessages"/><constant name="struts.i18n.encoding" value="GBK"/>    <package name="lee" extends="struts-default"><interceptors><interceptor name="mysimple" class="jk.SimpleInterceptor"><param name="name">简单拦截器</param></interceptor></interceptors>        <action name="login" class="jk.LoginAction">            <result name="error">/error.jsp</result>            <result name="success">/welcome.jsp</result> <!-- 拦截器一般配置在result元素之后! --><interceptor-ref name="defaultStack"/><interceptor-ref name="mysimple"><param name="name">第一个</param></interceptor-ref><interceptor-ref name="mysimple"><param name="name">第二个</param></interceptor-ref>        </action>    </package></struts>    

运行结果:

拦截器第一个开始

拦截器第二个开始

execute

拦截器第二个结束

拦截器第一个结束


6、拦截结果监听器

实现监听必须实现:PreResultListener接口

示例:

struts.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts><constant name="struts.custom.i18n.resources" value="globalMessages"/><constant name="struts.i18n.encoding" value="GBK"/>    <package name="lee" extends="struts-default"><interceptors><interceptor name="resultinterceptor" class="jk.BeforeResultInterceptor"/></interceptors>        <action name="login" class="jk.LoginAction">            <result name="error">/error.jsp</result>            <result name="success">/welcome.jsp</result> <!-- 拦截器一般配置在result元素之后! --><interceptor-ref name="defaultStack"/><interceptor-ref name="resultinterceptor"/>        </action>    </package></struts>    

 

BeforeResultInterceptor.java

public class BeforeResultInterceptor extends AbstractInterceptor{    public String intercept(ActionInvocation invocation) throws Exception{invocation.addPreResultListener(new MyPreResultListener()); System.out.println("execute方法执行之前的拦截...");String result = invocation.invoke();System.out.println("execute方法执行之后的拦截......");return result;    }}


MyPreResultListener.java

public class MyPreResultListener implements PreResultListener{public void beforeResult(ActionInvocation invocation,String resultCode){System.out.println("返回的逻辑视图为:" + resultCode);}}


 

7、拦截器参数覆盖

拦截器为避免重复定义,采用覆盖式方式,类型java的多态性

示例:

struts.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts><constant name="struts.custom.i18n.resources" value="globalMessages"/><constant name="struts.i18n.encoding" value="GBK"/>    <package name="lee" extends="struts-default"><interceptors><interceptor name="mysimple" class="jk.SimpleInterceptor"><param name="name">简单拦截器</param></interceptor><interceptor name="second" class="jk.SecondInterceptor"/><interceptor-stack name="my-stack"><interceptor-ref name="mysimple"><param name="name">第一个</param></interceptor-ref><interceptor-ref name="second"><param name="name">第二个</param></interceptor-ref></interceptor-stack></interceptors>        <action name="login" class="lee.LoginAction">            <result name="error">/error.jsp</result>            <result name="success">/welcome.jsp</result> <!-- 拦截器一般配置在result元素之后! --><interceptor-ref name="defaultStack"/><interceptor-ref name="my-stack"><param name="second.name">改名后的拦截器</param></interceptor-ref>        </action>    </package></struts>    

说明:拦截器栈my-stack 在login.action 中,拦截器second 的参数值被覆盖。

 

8、内建拦截器

Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特性。这些内置的拦截器在struts-default.xml中配置。只有配置了拦截器,拦截器才可以正常的工作和运行。Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。大家可以至struts2的jar包内的struts-default.xml查看关于默认的拦截器与拦截器链的配置。内置拦截器虽然在struts2中都定义了,但是并不是都起作用的。因为并不是所有拦截器都被加到默认拦截器栈里了,只有被添加到默认拦截器栈里的拦截器才起作用,看一下被加到默认拦截器栈的拦截器都有那些(具体参见教科书)

 

 

 

0 0