`
shaohan126448
  • 浏览: 113055 次
  • 来自: 北京
社区版块
存档分类
最新评论

struts2拦截器实现原理

阅读更多

1. 什么是拦截器

 

拦截器,在AOPAspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。

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

 

2.拦截器实现原理

 

 

大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。

 

3.拦截器的配置

 

Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。可以到struts2struts2-core-2.1.8.jar包内的struts-default.xml查看关于默认的拦截器与拦截器链的配置,如下:

Xml代码 复制代码
  1. <interceptor-stack name="defaultStack">  
  2.     <interceptor-ref name="exception"/>  
  3.     <interceptor-ref name="alias"/>  
  4.     <interceptor-ref name="servletConfig"/>  
  5.     <interceptor-ref name="i18n"/>  
  6.     <interceptor-ref name="prepare"/>  
  7.     <interceptor-ref name="chain"/>  
  8.     <interceptor-ref name="debugging"/>  
  9.     <interceptor-ref name="scopedModelDriven"/>  
  10.     <interceptor-ref name="modelDriven"/>  
  11.     <interceptor-ref name="fileUpload"/>  
  12.     <interceptor-ref name="checkbox"/>  
  13.     <interceptor-ref name="multiselect"/>  
  14.     <interceptor-ref name="staticParams"/>  
  15.     <interceptor-ref name="actionMappingParams"/>  
  16.     <interceptor-ref name="params">  
  17.       <param name="excludeParams">dojo\..*,^struts\..*</param>  
  18.     </interceptor-ref>  
  19.     <interceptor-ref name="conversionError"/>  
  20.     <interceptor-ref name="validation">  
  21.         <param name="excludeMethods">input,back,cancel,browse</param>  
  22.     </interceptor-ref>  
  23.     <interceptor-ref name="workflow">  
  24.         <param name="excludeMethods">input,back,cancel,browse</param>  
  25.     </interceptor-ref>  
  26. </interceptor-stack>  
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="debugging"/>
                <interceptor-ref name="scopedModelDriven"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                  <param name="excludeParams">dojo\..*,^struts\..*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
            </interceptor-stack>

struts.xml文件中定义拦截器,拦截器栈:

Xml代码 复制代码
  1. <package name="my" extends="struts-default" namespace="/manage">  
  2.   
  3.         <interceptors>  
  4.   
  5.         <!-- 定义拦截器 -->  
  6.   
  7.         <interceptor name="拦截器名" class="拦截器实现类"/>  
  8.   
  9.         <!-- 定义拦截器栈 -->  
  10.   
  11.         <interceptor-stack name="拦截器栈名">  
  12.   
  13.              <interceptor-ref name="拦截器一"/>  
  14.   
  15.              <interceptor-ref name="拦截器二"/>  
  16.   
  17.         </interceptor-stack>  
  18.   
  19.         </interceptors>  
  20.   
  21.         ......   
  22.   
  23. </package>  
<package name="my" extends="struts-default" namespace="/manage">

        <interceptors>

        <!-- 定义拦截器 -->

        <interceptor name="拦截器名" class="拦截器实现类"/>

        <!-- 定义拦截器栈 -->

        <interceptor-stack name="拦截器栈名">

             <interceptor-ref name="拦截器一"/>

             <interceptor-ref name="拦截器二"/>

        </interceptor-stack>

        </interceptors>

        ......

</package>

 

 4.使用拦截器

 

一旦定义了拦截器和拦截器栈后,就可以使用这个拦截器或拦截器栈来拦截Action了。拦截器的拦截行为将会在Actionexceute方法执行之前被执行。

Xml代码 复制代码
  1. <action name="userOpt" class="org.qiujy.web.struts2.action.UserAction">  
  2.   
  3.             <result name="success">/success.jsp</result>  
  4.             <result name="error">/error.jsp</result>  
  5.             <!-- 使用拦截器,一般配置在result之后, -->  
  6.              <!-- 引用系统默认的拦截器 -->  
  7.              <interceptor-ref name="defaultStack"/>  
  8.             <interceptor-ref name="拦截器名或拦截器栈名"/>  
  9.   
  10. </action>  
<action name="userOpt" class="org.qiujy.web.struts2.action.UserAction">

            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
            <!-- 使用拦截器,一般配置在result之后, -->
             <!-- 引用系统默认的拦截器 -->
             <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="拦截器名或拦截器栈名"/>

</action>

 

 此处需要注意的是,如果为Action指定了一个拦截器,则系统默认的拦截器栈将会失去作用。为了继续使用默认拦截器,所以上面配置文件中手动引入了默认拦截器。

 

5.自定义拦截器

 

 

 

 

 

 

5.2.使用自定义拦截器

 

两个步骤:

l 通过<interceptor …>元素来定义拦截器。

l 通过<interceptor-ref …>元素来使用拦截器。

 

 

作为“框架(framework)”,可扩展性是不可或缺的。虽然,Struts 2为我们提供如此丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰相反,在Struts 2自定义拦截器是相当容易的一件事。

 

5.1) 实现拦截器类

所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。该接口提供了三个方法:

1)      void init(); 在该拦截器被初始化之后,在该拦截器执行拦截之前,系统回调该方法。对于每个拦截器而言,此方法只执行一次。

2)      void destroy();该方法跟init()方法对应。在拦截器实例被销毁之前,系统将回调该方法。

3)      String intercept(ActionInvocation invocation) throws Exception; 该方法是用户需要实现的拦截动作。该方法会返回一个字符串作为逻辑视图。

除此之外,继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor是更简单的一种实现拦截器类的方式,因为此类提供了init()destroy()方法的空实现,这样我们只需要实现intercept方法。

 

分享到:
评论

相关推荐

    struts2拦截器实现原理模拟 2013-8-8

    struts2拦截器原理模拟,示例里面做了大量注释,对所有可能让你产生疑惑的地方都详细描述了原因。

    浅谈Struts2拦截器的原理与实现.docx

    浅谈Struts2拦截器的原理与实现.docx

    Struts2拦截器的实现原理(csdn)————程序.pdf

    Struts2拦截器的实现原理(csdn)————程序

    Struts拦截器及token拦截器防止重复提交例子源码

    Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的 拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器 三、定义Struts2拦截器。 ...

    struts2拦截器原理

    本实例是strust2拦截器的原理模拟,可以帮助你了解拦截器的实现方式

    struts 拦截器动态代理

    里面是自己实现struts拦截器的一个原理,基于jdk的动态代理

    拦截器机制及其实现原理

    拦截器是Struts2框架的核心组成部分,通过本章的学习,应该掌握如下知识点: ...掌握Struts2框架的拦截机制和实现原理 掌握在Struts2应用中如何定义、配置及使用拦截器和拦截器栈 掌握拦截器的方法过滤

    struts2_拦截器

    该文档详细描述了struts2中拦截器的原理及使用方法,内含实现简单登录模块的拦截器代码。

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

    《Struts2技术内幕:深入解析Struts架构设计与实现原理》 ~ 陆舟 (作者)Struts 2 是Java Web 应用首选的MVC 框架。本书主要分为3个部分:准备篇讲述了源代码阅读环境、Struts的组织结构、MVC框架及Web开发话题相关的...

    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讲义_吴峻申

    4.3 在Struts2中配置自定义的拦截器 53 4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的自定义拦截器配置 56 4.3.3 继承方法拦截器的自定义拦截器配置 58 4.4 Struts2文件上传拦截器应用 61 ...

    Struts2入门教程(全新完整版)

    6.使用拦截器实现权限验证 35 7.拦截器中的注解 37 8.使用PreResultListener实现回调 39 六、使用标签 40 1.基础表单标签 40 2.单选按钮和复选框: 41 3.三种方式实现下拉列表 41 4.二级联动 42 5.其它表单标签 44 6...

    详解Struts2中对未登录jsp页面实现拦截功能

    主要介绍了Struts2中对未登录jsp页面进行拦截功能的实现,在演示源码的同时对步骤和原理进行了分析,具有一定参考价值,需要得朋友可以了解下。

    struts2流程与流程图

    但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)。  一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。 Struts 2的核心控制器是...

    Struts2 入门培训

    4 1.3.2. 受控目录 5 2. 入门例子 5 2.1. 项目 5 2.2. 在WEB.XML中,配置FILTERDISPATCHER过滤器 6 2.3. 配置STRUTS.PROPERTIES 6 2.4. 编写一个简单的ACTION类 7 2.5. STRUTS.XML配置文件 8...

    精讲Struts2

    精简全面讲解Struts 2.0Struts2产生背景 工作原理 实现步骤 标签 命名空间 转换器 国际化 输出 令牌机制 拦截器 表单校验(jQuery.validate验证框架) 上传 下载 OGNL(ActionContext StackContext ValueStack区别)

    structs2教程

    structs2教程,重点介绍了Struts2入门及基本配置 Struts2核心概念及原理 Struts2输入校验 Struts2实现文件上传及下载 Struts2深入探索 Struts2的拦截器 Ognl语言 Struts2标签

    tomcat过滤链实现

    tomcat 过滤器的实现 struts拦截器的原理也是类似

    Java Web程序设计教程

    6.1.2拦截器及拦截器栈的应用 111 6.1.3自定义拦截器 115 6.2类型转换器 117 6.2.1struts2内置类型转换器 117 6.2.2引用类型的转换方式 117 6.2.3特殊对象的类型转换 118 6.2.4类型转换的错误处理 121 6.3...

Global site tag (gtag.js) - Google Analytics