Struts2 的核心——拦截器[Interceptor]
(Interceptors) 拦截器是Struts2 的核心技术之一,或许以前对Struts2中 的某些实现感到不可思议,比如说类型转化 校验 国际化 等,那么你的很 多疑问将在这里得到解答.
什么是拦截器
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
看来拦截器这东东的确很牛哦,当然拦截器本身也是一个普通的 Java 对象,而且拦截器还支持插拔的特性,不想用拦截器就不用,喜欢时再加上,不像EJB那么霸道,我想这也算是大家喜欢Struts2的一个重要原因.
提到拦截器支持插拔的特性,不得不提到Struts2中的有关拦截器的另一概念——拦截器栈[理解成拦截器链,感觉好理解点].在Struts2中允许将多个拦截器排列在一起使之成为一个集合,在访问被拦截的Action时就会按照其定义顺序被调用.
拦截器执行原理
还记得那张 big-picture吗?[见附件图片一]
注意看拦截器(interceptors)那部分,拦截器穿插在Action的执行前后,最后产生Result.
大家可以这样来看:
[见附件图片二]
看来Struts2 的拦截器的实现还是相对简单的.
配置拦截器
要想让拦截器工作就必须先对拦截器进行配置,配置方式和配置其它元素差不多.为了方便,也为了满足大部分需求Struts2 提供了默认的的配置项.默认的拦截器定义在 Struts-Default package中,所以只要Action所在的package继承了Struts-Default就配置了默认的拦截器,然后就看到Struts2 很神奇的为你做很多工作了.
在配置新的拦截器之前,首先要对它定义.在配置文件中使用<interceptors.../> <interceptor.../> 标签,而且<interceptors../> 和 <interceptor>都标签要放在<package></package>标签里.例如在Struts2-core-2.2.1.jar 里struts-default.xml中拦截器是这样配置的:
<interceptors>
<interceptor name="alias"
class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<interceptor name="autowiring"
class="com.opensymphony.xwork2.interceptor
.ActionAutowiringInterceptor"/>
<interceptors/>
这样拦截器的定义就OK了(这里只列举了部分).
要想在Action中应用了所需拦截器还需要把拦截器分配到Action.例如你可以这样来让你的拦截器工作:
<action name="index" class="com.lele.struts2.MyAction">
<interceptor-ref name="alias">
<interceptor-ref name="autowiring">
<result>view.jsp</result>
</action>
这里在 index这个Action下就配置了先前定义的 alias 和 autowiring拦截器.理论上在一个Action下配置拦截器的数量是不受限制的.但应注意的是配置拦截器的顺序和拦截器的执行顺序.
拦截器栈
这里出现一个问题: 现在是一个Action使用了两个拦截器,假设又有一个Action要使用这两个拦截器,那这两个拦截器又要配置一遍,那假设每次都要配置5个拦截器呢?每个Action下都配置一遍吗? NO!强烈拒绝编写这种程序代码.在Struts2中提供了拦截器栈的方式来方便管理拦截器的配置.现在就来看看拦截器栈的配置:
<interceptors>
<interceptor name="alias"
class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<interceptor name="autowiring"
class="com.opensymphony.xwork2.interceptor
.ActionAutowiringInterceptor"/>
<!-- 拦截器栈 --->
<interceptor-stack name="myStack">
<interceptor-ref name="alias"/>
<interceptor-ref name="autowiring"/>
</interceptor-stack>
<interceptors/>
这样一个拦截器栈就定义好了,当然理论上你可以定义无限多个拦截器栈,但这里也要注意拦截器栈中的拦截器的顺序.那么在使用拦截器栈还需要在定义Action时配置拦截器栈,拦截器栈和拦截器的配置相当通用,多么好的配置方式啊.ok,来看看在拦截器栈的应用配置:
<action name="index" class="com.lele.struts2.MyAction">
<interceptor-ref name="myStack">
<result>view.jsp</result>
</action>
其实在拦截器栈中不止能包含拦截器还能包含其它拦截器栈,但被包含的拦截器栈必须已经被定义.这样就提高了复用性.
默认拦截器和拦截器栈
现在在来看看我们平时写的Struts2程序,我们在配置Action时我们并没有为某个Action配置拦截器(或拦截器栈)但Struts2能帮我们做很多工作,这又是为何?
Struts2 考虑到编程的方便性在在Struts2的核心包的struts-default.xml中已经为我们定义好了默认的拦截器栈,这样使得编程工作更加简明了.那么现在我们根据自己的业务需要,我们定义了拦截器栈,我们怎样让自己定义的拦截器栈成为默认拦截器栈呢?
您只需要在<package>标签中增加:
<default-interceptor-ref name="defaultStack"/>
这样我们自己定义的defaultStack就成为了默认拦截器了,但是要知道这样就把Struts2提供给我们的默认拦截器给蔽掉了.
同样我们也可以定义默认的拦截器,方式和定义默认拦截器栈一样.
OK,就到这里了,能理解Struts2中的拦截器吗?下面章节我会说到拦截器的实现,怎样自己动手写自己的拦截器,还有Struts2中我认为比较重要的拦截器会和大家一起了解一下.
大家有什么不了解的可以和我联系,欢迎讨论.
我的联系方式:
Mail: wanglehappy9112@gmail.com
MSN: wang4717@live.cn
QQ: 471776739
PS:
貌似 JavaEye中不能直接插入本地图片,不知是否支持,要不就是我这个小小菜鸟没有发现
只好当作附件发给大家了.
在这里我把文章和图片都放在这了,方便大家阅读.
相关推荐
Struts 2是Java Web开发中的一个开源框架,它的核心机制之一就是拦截器(Interceptor)。拦截器在MVC模式中扮演着重要的角色,允许开发者在请求处理前后插入自定义的逻辑,增强了系统的可扩展性和灵活性。 ### 拦截...
总的来说,Struts2拦截器提供了一种强大的机制,使得开发者可以轻松地扩展和控制应用程序的行为,而不需要修改核心业务代码。通过合理的拦截器配置,我们可以实现诸如性能监控、事务管理、异常处理等多种功能,大大...
拦截器是Struts2的核心组件之一,它基于AOP(面向切面编程)的概念,为框架提供了高度的灵活性和可扩展性。以下是关于Struts2拦截器的基础知识的详细说明: 1. **拦截器的定义与作用**: - 拦截器是Struts2框架中...
总结起来,这个"Struts拦截器案例——登陆"涵盖了Struts2拦截器的基本使用、登录验证、数据库操作以及异常处理等多个方面。通过学习这个案例,开发者可以更好地理解和掌握Struts2框架中的拦截器机制,从而在实际项目...
拦截器是Struts2的核心组件之一,它们在Action调用前后执行,允许开发者插入额外的功能,如日志、权限检查、性能度量等,而无需修改Action本身。这个“Struts2简单的拦截器示例”是为初学者设计的,旨在帮助理解如何...
Struts2的架构设计采用了拦截器(Interceptor)机制,允许开发人员定义一系列的拦截器来处理HTTP请求和响应。其工作流程大致如下: 1. 用户的浏览器发起一个HTTP请求。 2. 该请求被Struts2框架捕获,请求会被封装...
2. **创建拦截器**:在saif-0.1.jar中,开发者可能已经定义了一些继承自`org.apache.struts.interceptor.Interceptor`接口的类。这些类实现了拦截器的逻辑,如`doIntercept()`方法。 3. **配置拦截器**:在struts-...
首先,Struts2的核心在于它的拦截器(Interceptor)机制。拦截器是Struts2的一个强大特性,它们在Action调用前后执行,可以处理诸如验证、日志、事务管理等通用任务。通过灵活配置,开发者可以构建出满足各种需求的...
07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 Struts 2的新表单标志的使用 13 Struts 2与AJAX
拦截器(Interceptor)是Struts2的另一个重要组成部分,它允许在Action执行前后插入自定义逻辑,如日志记录、权限验证等。 三、MVC模式 在Struts2中,Model代表业务逻辑,View负责展示数据,Controller则协调Model...
07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 trus 2的新表单标志的使用 13 Struts 2与AJAX
Struts 2.0系列(MAX),pdf格式,全...Struts 2的基石——拦截器(Interceptor) 在Struts 2中实现IoC 在Struts 2中实现文件上传 在Struts 2中实现CRUD Struts 2中的OGNL Strus 2的新表单标志的使用 Struts 2与AJAX
同时,熟悉Struts2的拦截器机制和DMI功能,可以更方便地实现业务逻辑的扩展和复用。对于源码的探索,有助于深入理解Struts2的工作原理,提升问题排查和性能优化的能力。在实际工作中,结合工具如IDEA的插件,可以...
07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 trus 2的新表单标志的使用 13 Struts 2与AJAX Struts2中用...
Interceptor是拦截器,类似于AOP(面向切面编程)的概念,允许在Action调用前后插入自定义逻辑,如日志记录、权限检查等。Result则负责将Action执行后的结果呈现给用户,可以是JSP、JSON、XML等不同格式。 Struts2...
首先,Struts2的出现是为了解决Struts1在MVC模式中的局限性,它通过提供更灵活的配置、更强大的拦截器(Interceptor)体系以及与Spring等其他框架的无缝集成,提升了开发效率和应用性能。框架的核心组件包括Action、...
### Xwork——Struts2核心 #### Xwork与Struts2的关系 Xwork作为Struts2的核心组件之一,它的设计理念和技术实现对整个Struts2框架起着决定性的作用。Struts2是一个流行的Java Web开发框架,它采用了MVC(Model-...