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

来源:互联网 发布:淘宝店铺详情页模板 编辑:程序博客网 时间:2024/05/18 00:00

一、拦截器及拦截器栈

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文件中配置如下:
<package name="UserPackage" namespace="/" extends="struts-default"><!--所有的拦截器都定义在interceptors跟标签里面--><interceptors><!--定义拦截器 name:拦截器的名称,用于在action中引用class:拦截器对应的类(拦截器类将在自定义拦截器中讲解) --><interceptor name="name1" class="class1"/><interceptor name="name2" class="class2"/><!-- 定义拦截器栈 --><interceptor-stack name=""><!-- 指定引用拦截器 --><interceptor-ref name="name2"></interceptor-ref></interceptor-stack></interceptors><!-- 定义默认拦截器引用 --><default-interceptor-ref name="name1"/><action name="actionName" class="className" method="methodName"><!-- 为action指定拦截器引用 --><interceptor-ref name="name1"/><!-- 省略其他 --></action></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()方法即可
0 0
原创粉丝点击