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.../>元素:该元素用于定义单个的拦截器,定义拦截器是只需要指定两个属性:name和class,分别指定拦截器的名字和实现类。
<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中都定义了,但是并不是都起作用的。因为并不是所有拦截器都被加到默认拦截器栈里了,只有被添加到默认拦截器栈里的拦截器才起作用,看一下被加到默认拦截器栈的拦截器都有那些(具体参见教科书)
- struts2 拦截器整理
- SpringMVC—Struts2拦截器学习网址整理
- SpringMVC—Struts2拦截器学习网址整理
- 【Struts2】Struts2中拦截器
- struts2拦截器
- Struts2拦截器
- struts2.0拦截器
- struts2.0 拦截器
- struts2拦截器学习
- struts2 拦截器
- Struts2拦截器(Interceptor)
- struts2.0拦截器
- 用上struts2拦截器
- struts2拦截器简介
- Struts2:拦截器概述
- Struts2拦截器(Interceptor)
- struts2 拦截器
- 关于struts2拦截器
- C结构体之位域
- JQuery弹出层效果制作 TipsWindown
- LOL单排心理学 控制情绪才能掌控结局
- mysql系列:常用函数
- 基于alsa驱动架构的pcm播放
- struts2 拦截器整理
- nasm汇编之 BITS
- java 程序加载过程---2-创建类实例对象
- 关于随机数权重的实现
- 深度探讨Java字节代码的操纵方法
- IOS event 拦截
- poj 1681 Painter's Problem(高斯消元)
- 带圆角的EditText
- 备战S4!想上钻石必须注意的20个细节