拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制。
来回顾一下官方给出的Struts2系统架构图中关于拦截器的部分,如下图所示:
图6.1 拦截器示意图
这个图清晰的描述出了拦截器的运行地位,就是用来负责在Action执行之前和Result执行之后处理一些功能的类。也就是说,上图示意了有3个拦截器的类,分别是Interceptor1、Interceptor2和Interceptor3,它们分别执行不同的功能处理,而运行的时机就是在Action执行之前和Result执行之后。
另外一个要注意的是这些拦截器的执行顺序,在Action执行之前执行的拦截器是按照Interceptor1、Interceptor2和Interceptor3的顺序,而在Result执行之后,再次运行拦截器的时候,是按照Interceptor3、Interceptor2和Interceptor1的顺序来运行的,刚好是反过来的。
拦截器能实现很多功能,这里先撇开具体功能不谈,从设计和程序结构上来看看,拦截器有些什么优点:
拦截器能把很多功能从Action中独立出来,大量减少了Action的代码。
比如原来Action的execute方法里面需要实现3个功能,分别称为功能一、功能二和功能三。现在有了拦截器了,可以把一部分功能从Action中拿出去,假设把功能一拿出去做成拦截器一,把功能二拿出去做成拦截器二,然后Action的execute方法就只需要执行功能三就可以了。
这样在运行的时候,会依次执行拦截器一、拦截器二,然后是Action的execute方法,也就是说照样是三个功能都执行了,但是对于Action而言,写法就会大大简化,毕竟现在Action只需要实现一个功能了。
按照上面的描述,把功能从Action中分离出来,分散到不同的拦截器里面,这样每个拦截器的功能,以及Action本身的功能都更单一了。
从Action中把功能分离出来,放到拦截器去实现,这样能把一些在多个Action中通用的代码进行模块化,封装在一个或几个拦截器里面。
当通用的功能代码被封装在拦截器里面,实现了代码模块化过后,就可以对不同的Action,根据功能需要,来配置相同的拦截器了。
这大大提高了拦截器所实现的功能的重用性,还变相实现了装配式和可插拔式的体系结构,使得整个系统结构变得更灵活。
Struts2通过拦截器实现了AOP(面向切面编程),AOP是一种编程范式,它是一种分散实现关注功能的编程方法。
拦截器将通用需求功能从不相关的Action之中分离出来,能够使得很多Action共享同一个行为,一旦行为发生变化,不必修改很多Action,只要修改这个行为就可以了。
小提示:有web开发经验的朋友看到这里,一定会说,这不就类似于Filter么?过滤器也可以做这些事啊。没错,拦截器和Filter确实有相似之处,但是Interceptor相比于Filter具有更强大的功能,比如拦截器与Servlet的API无关,比如拦截器可以访问到值栈等等。
回忆一下,在前面的示例中,在运行Action的execute方法的时候,会发现Action的属性已经有值了,而且这些值跟用户请求中的参数值时一样的。
这说明,在execute方法之前,有人偷偷的把用户请求中的参数值和Action的属性做了一个对应,并且把请求中的参数赋值到了Action的属性上,这个功能就是由缺省配置的拦截器来实现的。
这些缺省配置的拦截器,称之为预定义的拦截器,Struts2预定义了很多这样的拦截器,具体的在下一节详细讲述。
我们还可以编写自己需要的拦截器类,称之为自定义拦截器,它的具体功能就根据需要,由我们自行实现了。
作者博客:http://sishuok.com/forum/blogPost/list/3983.html
作者ajava空间:http://ajava.org/space-uid-2358.html