Struts2(四)使用Struts2中的拦截器

来源:互联网 发布:电脑摄像头全屏软件 编辑:程序博客网 时间:2024/06/05 23:42

一、拦截器及拦截器栈

1.拦截器

在Struts2的文档中提供了如图所示的体系结构图:


        从图中我们可以发现一些重要的对象,今天着重要了解的是图中的Interceptor——拦截器。
        拦截器是什么?拦截器就是一种可以在请求处理之前或者之后执行的Struts2组件,拦截器是Struts2的重要特性,Struts2框架中绝大多数功能都是由拦截器来完成的。
        在早期的mvc框架中都会把一些通用的操作(如数据的封装、类型转换、数据校验、防止表单重复提交等等)写死在核心控制器中,但是这些通用的操作不是所有的请求都需要实现,这会导致框架的灵活性不高,可扩展性低。所以针对这一点,Struts2将它的核心功能都放在了拦截器中,每一个拦截器实现一个功能,并且拦截器可以自由搭配,灵活组合。
        拦截器的方法在Action执行之前或者执行之后自动执行,从而将通用的操作动态地插入到Action执行前后,降低了系统的耦合。其实实现原理上同ServletFilter的实现原理差不多,以链式执行,对真正要执行的方法(execute())进行拦截,首先执行Action配置的拦截器,在Action和Result执行之后,拦截器再一次执行(与先前调用顺序相反),在此链式的执行过程中,任何一个拦截器都可以直接返回,从而终止余下的拦截器、Action以及Result执行。

2.拦截器栈

        如果一批拦截器经常固定在一起使用,可以将这些执行小粒度功能的拦截器定义成大粒度的拦截器栈(根据需求自由组合)。从结构上看,拦截器栈就是多个拦截器的组合。从功能上看,拦截器栈也是拦截器,同样可以和其他拦截器(或拦截器栈)组合成更大粒度的拦截器栈。

二、拦截器的应用

1.拦截器的配置

配置拦截器需要经过以下两个步骤:
(1)通过<interceptor.../>元素来定义拦截器
(2)通过<interceptor-ref../>元素来实用拦截器
struts.xml文件中配置如下:
[html] view plain copy
  1. <package name="UserPackage" namespace="/" extends="struts-default">  
  2.         <!--所有的拦截器都定义在interceptors跟标签里面-->  
  3.         <interceptors>  
  4.             <!--  
  5.                 定义拦截器   
  6.                 name:拦截器的名称,用于在action中引用  
  7.                 class:拦截器对应的类(拦截器类将在自定义拦截器中讲解)  
  8.              -->  
  9.             <interceptor name="name1" class="class1"/>  
  10.             <interceptor name="name2" class="class2"/>  
  11.             <!-- 定义拦截器栈 -->  
  12.             <interceptor-stack name="">  
  13.                 <!-- 指定引用拦截器 -->                
  14.                 <interceptor-ref name="name2"></interceptor-ref>  
  15.             </interceptor-stack>  
  16.         </interceptors>  
  17.         <!-- 定义默认拦截器引用 -->  
  18.         <default-interceptor-ref name="name1"/>  
  19.         <action name="actionName" class="className" method="methodName">  
  20.             <!-- 为action指定拦截器引用 -->  
  21.             <interceptor-ref name="name1"/>  
  22.             <!-- 省略其他 -->  
  23.         </action>  
  24.     </package>  
引用拦截器时,Struts2并不区分是拦截器还是拦截器栈,所以在定义拦截器栈时可以应用其他拦截器栈。

2.内置拦截器

        在Struts2中为我们提供了很多拦截器,下面一一介绍:
①params拦截器——将请求中的数据设置到Action中的属性上。
②staticParams拦截器——将在配置文件中通过action元素的子元素param设置的参数设置到对应的Action的属性中
③servletConfig拦截器——提供了一种将源于ServletAPI的各种对象注入到对应的Action中的简洁方法,但是Action必须实现对应的接口。
④fileUpload拦截器——将文件和元数据从多重请求(multipart/form-data)转换为常规的请求数据,以便设置到Action中的属性上。
⑤validation拦截器——用于执行数据校验
⑥workflow拦截器——提供当数据校验错误时终止执行流程的功能。
⑦exception拦截器——用来捕获异常,并且能够根据类型将异常映射到用户自定义的错误页面,该拦截器应该位于所定义拦截器中的第一个

Struts2定义了许多实用的拦截器,这里只列举了部分常用的,如果有需要还可以查阅struts-default.xml文件。

3.自定义拦截器

          在Struts2中同样支持自定义拦截器,Struts2框架中的所有拦截器都直接或者间接的实现了com.opensymphony.xwork2.interceptor.Interceptor接口。
        该接口提供了3个方法:
(1)void init()
该拦截器被初始化后,在该拦截器执行之前,系统回调该方法,此方法只执行一次。
(2)void destroy()
跟init()方法对应,在拦截器实例被销毁之前被调用
(3)String intercept(ActionInvocatioin invocation)throws Exception
该方法是用户需要实现的拦截器动作方法,该方法会返回一个字符串作为逻辑视图
        除此之外,通过继承com.opensymphony.xwork2.interceptor.AbstractInterceptor类是更加简单的一种实现拦截器的方式,AbstractInterceptor类提供了init()和destroy()方法的空实现,我们自己只需要实现intercept()方法即可