struts2学习笔记(5)---自定义拦截器
2015-07-07 17:36
459 查看
什么是拦截器?
struts2中拦截器分为Struts2定义好的拦截器和自定义的拦截器。其作用是在一个Action执行之前进行拦截,在Action执行之后又加入某些操作。实现原理
当请求一个Action时,struts2会查找配置文件,并根据这个Action的配置实例化对应的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。拦截器的执行流程
1、对Action进行预处理。(正序执行)2、拦截器自身决定该不该执行后续的拦截器(由invoke()方法的返回值决定)。
3、对Action进行后期处理。(倒序执行)
源码:自定义拦截器
方法一:实现Interceptor接口,重写其方法[code]package org.Test.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class TestInterceptor1 implements Interceptor { //实现Interceptor接口 public TestInterceptor1() { // 构造方法,服务器启动时就生成一个interceptor实例 System.out.println("TestInterceptor1 cons"); } @Override public void destroy() { // 类似于析构方法,用于释放资源 System.out.println("TestInterceptor1 destory"); } @Override public void init() { // 服务器启动时被调用来初始化一些相关资源,类似于构造方法 System.out.println("TestInterceptor1 init"); } @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("TestInterceptor1 intercept go"); // 开始执行该拦截器 String resultName = invocation.invoke(); // 执行下一个拦截器或执行Action的execute()方法 System.out.println("TestInterceptor1 intercept back"); // 返回该拦截器 System.out.println("TestInterceptor1 resultName:" + resultName); // 打印调用的下一个拦截器或Action的返回值 return resultName; } }
方法二:继承MethodFilterInterceptor类,重写doIntercept()方法
[code]package org.Test.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import com.opensymphony.xwork2.interceptor.Interceptor; public class TestInterceptor2 extends AbstractInterceptor{ //继承AbstractInterceptor,无需重写init(),destroy()方法 @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("TestInterceptor2 intercept go"); String resultName = invocation.invoke(); System.out.println("TestInterceptor2 intercept back"); System.out.println("TestInterceptor2 resultName:" + resultName); return resultName; } }
源码:配置struts.xml
[code]<package name="default" namespace="/" extends="struts-default"> <!-- 配置自定义拦截器 --> <interceptors> <interceptor name="TestInterceptor1" class="org.Test.interceptor.TestInterceptor1"/> <interceptor name="TestInterceptor2" class="org.Test.interceptor.TestInterceptor2"/> </interceptors> <default-action-ref name="default" /> <action name="test" class="org.Test.action.TestAction"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> <!-- 在这个Action中使用自定义的拦截器 --> <interceptor-ref name="TestInterceptor1"/> <interceptor-ref name="TestInterceptor2"/> </action> <action name="default"> <result>/index.jsp</result> </action> </package>
源码:Action的定义
[code]public class TestAction extends ActionSupport { @Override public String execute() throws Exception { System.out.println("TestAction execute"); return SUCCESS; } }
运行结果
1.拦截器按其在action中加入的先后顺序依次被调用,这里先调用TestInterceptor1,后调用TestInterceptor2。
2.当所有的拦截器执行完了之后才执行Action
3.然后从Action依次往上一个调用点后退,从TestAction退到TestInterceptor2,从TestInterceptor2退到TestInterceptor1。
来一张图理解
相关文章推荐
- java计算时间差及比较时间
- Maven下载Jar包同时下载source和javadoc
- JAVA & Eclipse 笔记
- 基于注解的SpringMVC简单介绍
- Spring学习(14)--- 基于Java类的配置Bean 之 @ImportResource & @Value 注解
- Java 8十个lambda表达式案例
- Java 异常+包+jar包
- Spring与RMI集成实现远程访问
- SpringMVC的IntrospectorCleanupListener
- java基础——类与对象
- 多线程
- ios下使用RSA算法加密与java后台解密配合demo
- java nio 如何建立和管理多个channel
- java编程思想---对象
- java_JDBC(4)
- [LeetCode][Java] Palindrome Number
- SpringMvc + Quarzt 动态执行任务实现过程
- JAVA线程的初步学习
- Java语言程序设计进阶----第一周作业
- Spring + Quartz 实现定时任务