`

Struts2 的核心——拦截器[Interceptor]

阅读更多

 

 

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中不能直接插入本地图片,不知是否支持,要不就是我这个小小菜鸟没有发现

只好当作附件发给大家了.

在这里我把文章和图片都放在这了,方便大家阅读.

 

  • 大小: 79.3 KB
  • 大小: 14.7 KB
4
2
分享到:
评论
2 楼 wang4717 2010-11-07  
CoderDream 写道
JavaEye上传图片很容易哦!【编辑模式】直接点上传附件,然后插入图片就可以了。图文并茂,看起来更好!


恩,谢谢哦,这个还真不知道。 这篇文章决定不添加图片上去了,因为那张Struts的图片有点大,很占篇幅。欢迎回复。
1 楼 CoderDream 2010-11-06  
JavaEye上传图片很容易哦!【编辑模式】直接点上传附件,然后插入图片就可以了。图文并茂,看起来更好!

相关推荐

    Struts 2的基石——拦截器(Interceptor)

    Struts 2是Java Web开发中的一个开源框架,它的核心机制之一就是拦截器(Interceptor)。拦截器在MVC模式中扮演着重要的角色,允许开发者在请求处理前后插入自定义的逻辑,增强了系统的可扩展性和灵活性。 ### 拦截...

    Struts2的拦截器——Struts2拦截器的基础知识.pptx

    拦截器是Struts2的核心组件之一,它基于AOP(面向切面编程)的概念,为框架提供了高度的灵活性和可扩展性。以下是关于Struts2拦截器的基础知识的详细说明: 1. **拦截器的定义与作用**: - 拦截器是Struts2框架中...

    Struts拦截器案例——登陆

    总结起来,这个"Struts拦截器案例——登陆"涵盖了Struts2拦截器的基本使用、登录验证、数据库操作以及异常处理等多个方面。通过学习这个案例,开发者可以更好地理解和掌握Struts2框架中的拦截器机制,从而在实际项目...

    Struts2简单的拦截器示例

    拦截器是Struts2的核心组件之一,它们在Action调用前后执行,允许开发者插入额外的功能,如日志、权限检查、性能度量等,而无需修改Action本身。这个“Struts2简单的拦截器示例”是为初学者设计的,旨在帮助理解如何...

    理解拦截器用于在某个方法或字段被访

    谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链

    Struts2+技术内幕——深入解析Struts2架构设计与实现原理

    首先,Struts2的核心在于它的拦截器(Interceptor)机制。拦截器是Struts2的一个强大特性,它们在Action调用前后执行,可以处理诸如验证、日志、事务管理等通用任务。通过灵活配置,开发者可以构建出满足各种需求的...

    在struts1中使用拦截器——saif-0.1.jar

    2. **创建拦截器**:在saif-0.1.jar中,开发者可能已经定义了一些继承自`org.apache.struts.interceptor.Interceptor`接口的类。这些类实现了拦截器的逻辑,如`doIntercept()`方法。 3. **配置拦截器**:在struts-...

    个人认为目前最完备的Struts2教程

    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

    Struts2——教程

    拦截器(Interceptor)是Struts2的另一个重要组成部分,它允许在Action执行前后插入自定义逻辑,如日志记录、权限验证等。 三、MVC模式 在Struts2中,Model代表业务逻辑,View负责展示数据,Controller则协调Model...

    struts2.0中文教程

    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)

    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 ——2、各种Action写法和配置

    同时,熟悉Struts2的拦截器机制和DMI功能,可以更方便地实现业务逻辑的扩展和复用。对于源码的探索,有助于深入理解Struts2的工作原理,提升问题排查和性能优化的能力。在实际工作中,结合工具如IDEA的插件,可以...

    Struts2.0中文教程权威版

    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中用...

    Struts2 技术内幕——深入解析Struts2架构设计.pdf.zip

    Interceptor是拦截器,类似于AOP(面向切面编程)的概念,允许在Action调用前后插入自定义逻辑,如日志记录、权限检查等。Result则负责将Action执行后的结果呈现给用户,可以是JSP、JSON、XML等不同格式。 Struts2...

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理.zip

    首先,Struts2的出现是为了解决Struts1在MVC模式中的局限性,它通过提供更灵活的配置、更强大的拦截器(Interceptor)体系以及与Spring等其他框架的无缝集成,提升了开发效率和应用性能。框架的核心组件包括Action、...

    struts2实现的简单登陆 附加拦截器防止重复提交

    为此,我们可以使用Struts2的拦截器(Interceptor)机制。拦截器是在Action执行前后进行额外操作的组件,它们可以被链式调用,形成一个拦截器栈。 在这个项目中,我们添加了一个特定的拦截器,可能命名为...

    struts 拦截器实现权限拦截

    拦截器是Struts2框架中的一个重要组成部分,它们在Action调用前后执行,可以用于实现各种功能,如日志、事务管理以及我们的重点——权限拦截。 权限拦截是Web应用安全机制的重要一环,它确保只有具备特定权限的用户...

    spring-mybatis-struts2-master ——demo

    3. 配置Struts2:配置struts.xml,定义Action及其结果,设置拦截器栈。 4. 配置MyBatis:创建mybatis-config.xml,定义数据源、事务工厂,以及Mapper接口和XML映射文件的路径。 5. 创建实体类、Mapper接口和XML映射...

    Struts2实验案例项目

    1. **Struts2架构**:Struts2基于拦截器(Interceptor)的设计模式,使得扩展性和灵活性非常高。它通过配置Action、Result和Interceptor来处理HTTP请求,将业务逻辑与展示逻辑分离。 2. **Action类**:Action类是...

Global site tag (gtag.js) - Google Analytics