Struts2基础学习(五)—拦截器
一.概述
1.初识拦截器
Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术。比如:权限控制、日志等。我们也可以将多个Interceptor 连在一起组成Interceptor 栈。
Struts2拦截器,每个拦截器类只有一个对象实例,即采用单例模式,所有引用这个拦截器的Action都共享这一拦截器类的实例,因此在拦截器中如果使用类变量,要注意同步的问题。
注意:
(1)拦截器在访问某个Action之前或之后实施拦截。
(2)拦截器是可插拔的,是AOP的一种实现。
(3)对于Action的一些公共处理代码可以被放到拦截器中,比如权限控制、日志等。
(4)拦截器栈
A: 拦截器栈就是将拦截器按一定的顺序连结成一条链。
B: 在访问被拦截的方法或字段时,拦截器链中的拦截器救护按照之前定义的顺序被调用。
(5)实现原理
步骤一: Struts2拦截器的实现原理相对简单,当请求Struts2的Action时,Struts2会查找配置文件。
步骤二: Struts2根据配置实例化对应拦截器对象,然后串成一个列表,最后一个一个的调用列表中的拦截器。
拦截器采用责任链设计模式,在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来形成的一条链,责任链的每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行。

Struts2工作原理
(1)客户端初始化一个指向Servlet容器的请求。
(2)这个请求经过一系列的过滤器,接着StrutsPrepareAndExecuteFilter被调用,它询问ActionMapper来决定是否要调用这个某个Action。
(3)如果ActionMapper决定要调用某个Action,StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy。
(4)ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。
(5)ActionProxy创建一个ActionInvocation的实例。
(6)ActionInvocation实例使用命名模式来调用,在调用Action的前后,经过拦截器的调用。
(7)一旦Actio执行完毕,ActionInvocation负责根据struts.xml配置找到相应返回结果,返回结果通常是JSP或者FreeMaker的模板。
2.拦截器和过滤器的区别
(1)拦截器是基于Java反射机制的。
过滤器是基于函数回调的。
(2)拦截器隶属于Struts2框架,只能拦截Action,无法拦截对JSP的请求。
过滤器隶属于Web容器,可以过滤一切请求,包括JSP、Servlet、Action、HTML等。
(3)在Action的生命周期中,拦截器可以被多次调用。
过滤器只能在容器初始化时被调用一次。
二、Interceptor接口
(1)每个拦截器都是实现了com.opensymphony.xwork2.interceptor.Interceptor接口的 Java 类。
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
init: 该方法将在拦截器被创建后立即被调用,它在拦截器的生命周期内只被调用一次。
destroy: 该方法将在拦截器被销毁之前被调用,它在拦截器的生命周期内也只被调用一次。
intercept: 每拦截一个请求动作,该方法都会被调用一次。
(2)Struts 会依次调用为某个 Action 而注册的每一个拦截器的interecept 方法。
(3)每次调用interecept方法时, Struts 会传递一个ActionInvocation 接口的实例。
(4)ActionInvocation: 代表一个给定动作的执行状态, 拦截器可以从该类的对象里获得与该动作相关联的 Action 对象和 Result 对象. 在完成拦截器自己的任务之后, 拦截器将调用 ActionInvocation 对象的 invoke 方法前进到 Action 处理流程的下一个环节。
(5)还可以调用 ActionInvocation 对象的 addPreResultListener 方法给 ActionInvocation 对象“挂”上一个或多个 PreResultListener 监听器. 该监听器对象可以在动作执行完毕之后, 开始执行动作结果之前做些事情。
(6)AbstractInterceptor 类实现了 Interceptor 接口. 并为 init, destroy 提供了一个空白的实现。
(7)Struts2自带的拦截器


三、自定义拦截器
1.编写拦截器
需要实现Interceptor 接口,实现接口中的三个方法,但是Interceptor 接口有很多实现类,编写最简单的方式就是继承AbstractInterceptor类。
public class TestInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception{
System.out.println("拦截器执行1....");
invocation.invoke();
System.out.println("拦截器执行2....");
return null;
}
}
2.配置拦截器
需要在struts.xml中进行拦截器的配置。
<package name="user" extends="struts-default"> <!-- 配置拦截器 -->
<interceptors>
<interceptor name="testInterceptor" class="com.kiwi.action.TestInterceptor"></interceptor>
</interceptors> <action name="interceptAction" class="com.kiwi.action.InterceptorTestAction" method="save"> <!-- 引用拦截器 -->
<interceptor-ref name="testInterceptor"/>
<!-- 引用默认的拦截器栈 -->
<interceptor-ref name="defaultStack"/> <result name="success">/success.jsp</result>
</action> </package>
注意:
(1)如果引用了自定义拦截器时,默认拦截器将不会起作用。
(2)默认拦截器在struts-default.xml中,配置了默认拦截器,当配置了默认拦截器以后,如果不引用拦截器,那么默认拦截器将起作用。
(3)当action的拦截器比较多时,可以将多个拦截器放入一个拦截器栈中。
<package name="user" extends="struts-default"> <!-- 配置拦截器 -->
<interceptors> <interceptor name="testInterceptor" class="com.kiwi.action.TestInterceptor"></interceptor> <!-- 配置一个拦截器栈,可以包含多个拦截器的引用 -->
<interceptor-stack name="myStack">
<interceptor-ref name="testInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack> </interceptors> <action name="interceptAction" class="com.kiwi.action.InterceptorTestAction" method="save"> <!-- 引用拦截器栈 -->
<interceptor-ref name="myStack"/> <result name="success">/success.jsp</result> </action> </package>
Struts2基础学习(五)—拦截器的更多相关文章
- Struts2基础-4-2 -struts拦截器实现权限控制案例+ 模型驱动处理请求参数 + Action方法动态调用
1.新建项目,添加jar包到WEB-INF目录下的lib文件夹,并添加到builde path里面 整体目录结构如下 2.新建web.xml,添加struts2核心过滤器,和默认首页 <?xml ...
- Struts2基础-4 -struts拦截器
Struts2拦截器工作原理 拦截器围绕着 Action和 Result的执行而执行. Struts2拦截器的工作方式如图10.2所示.从上图中可以看出, Struts2拦截器的实现原理和 Servl ...
- struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...
- 【struts2】预定义拦截器
1)预定义拦截器 Struts2有默认的拦截器配置,也就是说,虽然我们没有主动去配置任何关于拦截器的东西,但是Struts2会使用默认引用的拦截器.由于Struts2的默认拦截器声明和引用都在这个St ...
- Struts2基础学习2
Struts2基础学习2 项目结构,测试页面与实体类 <%@ page language="java" contentType="text/html; charse ...
- 使用struts2中默认的拦截器以及自定义拦截器
转自:http://blog.sina.com.cn/s/blog_82f01d350101echs.html 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Acti ...
- Python基础学习五
Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...
- Struts2学习笔记五 拦截器
拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. Struts2中,拦截器是动态拦截Action调用的对象.它提供了一种机制可以使 ...
- 【Java EE 学习 69 上】【struts2】【paramsPrepareParamsStack拦截器栈解决model对象和属性赋值冲突问题】
昨天有同学问我问题,他告诉我他的Action中的一个属性明明提供了get/set方法,但是在方法中却获取不到表单中传递过来的值.代码如下(简化后的代码) public class UserAction ...
随机推荐
- 关于Mysql的索引
索引是指把你设置为索引的字段A的内容储存在一个独立区间S里,里面只有这个字段的内容.在找查这个与这个字段A的内容时会直接从这个独立区间里查找,而不是去到数据表里查找.找到的这些符合条件的字段后再读取字 ...
- 读书笔记 effective c++ Item 22 将数据成员声明成private
我们首先看一下为什么数据成员不应该是public的,然后我们将会看到应用在public数据成员上的论证同样适用于protected成员.最后够得出结论:数据成员应该是private的. 1. 为什么数 ...
- web前端页面性能
前段性能的意义 对于访问一个网站,最花费时间的并不是后端应用程序处理以及数据库等消耗的时间,而是前端花费的时间(包括请求.网络传输.页面加载.渲染等).根据web优化的黄金法则:80%的最终用户响应时 ...
- JAVA包名、类名、变量名命名规则
类名:首字母大写,其他单词中首字母大写,其他小写; 方法名:首字母小写,其他单词中首字母大写,其他小写: 变量:首字母小写,其他单词中首字母大写,其他小写: 包名:全部小写
- 数据库读写分离Amoeba
1.理解读写分离的原理 Amoeba(变形虫)项目,该开源框架于2008发布一款Amoeba for mysql软件,该软件致力于mysql的分布式数据库前端代理层,主要的作用是应用服务访问mysql ...
- Java基础之数据类型和转换
一.常见的数据类型分类 1.java中基本数据类型分为三大类,即布尔类型,字符型,数值型.其中数值型又分为整型和浮点型.引用数据类型分为类,接口,数组,枚举,注解.具体如下: 注:一个字节 = 8位 ...
- Vue学习之路---No.1(分享心得,欢迎批评指正)
首先为了打消大家对Vue.js存在的顾虑,先通过大家所熟知的JQ作为对比. 都知道JQ的语法相对简单.清楚.使用方便.功能齐全: 那么Vue.js呢,同样的,Vue.js与JQ在很多地方都是相同之处, ...
- 黑苹果引导工具 Clover 配置详解及Clover Configurator使用
黑苹果引导工具 Clover 配置详解及Clover Configurator使用 2017-03-11 14:01:40 by SemiconductorKING 转自:@三个表哥 简介: 可 ...
- 1653: [Usaco2006 Feb]Backward Digit Sums
1653: [Usaco2006 Feb]Backward Digit Sums Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 285 Solved: ...
- selenium+python 自动化中界面滚动条操作方法
虽然webdriver提供了操作浏览器的前进和后退的方法,但对于浏览器滚动条并没有提供相应的操作方法,以下使用的方法: 借助JavaScript来控制浏览器的滚动条,webdriver提供了execu ...