struts2学习笔记(5)---自己定义拦截器
什么是拦截器?
struts2中拦截器分为Struts2定义好的拦截器和自己定义的拦截器。
其作用是在一个Action运行之前进行拦截,在Action运行之后又增加某些操作。
实现原理
当请求一个Action时,struts2会查找配置文件,并依据这个Action的配置实例化相应的拦截器对象,然后串成一个列表(list)。最后一个一个地调用列表中的拦截器。
拦截器的运行流程
1、对Action进行预处理。(正序运行)
2、拦截器自身决定该不该运行兴许的拦截器(由invoke()方法的返回值决定)。
3、对Action进行后期处理。
(倒序运行)
源代码:自己定义拦截器
方法一:实现Interceptor接口。重写其方法
package org.Test.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class TestInterceptor1 implements Interceptor { //实现Interceptor接口
public TestInterceptor1() { // 构造方法,server启动时就生成一个interceptor实例
System.out.println("TestInterceptor1 cons");
}
@Override
public void destroy() { // 相似于析构方法,用于释放资源
System.out.println("TestInterceptor1 destory");
}
@Override
public void init() { // server启动时被调用来初始化一些相关资源,相似于构造方法
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()方法
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
<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的定义
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。
来一张图理解
struts2学习笔记(5)---自己定义拦截器的更多相关文章
- Struts2学习笔记四:深入拦截器
一:拦截器的工作原理 拦截器的执行过程可以类比filter过滤器,ActionInvocation实例执行过程中,先执行action实例上引用的拦截器们,然后才执行action实例处理请求,返回res ...
- struts2学习笔记(六)—— 拦截器
一.拦截器概述 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作.拦截器是AOP的一种实现策略. 在We ...
- struts2学习笔记(5)拦截器
继承AbstractInterceptor类,在类中完成拦截器的功能,只需实现intercept方法即可,提供了init()和destroy()的空实现 示例:显示执行action所用的时间 ①在sr ...
- struts2视频学习笔记 18(自定义拦截器)
课时18 自定义拦截 因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defa ...
- SprimgMVC学习笔记(十)—— 拦截器
一. 什么是拦截器? Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录 ...
- SpringMVC框架学习笔记(6)——拦截器
SpringMVC拦截器需要实现接口HandlerInterceptor 有3个方法,分别在请求处理前.请求处理后和在DispatcherServlet处理后执行 实现代码: package inte ...
- Struts2学习笔记 - Action篇<定义逻辑Action>
有三种方法可以使一个Action处理多个请求 动态方法调用DMI 定义逻辑Acton 在配置文件中使用通配符 这文章就谈论一下定义逻辑Action 这里主要关注的是struts.xml配置文件,一般情 ...
- struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...
- Struts2学习笔记(拦截器配置添加)
一.拦截器工作原理: 根据Struts2的工作原理图,拦截器在action执行前进行顺序调用,之后执行Action并返回结果字符串,再逆序调用拦截器.(结构类似递归方式...)大部分时候,拦截器方法都 ...
随机推荐
- poj1062
经典的图论建模题: 先拿开的等级问题不看: 每个物品本身的价格就是有一个自定义源点到这个点距离: 有了A物品B物品优惠为W就代表由B到A的有向路权值为W: 最后的最小花费就是源点的点1的最短路径(酋长 ...
- RPi 2B python opencv camera demo example
/************************************************************************************** * RPi 2B pyt ...
- C++学习笔记:Vector容器
vector v:初始化一个0大小的向量 vector v(10):初始化一个10个大小的向量 push_back:增加一个元素 pop:删除一个元素,不返回 front:返回第一个元素 back:返 ...
- 文件上传利器JQuery上传插件Uploadify
在做日常项目中,经常在后台需要上传图片等资源文件,之前使用过几次这个组件,感觉非常好用 ,但是每次使用的时候都是需要经过一番查阅,所以还不如记住在这里,以后使用的时候就翻翻. 他的官方网站如下:htt ...
- 关于SQL中的Update语句
今天在SQL数据库操作时需要将一张表中的数据Update到另一张表中去, 可是用我以往的写法确怎么也不能成功.代码如下: update table1 a set a.Col1=b.Col2 from ...
- openvpn文本验证模式配置
证书模式要为每个客户端生成一个证书,虽说安全性较好,但是比较麻烦,可以配置成用户名/密码的验证模式,这样就比较方便了,我这里用最简单的文本验证模式. 一.安装openvpn 不多说了,之前有篇文章已经 ...
- 609C Load Balancing
题意: ”平均数“的意思是:最大数和最小数之间的差值为0或1: 先求“平均”数组,再相减. #include<iostream> #include<cstdlib> #incl ...
- ubuntu启用root用户
在安装Ubuntu时系统会提示你创建一个用户,但是该用户不具备ROOT权限.但是此时系统是有root用户的,root密码是随机的,如果你想使用root用户需要更改root密码.用你安装系统时创建的用户 ...
- MyEclipse10 Tomcat7 JDK1.7 配置
第一步.MyEclipse10 Tomcat7 JDK1.7下载 MyEclipse10http://downloads.myeclipseide.com/downloads/products/ewo ...
- Navicat通过云主机内网连接阿里云RDS
背景 公司为了安全起见,RDS设置只允许阿里云主机的内网端可以访问.这就意味,如果要操作RDS就需要连接到云主机上之后通过mysql shell操作.操作起来很复杂麻烦,今天看同事用Navicat f ...