`

拦截器概述

阅读更多

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

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

    ◆ voiddestroy();

    ◆ voidinit();

    ◆ Stringintercept(ActionInvocationinvocation)throwsException;

    其中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-refname="defaultStack"/>
<interceptor-stackname="defaultStack"> 
<interceptor-refname="exception"/>
<interceptor-refname="alias"/>
<interceptor-refname="servletConfig"/>
<interceptor-refname="prepare"/>
<interceptor-refname="i18n"/>
<interceptor-refname="chain"/>
<interceptor-refname="debugging"/>
<interceptor-refname="profiling"/>
<interceptor-refname="scopedModelDriven"/>
<interceptor-refname="modelDriven"/>
<interceptor-refname="fileUpload"/>
<interceptor-refname="checkbox"/>
<interceptor-refname="staticParams"/>
<interceptor-refname="params">
<paramname="excludeParams">dojo..*</param>
</interceptor-ref>
<interceptor-refname="conversionError"/>
<interceptor-refname="validation">
 <paramname="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-refname="workflow">
<paramname="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方法执行的时间总和。如下面的配置代码所示:

 

<actionname="first"class="action.FirstAction"> <interceptor-refname="logger"/> <interceptor-refname="timer"/> </action>

 

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

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

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

 

<actionname="first"class="action.FirstAction">
<interceptor-refname="timer"/>
<interceptor-refname="logger"/>
</action>

 

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

    packageaction;

 

importcom.opensymphony.xwork2.ActionSupport;
publicclassFirstActionextendsActionSupport 
{
 publicStringexecute()throwsException
 {
  Thread.sleep(1000);//延迟1秒
  returnnull;
 }
}

 

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

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

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

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

 

<s:formaction="first"namespace="/test">
 <s:textfieldname="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方法。如下面的配置代码所示:

 

<actionname="first"class="action.FirstAction">
<interceptor-refname="timer"/>
<interceptor-refname="params"/>
</action>

 

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

    static-params拦截器可以通过配置<params>标签来调用Action类的相应的setter方法,static-params拦截器对应的类是com.opensymphony.xwork2.interceptor.StaticParametersInterceptor。

    下面配置代码演示了如何使用static-params拦截器:

 

<actionname="first"class="action.FirstAction">
<interceptor-refname="timer"/>
<paramname="who">比尔</param>
<interceptor-refname="params"/>
<interceptor-refname="static-params"/>
</action>

 

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

    使用拦截器栈

    为了能在多个动作中方便地引用同一个或几个拦截器,可以使用拦截器栈将这些拦截器作为一个整体来引用。拦截器栈要在<package>标签中使用<interceptors>和子标签<interceptor-stack>来定义。代码如下:

 

<packagename="demo"extends="struts-default">
<interceptors>
<interceptor-stackname="mystack">
<interceptor-refname="timer"/>
<interceptor-refname="logger"/>
<interceptor-refname="params"/>
<interceptor-refname="static-params"/>
</interceptor-stack>
</interceptors>
<actionname="first"class="action.FirstAction">
<paramname="who">比尔</param>
<interceptor-refname="mystack"/>
</action>
</package>
分享到:
评论

相关推荐

    基于java的企业级应用开发:拦截器.ppt

    15.1 拦截器概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。 ...

    struts2学习教程

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

    详解给Vue2路由导航钩子和axios拦截器做个封装

    本篇文章主要介绍了详解给Vue2路由导航钩子和axios拦截器做个封装,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    完整版 Java开发实训课程系列-SpringMVC框架技术教程 第8章 拦截器 (共12页).pptx

    【完整课程列表】 完整版 Java开发实训...完整版 Java开发实训课程系列-SpringMVC框架技术教程 第8章 拦截器 (共12页).pptx 完整版 Java开发实训课程系列-SpringMVC框架技术教程 第9章 SSM框架整合 (共26页).pptx

    ssm整合项目+mybatis拦截器.zip

    一、概述 在这个平台上,我们为大家带来了一系列的 JavaSSM(Spring + SpringMVC + MyBatis)项目。这些项目旨在展示SSM框架在实际应用中的魅力,同时也为开发者提供了一个快速学习和实践的机会。通过下载和使用...

    Flume使用详解(四)

    拦截器采用了责任链模式,多个拦截器可以按指定顺序拦截。 一个拦截器返回的事件列表被传递给链中的下一个拦截器。 如果一个拦截器需要删除事件,它只需要在返回的事件集中不包含要删除的事件即可。 如果要删除所有...

    吴天雄--SpringMVC笔记.doc

    SpringMVC笔记内容:第一天(SpringMVC的概述、SpringMVC与Struts2优势分析、重要组件、运行原理、SpringMVC环境搭建、@RequestMapping注解详解、...第三天(SpringMVC异常处理、自定义拦截器、拦截器栈) --author:

    SpringMVC讲义大全.docx

    SpringMVC框架概述: 介绍什么是...拦截器和过滤器: 介绍如何使用拦截器和过滤器来实现日志记录、权限验证等功能。 RESTful Web服务: 讲解如何使用SpringMVC开发RESTful风格的Web服务,支持HTTP方法、资源定位等。

    struts2讲义_吴峻申

    4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的自定义拦截器配置 56 4.3.3 继承方法拦截器的自定义拦截器配置 58 4.4 Struts2文件上传拦截器应用 61 4.4.1 Struts2文件上传功能开发 61 4.4.2 ...

    EasyJWeb开发者指南

    文档目录(后面数字为页码) EasyJWeb开发者指南 EasyJWeb开发者指南 1 ...EasyJWeb中的拦截器 35 Ajax支持 35 Ajax概述 35 远程脚本调用36 快速上手 37 配置Ajax 38 安全控制 38 Ajax工具 38 Ajax验证 38

    深入浅出Struts2(附源码)

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

    图解springMVC执行流程及原理.docx

    SpringMVC概述 Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC架构,从而在使用Spring进行WEB开发时,...

    完整版 Java开发实训课程系列-SpringMVC框架技术教程 第1章 springmvc概述 (共27页).pptx

    【完整课程列表】 完整版 Java开发实训...完整版 Java开发实训课程系列-SpringMVC框架技术教程 第8章 拦截器 (共12页).pptx 完整版 Java开发实训课程系列-SpringMVC框架技术教程 第9章 SSM框架整合 (共26页).pptx

    libshambles:一个有效拦截已建立的TCP连接的库

    然后,它修改防火墙和连接跟踪状态,以将客户端到服务器的连接清晰地划分为两个单独的连接:客户端到拦截器和拦截器到服务器。 它还包含通过Unix域套接字将套接字传递给其他进程的代码,还包含拆卸功能,以在截获的...

    【JavaScript源代码】vue-router钩子函数实现路由守卫.docx

    路由守卫有点类似于ajax的请求拦截器,就是请求发送之前先给你拦截住做一些事情之后再去发送请求,同样这里的路由守卫意思差不多;简单理解为就是你在进路由之前,首先把你拦住,对你进行检查;这是不是有点中学门口...

    react-formular:这个天秤座是使用新的React Context API将表单及其输入和编辑器绑定在一起的实验方法。 它旨在完全可定制和可组合。 它只是一组高阶组件。 由于具有分离性质,因此中间件使构建自定义验证,安全卫士和其他数据拦截器变得容易

    由于具有分离性质,因此使构建自定义验证,安全卫士和其他数据拦截器变得容易。 注意这不是ui库,它只是将表单及其输入绑定在一起的一组工具。 注意我需要这个项目的帮助,所以如果您想帮助我,请告诉我专注/动机/...

    深入浅出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 ...

    Ekstar Browser Pro 15.0.apk

    Ekstar Browser PRO 为您的Android设备尝试最轻,最快的网络...*广告拦截器 *多标签浏览 *智能速度主页 *直观标签概述屏幕 *会话管理 *自动全屏功能 *下载管理器 *与朋友分享任何内容 什么是新的 浏览器你的所有设备。

Global site tag (gtag.js) - Google Analytics