struts拦截器的详解

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 文件中配置自定义的拦截器

struts拦截器的详解,布布扣,bubuko.com

时间: 08-15

struts拦截器的详解的相关文章

Struts拦截器

Struts拦截器和过滤器的区别: 过滤器:对所有的东西都过滤.包括css,.js,.jpg等. 拦截器:只对action拦截.是struts工具. 一.拦截器配置. 1.创建一个类,让其继承自AbstractInterceptor 2.配置struts.xml 1)添加<interceptors>配置节,添加拦截器配置. 2)在action中引用,<interceptors>中的配置. 注意:1.在action中需要添加defaultStack引用 2.在建<interce

Android开发之AudioManager(音频管理器)详解

AudioManager简介: AudioManager类提供了访问音量和振铃器mode控制.使用Context.getSystemService(Context.AUDIO_SERVICE)来得到这个类的一个实例. 公有方法: Public Methods int abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl) 放弃音频的焦点. void adjustStreamVolume(int streamType, int dir

Yarn 调度器Scheduler详解

理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资源的就是Scheduler.其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景.为此,Yarn提供了多种调度器和可配置的策略供我们选择. 一.调度器的选择 在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,FairS ched

rpm包管理器用法详解

1,简介 rpm(Red Hat Pakage Manager),现在更名为RPM Package Manager,是一款业界公认的标准包管理器.所谓包管理器,就是把编译好的应用软件的各组成部分组成一个或几个程序包文件,从而实现程序包的安装,升级,卸载和查询等相关操作.广泛应用与redhat,centos,opensuse等发行版本上.当然,Dibian系列用的包管理器是dpkg. 2.rpm的组成 二进制程序,配置文件,帮助手册,以及如何组织,安装等其他元数据信息,不过,rpm都能理解. 3,

(转)Struts 拦截器

一.拦截器是怎么实现: 实际上它是用Java中的动态代理来实现的 二.拦截器在Struts2中的应用 对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作.像params拦截器将http请求中参数解析出来赋值给Action中对 应的属性.Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递 给Action……struts2内置的拦截器有很多,在此我就不一一列举了. 那么怎么在struts2中定义自己的拦

android事件拦截处理机制详解

前段时间刚接触过android手机开发,对它的事件传播机制不是很了解,虽然网上也查了相关的资料,但是总觉得理解模模糊糊,似是而非,于是自己就写个小demo测试了一下.总算搞明白了它的具体机制.写下自己的结论,分享之,希望对初学android的人有所帮助 布局效果如图所示: 图1 参照上图先说说具体得到的结论: 1) onInterceptTouchEvent负责对touch事件进行拦截,对于嵌套的view最先执行的是事件拦截方法的是最外层的那个view的onInterceptTouchEvent

keepalived高可用调度器配置详解

一.VRRP概述 1.VRRP协议 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议,1998年已推出正式的RFC2338协议标准.VRRP广泛应用在边缘网络中,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以及及时在实际第一跳路由器使用失败的情形下仍能够维护路由器间的连通性. 2.vrrp术语 参考:H3C VRRP技术白皮书 虚拟路由

GridBagLayout布局管理器应用详解

http://yyzjava.iteye.com/blog/1181552 很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够自由改变一个程序界面的大小,通过托拽生成的界面往往是不提供这个功能的,因为定制的界面一旦改变形状,组件间的布局会变得杂乱无章. Java中的布局管理器应用了策略者模式(Strategy),为不同类型的组件布局提供了很好的模型

PHPFastCGI进程管理器PHP-FPM详解

PHP-FPM是一个PHPFastCGI进程管理器,是只用于PHP的.      PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中.必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用.      现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去.相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行