Struts2(四)使用Struts2中的拦截器
来源:互联网 发布:淘宝店铺详情页模板 编辑:程序博客网 时间:2024/05/18 00:00
一、拦截器及拦截器栈
1.拦截器
在Struts2的文档中提供了如图所示的体系结构图:
拦截器是什么?拦截器就是一种可以在请求处理之前或者之后执行的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
- Struts2(四)使用Struts2中的拦截器
- Struts2(四)使用Struts2中的拦截器
- struts2中的拦截器使用
- struts2(四)拦截器
- struts2中的拦截器
- Struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- Struts2中的拦截器
- struts2中的拦截器
- Struts2中的拦截器
- Struts2中的拦截器
- opengl debug tools
- 感想京东
- 近期生活小结
- Java对hbase的操作
- 如何经营好自己的人际圈子
- Struts2(四)使用Struts2中的拦截器
- 闭包
- 【二分查找】找出两个长度相等的数组中所有值的 “上中位数”
- LEETCODE: Word Break
- 深度阅读之德怀恩-韦德:闪电侠逆鳞 詹韦演暗战
- 使用 EclEmma 进行覆盖测试
- 如何治疗癫痫病
- 对消息推送平台的思考(1) - 利用第三方推送平台做notify实现推送消息
- 关于GCJ02和WGS84坐标系的一点实验