`
kulinglei
  • 浏览: 101939 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Struts2.0 拦截器概述

阅读更多

来自:http://www.blogjava.net/nokiaguy/archive/2008/05/04/198071.html

Struts2的拦截器和Servlet过滤器类似。在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。

Struts2拦截器类必须从com.opensymphony.xwork2.interceptor.Interceptor接口继承,在Intercepter接口中有如下三个方法需要实现:





void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;


其中intercept方法是拦截器的核心方法,所有安装的拦截器都会调用之个方法。在Struts2中已经在struts-default.xml中预定义了一些自带的拦截器,如timer、params等。如果在<package>标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。代码如下:

<package name="demo" extends="struts-default" > ... </package>

     在struts-default.xml中有一个默认的引用,在默认情况下(也就是<action>中未引用拦截器时)会自动引用一些拦截器。这个默认的拦截器引用如下:



<default-interceptor-ref name="defaultStack"/>

<interceptor-stack name="defaultStack">  
    <interceptor-ref name="exception"/>
    <interceptor-ref name="alias"/>
    <interceptor-ref name="servletConfig"/>
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="i18n"/>
    <interceptor-ref name="chain"/>
    <interceptor-ref name="debugging"/>
    <interceptor-ref name="profiling"/>
    <interceptor-ref name="scopedModelDriven"/>
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="checkbox"/>
    <interceptor-ref name="staticParams"/>
    <interceptor-ref name="params">
        <param name="excludeParams">dojo\..*</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>

上面在defaultStack中引用的拦截器都可以在<action>中不经过引用就可以使用(如果在<action>中引用了任何拦截器后,要使用在defaultStack中定义的拦截器,也需要在<action>中重新引用,在后面将详细讲解)。

下面我们来看几个简单的拦截器的使用方法。

一、记录拦截器和execute方法的执行时间(timer)

     timer是Struts2中最简单的拦截器,这个拦截器对应的类是com.opensymphony.xwork2.interceptor.TimerInterceptor。它的功能是记录execute方法和其他拦截器(在timer后面定义的拦截器)的intercept方法执行的时间总和。如下面的配置代码所示:

<action name="first" class="action.FirstAction">
    <interceptor-ref name="logger"/>
    <interceptor-ref name="timer" />
</action>


由于在timer后面没有其他的拦截器定义,因此,timer只能记录execute方法的执行时间,在访问first动作时,会在控制台输出类似下面的一条信息:

信息: Executed action [/test/first!execute] took 16 ms.



     在使用timer拦截器时,需要commons-logging.jar的支持。将logger引用放到timer的后面,就可以记录logger拦截器的intercept方法和Action的execute方法的执行时间总和,代码如下:

<action name="first" class="action.FirstAction">
    <interceptor-ref name="timer" />
    <interceptor-ref name="logger"/>
</action>

大家可以使用如下的Action类来测试一下timer拦截器:

package action;

import com.opensymphony.xwork2.ActionSupport;

public class FirstAction extends ActionSupport         

{
       public String execute() throws Exception

       {
           Thread.sleep(1000); // 延迟1秒
           return null;
       }

}

如果只记录execute方法的执行时间,一般会输出如下的信息:

信息: Executed action [/test/first!execute] took 1000 ms.

二、通过请求调用Action的setter方法(params)


    当客户端的一个form向服务端提交请求时,如有一个textfield,代码如下:

<s:form action="first" namespace="/test">
   <s:textfield name="name"/>
   <s:submit/>
</s:form>


在提交后,Struts2将会自动调用first动作类中的setName方法,并将name文本框中的值通过setName方法的参数传入。实际上,这个操作是由params拦截器完成的,params对应的类是com.opensymphony.xwork2.interceptor.ParametersInterceptor。由于params已经在defaultStack中定义,因此,在未引用拦截器的<action>中是会自动引用params的,如下面的配置代码,在访问first动作时,Struts2是会自动执行相应的setter方法的。

<action name="first" class="action.FirstAction">

    ... ...

</action>

但如果在<action>中引用了其他的拦截器,就必须再次引用params拦截器,Struts2才能调用相应的setter方法。如下面的配置代码所示:


<action name="first" class="action.FirstAction">
    <interceptor-ref name="timer" />
    <interceptor-ref name="params"/>
</action>

三、通过配置参数调用Action的setter方法(static-params)

    static-params拦截器可以通过配置<params>标签来调用Action类的相应的setter方法,static-params拦截器对应的类是com.opensymphony.xwork2.interceptor.StaticParametersInterceptor。
    下面配置代码演示了如何使用static-params拦截器:

<action name="first" class="action.FirstAction">
    <interceptor-ref name="timer" />
    <param name="who">比尔</param>
    <interceptor-ref name="params"/>
    <interceptor-ref name="static-params"/>
</action>


如果first动作使用上面的配置,在访问first动作时,Struts2会自动调用setWho方法将“比尔”作为参数值传入setWho方法。

四、使用拦截器栈

     为了能在多个动作中方便地引用同一个或几个拦截器,可以使用拦截器栈将这些拦截器作为一个整体来引用。拦截器栈要在<package>标签中使用<interceptors>和子标签<interceptor-stack>来定义。代码如下:
<package name="demo" extends="struts-default" >
    <interceptors>
        <interceptor-stack name="mystack">
            <interceptor-ref name="timer" />
            <interceptor-ref name="logger" />
            <interceptor-ref name="params" />
            <interceptor-ref name="static-params" />
        </interceptor-stack>
    </interceptors>

    <action name="first" class="action.FirstAction">
        <param name="who">比尔</param>
        <interceptor-ref name="mystack"/>           
    </action>
</package>
分享到:
评论

相关推荐

    Struts2.0拦截器总结

    ### Struts2.0拦截器详解 #### 一、拦截器概述 在Struts2框架中,拦截器(interceptor)是一种非常重要的机制,用于在执行Action前后进行一系列预处理或后处理的操作。拦截器可以用来执行如参数拦截、类型转换、输入...

    Struts2.0学习Struts2.0文档

    接下来,开发者可以根据具体需求进一步深入学习Struts 2.0 的高级特性和最佳实践,例如拦截器(Interceptor)、国际化(i18n)和支持AJAX等功能。Struts 2.0 不仅是一个强大的Web开发工具,而且也是一个学习现代Web...

    Struts2.0视频教程+struts2.0中文教程

    5. **Struts2拦截器**:介绍Struts2的核心组件之一——拦截器,如何使用拦截器进行日志记录、权限验证等操作。 6. **结果类型与导航**:讲解如何配置结果类型,如Redirect、RedirectAction、Stream等,以及基于...

    struts2.0入门案例

    Struts2.0是Java Web开发中一个非常重要的框架,它是Apache软件基金会的Jakarta项目下的一个开源产品,主要用于构建MVC(Model-View-Controller)模式的应用程序。本入门案例将带你逐步了解如何使用Struts2.0来创建...

    struts2.0英文文档

    4. **拦截器**:拦截器是 Struts2.0 中的一个重要概念,它允许开发者编写自定义的行为,如认证、授权、事务管理等。 5. **配置**:Struts2.0 使用 XML 或注解来配置应用的各种行为和组件。 #### 四、Struts2.0 的...

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

    Struts 2.0 in Action

    在第一章“Struts 2: the modern web application framework”中,作者们详细阐述了Struts 2.0相较于其他框架的优势所在,包括但不限于其对MVC架构的支持、强大的拦截器机制、灵活的数据类型转换以及与Spring、...

    struts 2.0 核心jar包

    Struts 2是Struts 1的升级版,引入了更多的特性,如拦截器(Interceptor)、OGNL(Object-Graph Navigation Language)表达式语言和动态方法调用。它弥补了Struts 1在灵活性和可扩展性上的不足,使开发者能够更加...

    Eclipse struts2.0可视化开发组件

    3. **配置组件:** 通过可视化的界面配置Struts2.0的相关设置,如Action映射、拦截器等。 4. **代码生成:** 利用插件自动生成所需的代码,减少手动编码的时间。 5. **调试与测试:** 利用Eclipse内置的调试工具进行...

    Struts2.0框架技术详解

    ### Struts2.0框架技术详解 #### 一、MVC思想 **1.1 Model I 模式和 Model II 模式** ##### 1.1.1 Model I 模式 在Model I模式下,整个Web应用几乎全部由JSP页面组成。JSP页面不仅接收处理客户端请求,还直接...

    struts2.0标签使用源码

    一、Struts2.0标签概述 Struts2.0标签库是基于OGNL(Object-Graph Navigation Language)表达式的,它提供了丰富的标签,如`s:property`、`s:textfield`、`s:form`等,这些标签用于在JSP页面中动态地展示和操作数据,...

    Struts2.0技术资料

    以上是对Struts2.0框架的概述,深入学习Struts2.0,还需要结合具体的代码示例和实际项目经验。提供的压缩包文件可能包含教程文档、示例代码以及配置文件,通过这些资源可以进一步了解和掌握Struts2.0的使用。

    Struts2.0中文教程

    Struts2.0提供了一种更加灵活的控制器层,支持多种视图技术,如JSP、FreeMarker等,并引入了强大的拦截器(Interceptor)机制,增强了异常处理和国际化等功能。 二、Struts2.0的标签库 Struts2.0的标签库是其强大之...

    struts2.0 pdf书

    - 配置`struts.xml`文件,该文件用于定义应用中的`Action`映射和拦截器栈等配置。 #### 步骤3:编写代码 - 创建JSP页面作为视图层。 - 编写业务逻辑类(如JavaBeans)作为模型层。 - 编写`Action`类作为控制器层,...

    struts2.0详细教程(中文版)

    接下来,开发者可以进一步探索Struts2.0的其他高级特性,例如拦截器(Interceptors)、结果类型(Result Types)、国际化支持(Internationalization)等,以便更好地满足实际项目的需求。总之,Struts2.0凭借其强大的功能...

    struts2.0资源包

    1. **Struts2.0框架概述** Struts2是Apache软件基金会的开源项目,它是对经典的Struts1框架的升级,具有更好的灵活性和扩展性。它整合了其他优秀框架如Hibernate和Spring,提供了全面的Action、结果类型、拦截器、...

    搭建Struts2.0开发和运行环境

    ### 搭建Struts2.0开发和运行环境 #### 一、概述 本文将详细介绍如何搭建Struts...随着对框架的深入学习,您可以进一步探索Struts 2.0提供的高级特性,如拦截器、结果类型等,从而实现更为灵活和高效的应用程序开发。

    struts2.0中文教程

    Struts2.0是Java Web开发中的一个强大框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了构建可维护性高、结构清晰的Web应用程序的工具。这个"struts2.0中文教程"压缩包显然是为了帮助初学者理解并...

    struts2.0动画教程

    一、Struts2.0概述 Struts2是Apache软件基金会的一个开源项目,它在Struts1的基础上进行了大量的改进和优化,提供更丰富的功能和更强的可扩展性。Struts2的核心组件包括Action、Result、Interceptor、ValueStack等,...

Global site tag (gtag.js) - Google Analytics