`
wxinpeng
  • 浏览: 581702 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

深入Struts2拦截器

阅读更多

拦截器是 Struts2的一个重要的组成部分,可以说拦截器是一个勤劳的幕后工作者, Struts2的大部分功能都有拦截器完成了,也是由于拦截器的使用,使 Struts2成为一个非常 Clean的框架。你甚至不要在自己的 Action中写任何代码,一些重要的功能框架已帮你实现,如将请求参数到 Action中属性的传递,系统 Local的设置,参数验证等。 Strus2提供了大量的拦截器的实现,这些拦截器可以满足绝大不部分需求,我们完全可以复用框架提供的拦截器,而我们仅仅需要做的工作就是简单的几行配置,即可将系统提供的拦截器或自己开发的拦截器应用到自己的系统。而 Struts2拦截器的设计使我们很容易使用拦截器,但只有了解拦截器的工作原理,才能真正了解 Struts2框架。

        工作原理: Struts2的拦截器的实现原理和过滤器的实现差不多,对你真正想执行的 execute()方法进行拦截,然后插入一些自己的逻辑。如果没有拦截器,这些要插入的逻辑就得写在你自己的 Action实现中,而且每个 Action实现都要写这些功能逻辑,这样的实现非常繁琐。而 Struts2的设计者们把这些共有的逻辑独立出来,实现成一个个拦截器,既体现了软件复用的思想,又方便程序员使用。 Struts2中提供了大量的拦截器,多个拦截器可以组成一个拦截器栈,系统为我们配置了一个默认的拦截器栈 defaultStack,具体包括那些拦截器以及他们的顺序可以在 Struts2的开发包的 struts-default.xml中找到。在每次对你的 Action execute()方法请求时,系统会生成一个 ActionInvocation对象,这个对象保存了 action和你所配置的所有的拦截器以及一些状态信息。比如你的应用使用的是 defaultStack,系统将会以拦截器栈配置的顺序将每个拦截器包装成一个个 InterceptorMapping(包含拦截器名字和对应的拦截器对象 )组成一个 Iterator保存在 ActionInvocation中。在执行 ActionInvocation invoke()方法时会对这个 Iterator进行迭代,每次取出一个 InterceptorMapping,然后执行对应 Interceptor intercept(ActionInVocation inv)方法,而 intercept(ActionInInvocation inv)方法又包含当前的 ActionInInvcation对象作为参数,而在每个拦截器中又会调用 inv invoke()方法,这样就会进入下一个拦截器执行了,这样直到最后一个拦截器执行完,然后执行 Action execute()方法 (假设你没有配置访问方法,默认执行 Action execute()方法 )。在执行完 execute()方法取得了 result后又以相反的顺序走出拦截器栈,这时可以做些清理工作。最后系统得到了一个 result,然后根据 result的类型做进一步操作。

        ActionInvocation:这是个非常重要的类 ,它是 Struts2拦截器的核心,它保存了整个拦截器栈信息。了解了 ActionInvocation的功能就等于了解了 Struts2是怎样处理请求的,所以了解它对我们了解 Struts2的执行原理非常重要。当一个请求到来,框架会根据 URL从配置文件中得到对应的 Action类,然后新建一个 Action的实例保存在 ActionInvocation中,然后会根据配置得到你的拦截器栈,然后将这些拦截器信息以你配置的顺序添加到 ActionInvocation中, ActionInvocation还包含一些其他信息,如 result配置等。现在 ActionInvocaton已经包含了所有的配置信息,然后就是怎样执行这些拦截器和 Action类了 ,所有的这些步骤从 ActionInvocation invoke()方法开始。 Invoke()方法总是取出下一个拦截器来执行。而在拦截器中又会执行 ActionInvocation invoke()方法,这样就会按拦截器配置的顺序执行完所有的拦截器,最后执行 Action对应的方法。

          实现自己的拦截器:其实实现自己的拦截器是一个相当容易的事情,我们可以随便打开框架提供的默认实现拦截器的源码看看。比如最简单的 LoggingInterceptor,可以得到开发一个拦截器所需要的步骤和所需要注意的问题。首先,我们可以继承 AbstractInterceptor类,然后重写父类的 Intercept(ActionInvocation invocation)方法,我们可以看到 intercept(ActionInvocation invocation)方法签名中抛出异常,但我们无需在实现中捕获任何异常,因为框架为我们提供了 ExceptionMappingInterceptor来处理这些异常。只要注意一定要在 intercept()方法中要调用 invocation.invoke()方法 。注意:执行 invocation.invoke()逻辑之前执行的代码会在进入拦截器栈时执行,而执行 invocation.invoke()逻辑之后的代码会在离开拦截器栈的时候执行。这样,一个拦截器就开发完了,剩下的就是将自己开发的拦截器配置到自己的应用了。

Public class MyInterceptor extends AbstractInterceptor{

           Public String intercept(ActionInvocation invocation) throws Exception{

                     DoSomeThingBeforeGoIntoNextIntercept()

                     String result = invocation.invoke();

                      DoSomeCleanThing();

           }

 

}

配置拦截器:我们可以参考 struts-default.xml中拦截器的配置,一个拦截器栈可以包括一系列拦截器,在 Strus2中对拦截器配置用 <interceptors>节点,而 <interceptors>又可以包含 <interceptor> <interceptor-stack>。在 struts-2.1.dtd中对拦截器的配置定义: <!ELEMENT interceptors (interceptor|interceptor-stack)+>,按照配置定义,我们很容易就可以配置好自己的拦截器,在 <action>节点中我们可以用 <interception-ref/>节点来应用我们配置的拦截器,但是注意:在 struts-default.xml中,框架为我们配置了默认的拦截器栈 <default-interceptor-ref name=”defaultStack”>,如果我们在 <action>节点中配置了拦截器,则默认的拦截器则不会起作用,如果该 Action需要使用该默认拦截器,则必须将该默认拦截器配上。我们还可以在 Struts.xml中配置 <default-interceptor-ref>,它会覆盖 struts-default.xml中的配置,并在整个 <package>中起作用。

分享到:
评论

相关推荐

    struts2拦截器

    struts2拦截器的教程,可以深入学习struts2的原理

    Struts2拦截器详解源码

    Interceptor拦截器详解和部分源码的指导,方便深入学习struts2,增加理解

    深入浅出struts2

    开发人员还可以通过拦截器(可以自定义拦截器或者使用Struts2提供的拦截器)来对请求进行预处理和后处理,这样一来,处理请求就变得更加模块化,从而进一步减小耦合度。模块化是一个通用的主题——可以通过插件机制...

    深入浅出Struts2(附源码)

    跟随作者一道深入Struts 2,聆听大量来之不易的经验之谈,你对Struts 2开发框架的理解和应用水平都将更上一层楼。本书适合Java Web 程序员阅读和参考 第1章 Model 2应用程序 1 1.1 Model 2概览 1 1.2 带servlet...

    深入Struts2配置

    Struts2框架中核心组件就是Action、拦截器等,Struts2框架使用包来管理Action和拦截器等。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。 在struts.xml文件中package元素用于定义包配置,每个package...

    Struts2 in action中文版

    4.3 研究内建的Struts 2拦截器 67 4.3.1 工具拦截器 67 4.3.2 数据转移拦截器 67 4.3.3 工作流拦截器 69 4.3.4 其他拦截器 72 4.3.5 内建的拦截器栈 73 4.4 声明拦截器 74 4.4.1 声明独立的拦截器和拦截器栈 74 ...

    深入Struts2的配置文件

    本部分主要介绍struts.xml的常用配置。...Struts2框架中核心组件就是Action、拦截器等,Struts2框架使用包来管理Action和拦截器等。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。 ...

    JavaWeb中Struts2拦截器深入分析(一)

    主要为大家详细介绍了JavaWeb中Struts2拦截器的功能,感兴趣的小伙伴们可以参考一下

    [Struts 2权威指南--基于WebWork核心的MVC开发(高清完整版) 1/12

    第1章 Struts 2概述,第2章 Struts 2下的HelloWorld,第3章 Struts 2基础,第4章 深入Struts 2,第5章 Struts 2的类型转换,第6章 文件的上传和下载.,第7章 Struts 2的拦截器,第8章 Struts 2的输入校验,9.2 ...

    Struts2详解,Struts2与Struts1的区别

    新手必备,看完绝对思路清晰。醍醐灌顶啊! 一. Struts2介绍 1. Struts2简介 2. Struts2和Struts1的常见区别 ... Struts2的拦截器 13. 拒绝表单重复提交 四. OGNL表达式 五. Struts2中常用标签

    深入浅出Struts2

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...

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

    在核心实现篇中,通过源码解析,帮助广大开发者从Struts 2自身的设计原理上去掌握Web层开发的要点,如数据、动作、拦截器、视图、Plugin、配置、过程;最佳实践篇介绍了一些在实战中提炼出来的针对Struts 2的扩展和...

    struts2学习笔记

    Struts2环境搭建 Struts2类型转换 Struts2输入校验 拦截器 文件的上传与下载 Struts2的国际化 深入探析 struts2与servlet API耦合方法

    非常不错的中文struts2教程[CHM]

    内容: 1、OGNL —— 数据运转的催化剂 2、Result机制,让视图更丰富 3、Struts2配置详解 4、Struts2中的Action ...7、拦截器详解 8、配置,灵活还是简单? 9、深入plugin 10、在Struts2中使用OGNL

    struts2 document

    struts2 过滤器、拦截器、ognl和标签等运用,有例子可以帮助初学者对struts2更加深入的运用起到帮助作用

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    跟随作者一道深入Struts2。聆听大量来之不易的经验之谈。你对Struts2开发框架的理解和应用水平都将更上一层楼。 Struts2权威著作 深入全面阐释Struts2的方方面面 涵盖FreeMarker、Ajax等大量相关技术 媒体推荐 ...

    尚硅谷Java视频_Struts2视频教程

    每个技术点都配备案例和代码,对于拦截器、Struts2 运行流程分析、值栈等技术点的讲授更是深入解析源代码,授之以渔。  学习完本Java视频教程,你会真正理解 Struts2 的优雅和简洁,并使你具备开发 Struts2 企业...

    一步步学习Struts2

    内容包括ognl,result机制,struts2配置详解,struts2中的action,struts2中的参数传递,标签库,拦截器的详解,深入plugin

Global site tag (gtag.js) - Google Analytics