`

《研磨struts2》 第六章 拦截器 之 6.1 拦截器基础

 
阅读更多

6.1  拦截器基础

6.1.1  拦截器是什么

拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制。

       来回顾一下官方给出的Struts2系统架构图中关于拦截器的部分,如下图所示:

图6.1 拦截器示意图

       这个图清晰的描述出了拦截器的运行地位,就是用来负责在Action执行之前和Result执行之后处理一些功能的类。也就是说,上图示意了有3个拦截器的类,分别是Interceptor1、Interceptor2和Interceptor3,它们分别执行不同的功能处理,而运行的时机就是在Action执行之前和Result执行之后。

       另外一个要注意的是这些拦截器的执行顺序,在Action执行之前执行的拦截器是按照Interceptor1、Interceptor2和Interceptor3的顺序,而在Result执行之后,再次运行拦截器的时候,是按照Interceptor3、Interceptor2和Interceptor1的顺序来运行的,刚好是反过来的。

6.1.2  拦截器的优点

拦截器能实现很多功能,这里先撇开具体功能不谈,从设计和程序结构上来看看,拦截器有些什么优点:

  • 简化Action的实现

拦截器能把很多功能从Action中独立出来,大量减少了Action的代码。

比如原来Action的execute方法里面需要实现3个功能,分别称为功能一、功能二和功能三。现在有了拦截器了,可以把一部分功能从Action中拿出去,假设把功能一拿出去做成拦截器一,把功能二拿出去做成拦截器二,然后Action的execute方法就只需要执行功能三就可以了。

这样在运行的时候,会依次执行拦截器一、拦截器二,然后是Action的execute方法,也就是说照样是三个功能都执行了,但是对于Action而言,写法就会大大简化,毕竟现在Action只需要实现一个功能了。

  • 功能更单一

按照上面的描述,把功能从Action中分离出来,分散到不同的拦截器里面,这样每个拦截器的功能,以及Action本身的功能都更单一了。

  • 通用代码模块化

从Action中把功能分离出来,放到拦截器去实现,这样能把一些在多个Action中通用的代码进行模块化,封装在一个或几个拦截器里面。

  • 提高重用性

当通用的功能代码被封装在拦截器里面,实现了代码模块化过后,就可以对不同的Action,根据功能需要,来配置相同的拦截器了。

这大大提高了拦截器所实现的功能的重用性,还变相实现了装配式和可插拔式的体系结构,使得整个系统结构变得更灵活。

  • 实现AOP

Struts2通过拦截器实现了AOP(面向切面编程),AOP是一种编程范式,它是一种分散实现关注功能的编程方法。

拦截器将通用需求功能从不相关的Action之中分离出来,能够使得很多Action共享同一个行为,一旦行为发生变化,不必修改很多Action,只要修改这个行为就可以了。

小提示:有web开发经验的朋友看到这里,一定会说,这不就类似于Filter么?过滤器也可以做这些事啊。没错,拦截器和Filter确实有相似之处,但是Interceptor相比于Filter具有更强大的功能,比如拦截器与Servlet的API无关,比如拦截器可以访问到值栈等等。

6.1.3  拦截器有什么

回忆一下,在前面的示例中,在运行Action的execute方法的时候,会发现Action的属性已经有值了,而且这些值跟用户请求中的参数值时一样的。

这说明,在execute方法之前,有人偷偷的把用户请求中的参数值和Action的属性做了一个对应,并且把请求中的参数赋值到了Action的属性上,这个功能就是由缺省配置的拦截器来实现的。

这些缺省配置的拦截器,称之为预定义的拦截器,Struts2预定义了很多这样的拦截器,具体的在下一节详细讲述。

我们还可以编写自己需要的拦截器类,称之为自定义拦截器,它的具体功能就根据需要,由我们自行实现了。

 

私塾在线网站原创《研磨struts2》系列

转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4057.html

欢迎访问http://sishuok.com获取更多内容

19
5
分享到:
评论
1 楼 关耳丘山川 2013-04-11  
写的很好,我一口气看了好几章

相关推荐

Global site tag (gtag.js) - Google Analytics