1.拦截器:Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
WebWork中文文档解释:拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个Action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也提供了一种可以提取Action中可重用的代码的方式。
拦截器栈(Interceptor Stack):Struts2拦截器栈就是将拦截器按一定的顺序连接成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。
2.拦截器的作用:
(1).DRY原则:Dont‘t Repeat Yourself.
(2).拦截器在设计和程序结构上的优点:
拦截器能把很多功能从Action中独立出来,分散到不同的拦截器里面,减少了Action的代码。如此,拦截器和Action本身的功能都更单一了。当通用的功能代码被封装在拦截器里面(代码模块化),就可以对不同的Action,根据功能需要,来配置相应功能的拦截器了。提高了拦截器所实现的功能的重用性,也变相实现了装配式和可插拔式的体系结构,使得整个系统结构变得更灵活。
a>.简化Action的实现
b>.功能更单一
c>.通用代码模块化
d>.提高重用性
注意:
拦截器采用责任链 模式 :
(1).在责任链模式里,很多对象由每一个对象对其下一个的引用而连接起来形成一条链。
(2).责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行
3.拦截器与过滤器的区别(要深刻理解):
(1).拦截器是基于java反射和动态代理机制的,而过滤器是基于方法回调的。
(2).过滤器依赖于servletAPI,而拦截器不依赖于servletAPI。
(3).拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
(4).拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
4.struts的拦截器(预定义的拦截器:在struts-default.xml文件中)
拦截器示例1:
拦截器示例2:
5.Struts2执行原理图:
针对原理图的解释:
(1).客户端发送请求;
(2).该请求经过一系列的过滤器(Filter):其中可选过滤器ActionContextCleanUp,帮助Struts2和其他框架集成。例如:SiteMesh Plugin。
(3).接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper,来决定该请求是否需要调用某个Action。
(4).若ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。
(5).ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。
(6).ActionProxy创建一个ActionInvocation的实例。
(7).ActionInvocation实例调用Action的前后,涉及到相关拦截器(Intercepter)的调用。
(8).一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果是一个JSP或其他页面(也可以是其他的Action链)。 JSP页面展现可使用Struts2框架中的标签(该过程会涉及ActionMapper)。
在上述过程中所有的对象(Action、Interceptors、Results等)都由xwork容器中的ObjectFactory创建。
6.每个拦截器都是实现了 com.opensymphony.xwork2.interceptor.Interceptor接口的 Java 类:
init: 该方法将在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化
interecept: 每拦截一个动作请求, 该方法就会被调用一次.
destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次.
7.Intercepter接口
Struts2会依次调用程序员为某个 Action 而注册的每一个拦截器的 interecept 方法.
每次调用 interecept 方法时, Struts 会传递一个 ActionInvocation 接口的实例.
ActionInvocation: 代表一个给定动作的执行状态, 拦截器可以从该类的对象里获得与该动作相关联的 Action 对象和 Result 对象. 在完成拦截器自己的任务之后, 拦截器将调用 ActionInvocation 对象的 invoke 方法前进到 Action 处理流程的下一个环节.
还可以调用 ActionInvocation 对象的 addPreResultListener 方法给 ActionInvocation 对象 “挂” 上一个或多个 PreResultListener 监听器. 该监听器对象可以在动作执行完毕之后, 开始执行动作结果之前做些事情
AbstractInterceptor 类实现了 Interceptor 接口. 并为 init, destroy 提供了一个空白的实现
8.自定义拦截器步骤:
(1).自定义拦截器类
(2).在 struts.xml 文件中配置自定义的拦截器