`
王_辉
  • 浏览: 28396 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

struts2拦截器概述

阅读更多

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

Struts2拦截器类必须从com.opensymphony.xwork2.interceptor.Interceptor接口继承,在Intercepter接口中有如下三个方法需要实现:
<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->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> 中未引用拦截器时)会自动引用一些拦截器。这个默认的拦截器引用如下:

 

 

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->< 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 方法执行的时间总和。如下面的配置代码所示:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->< 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 方法的执行时间总和,代码如下:

????

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->< action  name ="first"  class ="action.FirstAction" >
    
< interceptor-ref  name ="timer"   />
    
< interceptor-ref  name ="logger" />
</ action >


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

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->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 ,代码如下:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->< 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方法。如下面的配置代码所示:

 

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->< 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拦截器:



<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->< 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> 来定义。代码如下:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->< 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帮助文档

    struts2的基石-拦截器 struts2中实现IOC struts2中实现文件上传 struts2中实现CRUD struts2中的OGNL struts2的新表单标志的使用 struts2与AJAX一 struts2与AJAX二 struts2与AJAX三 struts2中用Spring实现IOC struts2...

    Struts2全解Struts2全解

    1、struts2概述 Struts2 软件下载 Struts2 比较重要的类 操作步骤及框架配置 struts运行机制 ...8 struts2拦截器 ......... 9 struts2类型转换 ........ 10struts2标签库 ........ 11、访问数据库 ........

    Struts2框架 jar JAVA开发 Struts2.jar架包 Struts2开发实例

    Struts2 概述 如何应用Struts2 Struts2 配置文件 如何编写Action 拦截器 Struts2的标签 OGNL 数据校验 国际化

    [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入门教程(全新完整版)

    1.概述strust2中的拦截器 28 2.自定义拦截器 28 方式一,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 ...

    struts2讲义_吴峻申

    4.1 拦截器在Struts2中的缺省应用 47 4.2 拦截器原理实现 50 4.3 在Struts2中配置自定义的拦截器 53 4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的自定义拦截器配置 56 4.3.3 继承方法拦截器的...

    struts2学习教程

    第一个Struts2程序,处理一个form多个submit,struts.xml常用配置解析,使用validate方法验证数据,使用Validation框架验证数据,在Action类中获得HttpServletResponse对象的四种方法,上传任意多个文件,拦截器概述...

    Struts 2的高级应用

    1、MVC 概述 2、Struts1.x简述 3、Struts2概述 4、编写一个struts2应用程序 5、Struts2的核心配置文件 6、Action的实现 7、拦截器

    深入浅出Struts2(附源码)

    本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,...

    济南大学 第03章_Struts2应用_课堂.ppt

    3.1 Struts 2概述 3.2 Struts 2基本应用及工作流程 3.3 Struts 2标签库应用 3.4 Struts 2拦截器 3.5 Struts 2国际化应用 3.6 Struts 2文件上传 3.7 Struts 2综合应用实例——添加学生信息

    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学习.rar

    介绍struts2的知识,分别是 入门与概述、action与struts xml、OGNL与类型转换、标签库、文件上传下载、拦截器、国际化、输入校验。

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

    18.3 使用DataSourceInjectorInterceptor拦截器 269 18.4 小结 273 第19章 定制结果类型 274 19.1 概述 274 19.2 编写一个自定义的结果类型 274 19.3 使用新的结果类型 277 19.4 小结 279 第20章 Velocity 280 ...

    《Java EE应用开发基础》第三章课件(PDF版)

    济南大学《Java EE应用开发基础》课程课件(PDF版),第三章Struts2应用 3.1 Struts 2概述 ...3.4 Struts 2拦截器 3.5 Struts 2国际化应用 3.6 Struts 2文件上传 3.7 Struts 2综合应用实例——添加学生信息

    低清版 大型门户网站是这样炼成的.pdf

    2.6.1 struts 2内建拦截器介绍 95 2.6.2 定义和使用拦截器栈 97 2.6.3 使用自定义拦截器 98 2.7 小结 100 第3章 struts 2标签库详解与ajax技术应用 103 3.1 struts 2主题与模板 103 3.2 struts 2控制标签详解 ...

    Struts2入门教程。包括jquery集成等。入门必看

    第 6章 拦截器浅析...............................................................................................................................................42 6.3 拦截器基础.........................

    吴天雄--SpringMVC笔记.doc

    SpringMVC笔记内容:第一天(SpringMVC的概述、SpringMVC与Struts2优势分析、重要组件、运行原理、SpringMVC环境搭建、@RequestMapping注解详解、字符编码过滤器、传参形式(基本数据类型或String、对象类型、对象....

    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