`

Struts2学习笔记(八) 拦截器(Interceptor)(上)

 
阅读更多

什么是拦截器(Interceptor

拦截器是struts2框架最重要的特性之一。它可以让你在Action 方法执行前后(Result执行之后)进行一些功能处理。在前面学习Action和学习Result的时候我们就已经开始学习拦截器了,因此现在我们对如何使用它已经不陌生了。

在学习Spring的时候我们会接触到一种设计思想,叫做面向切面编程(AOP)。也就是说我们将一些通用的功能组件抽取出来,我们在功能模块中不需要编写这些与逻辑功能无关的代码,然后我们通过某种方式(动态代理)将这些通用组件的功能附加到我们的功能模块上。Struts2中的拦截器就和这种模式差不多,Strtus2框架会将我们在配置文件中为Action配置的拦截器和Action以及Result组合在一起,附加到一个新的对象上,那么在执行的时候,只需要对这个新的对象加以操作,那么这些拦截器和Action以及Result就都可以得以执行了。这个新的对象就负责了拦截器和Action的Result的组织,它就是ActionInvocation类。


ActionInvocation代表了Action的执行状态,它持有Intercptors和Action的对象实例。通过重复的调用它的invoke方法,使得其中的Interceptors,Action和Result都得以执行。

Strtus2内建的拦截器

Strtus2内建了许多拦截器,这些可以在struts-default.xml中找到:

<interceptors>

<interceptor name="alias"class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>

<interceptor name="autowiring"class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>

<interceptor name="chain"class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>

<interceptor name="conversionError"class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>

<interceptor name="cookie"class="org.apache.struts2.interceptor.CookieInterceptor"/>

<interceptor name="clearSession"class="org.apache.struts2.interceptor.ClearSessionInterceptor"/>

<interceptor name="createSession"class="org.apache.struts2.interceptor.CreateSessionInterceptor"/>

<interceptor name="debugging"class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor"/>

<interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>

<interceptor name="exception"class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>

<interceptor name="fileUpload"class="org.apache.struts2.interceptor.FileUploadInterceptor"/>

<interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>

<interceptor name="logger"class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>

<interceptor name="modelDriven"class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>

<interceptor name="scopedModelDriven"class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>

<interceptor name="params"class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

<interceptor name="actionMappingParams"class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>

<interceptor name="prepare"class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>

<interceptor name="staticParams"class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>

<interceptor name="scope"class="org.apache.struts2.interceptor.ScopeInterceptor"/>

<interceptor name="servletConfig"class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>

<interceptor name="timer"class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>

<interceptor name="token"class="org.apache.struts2.interceptor.TokenInterceptor"/>

<interceptor name="tokenSession"class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>

<interceptor name="validation"class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>

<interceptor name="workflow"class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>

<interceptor name="store"class="org.apache.struts2.interceptor.MessageStoreInterceptor"/>

<interceptor name="checkbox"class="org.apache.struts2.interceptor.CheckboxInterceptor"/>

<interceptor name="profiling"class="org.apache.struts2.interceptor.ProfilingActivationInterceptor"/>

<interceptor name="roles"class="org.apache.struts2.interceptor.RolesInterceptor"/>

<interceptor name="annotationWorkflow"class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor"/>

<interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor"/>

</interceptors>

下面是关于这些内建拦截器的说明:

拦截器

名字

说明

Alias Interceptor

alias

在不同请求之间将请求参数在不同名字件转换,请求内容不变

Chaining Interceptor

chain

让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。

Checkbox Interceptor

checkbox

添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。

Cookies Interceptor

cookies

使用配置的name,value来是指cookies

Conversion Error Interceptor

conversionError

将错误从ActionContext中添加到Action的属性字段中。

Create Session Interceptor

createSession

自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。

Debugging Interceptor

debugging

提供不同的调试用的页面来展现内部的数据状况。

Execute and Wait Interceptor

execAndWait

在后台执行Action,同时将用户带到一个中间的等待页面。

Exception Interceptor

exception

将异常定位到一个画面

File Upload Interceptor

fileUpload

提供文件上传功能

I18n Interceptor

i18n

记录用户选择的locale

Logger Interceptor

logger

输出Action的名字

Message Store Interceptor

store

存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。

Model Driven Interceptor

model-driven

如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。

Scoped Model Driven

scoped-model-driven

如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。

Parameters Interceptor

params

将请求中的参数设置到Action中去。

Prepare Interceptor

prepare

如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。

Scope Interceptor

scope

将Action状态存入session和application的简单方法。

Servlet Config Interceptor

servletConfig

提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。

Static Parameters Interceptor

staticParams

从struts.xml文件中将中的中的内容设置到对应的Action中。

Roles Interceptor

roles

确定用户是否具有JAAS指定的Role,否则不予执行。

Timer Interceptor

timer

输出Action执行的时间

Token Interceptor

token

通过Token来避免双击

Token Session Interceptor

tokenSession

和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中

Validation Interceptor

validation

使用action-validation.xml文件中定义的内容校验提交的数据。

Workflow Interceptor

workflow

调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面

Parameter Filter Interceptor

N/A

从参数列表中删除不必要的参数

Profiling Interceptor

profiling

通过参数激活profile

我们通过定义拦截器栈的方式来组织这些拦截器,在前面的学习中我也接触到了struts2内建的拦截器栈drfaultStack。下面我们看一些有关拦截器的声明和配置.

拦截器的声明和配置

我们从struts-dfault.xml文件中已经看过了如何声明一个拦截器。首先拦截其的声明适应<interceptor>元素,name属性用于指定拦截器的名字,class属性用于指定拦截器的实现类。同时<interceptor>元素必须放在<interceptors>元素里。

在<interceptors>元素里可以使用<interceptor-stack>元素和<interceptor-ref>元素来定义拦截器栈和引用拦截器(或拦截器栈),还可以在使用<param>元素来向拦截器传递参数:

<interceptor-stack name="executeAndWaitStack">

<interceptor-ref name="execAndWait">

<param name="excludeMethods">input,back,cancel</param>

</interceptor-ref>

<interceptor-ref name="defaultStack"/>

<interceptor-ref name="execAndWait">

<param name="excludeMethods">input,back,cancel</param>

</interceptor-ref>

</interceptor-stack>

为action配置拦截器。这个我们在前面的学习中已经学习过了,我们可以在<package>元素中配置默认的拦截器栈,也可以在<action>元素中使用<interceptor-ref>元素来为Action配置拦截器或拦截器栈。

<package name="default" namespace="/" extends="struts-default">

<interceptors>

<interceptor-stackname="luo">

<interceptor-refname="exception"/>

<interceptor-refname="alias"/>

<interceptor-refname="servletConfig"/>

<interceptor-refname="i18n"/>

<interceptor-ref name="prepare"/>

<interceptor-refname="chain"/>

<interceptor-refname="scopedModelDriven"/>

<interceptor-refname="modelDriven"/>

<interceptor-refname="fileUpload"/>

<interceptor-refname="checkbox"/>

<interceptor-refname="multiselect"/>

<interceptor-refname="staticParams"/>

<interceptor-refname="actionMappingParams"/>

<interceptor-refname="params">

<param name="excludeParams">dojo\..*,^struts\..*</param>

</interceptor-ref>

<interceptor-refname="conversionError"/>

<interceptor-refname="workflow">

<param name="excludeMethods">input,back,cancel,browse</param>

</interceptor-ref>

<interceptor-refname="debugging"/>

</interceptor-stack>

</interceptors>

<default-interceptor-ref name="luo"></default-action-ref>

<action name="hello" class="action.HelloWorld">

<result name="success">/success.jsp</result>

<result name="input">/input.jsp</result>

</action>

</package>


1. <actionname="helloworldAction"class="cn.javass.action.action.HelloWorldAction">

2. <paramname="account">test</param>

3. <result>/s2impl/welcome.jsp</result>

4. <interceptor-refname="staticParams"/>

5. <interceptor-refname="basicStack"/>

6. </action>

注:如果要声明新的拦截器,那么必须声明在<package>元素下的<intercptors>元素下。<action>元素中只能引用拦截器,不能声明拦截器。


分享到:
评论

相关推荐

    struts2学习笔记十(第10讲.Struts2的核心 拦截器)

    在Struts2中,拦截器是一个实现了`Interceptor`接口的类,它通过在动作执行前后插入额外的处理逻辑,实现了对请求处理的增强。拦截器链是由多个拦截器按照特定顺序组成的,每个拦截器都可以执行预处理和后处理任务。...

    struts2 学习重点笔记

    - **原理**:Struts2 的拦截器会在 Action 执行完成后,调用 getter 方法并将结果存储到适当的范围对象中。 **3.4 请求转发与重定向** - **转发**:Action 的 execute 方法返回一个字符串,根据这个字符串找到对应...

    张龙圣思园struts2学习笔记word

    Struts2是MVC(Model-View-Controller)设计模式的一种实现,它通过拦截器(Interceptor)机制实现了灵活的业务逻辑处理。控制器负责接收用户请求,解析并转发到相应的业务逻辑,模型层处理业务,视图则负责展示结果...

    struts2学习笔记(完美总结)——转自OPEN经验库

    在实际项目中,Struts2可以处理类型转换、文件上传下载、拦截器(Interceptor)防止重复提交等问题。Interceptor是Struts2中的重要特性,它允许在Action执行前后插入额外的处理逻辑,如登录验证、日志记录等。深入...

    struts2学习笔记十一(第11讲.Struts2的核心 拦截器续)

    在本篇“Struts2学习笔记十一”中,我们将深入探讨Struts2的核心拦截器及其应用。 **1. 拦截器的概念** 拦截器是AOP(面向切面编程)的一部分,在Struts2中,它们作为一系列可插入的处理链,可以在Action执行前后...

    struts2学习笔记

    这个"struts2学习笔记"涵盖了Struts2的核心概念、配置、动作、拦截器、结果类型等关键知识点,旨在帮助初学者深入理解并掌握Struts2框架。 1. **Struts2核心概念** - **Action**:是Struts2的核心,负责处理用户的...

    Struts2学习笔记

    它在原有的Struts1基础上进行了大量的改进和优化,引入了更多现代框架的理念和技术,如依赖注入(DI)、面向切面编程(AOP)以及拦截器模型等。本学习笔记将深入探讨Struts2的核心概念、架构以及实际应用。 一、...

    struts2拦截器笔记

    `struts2_2` 可能指的是 Struts2 的某个特定版本,而 `struts2拦截器笔记.txt` 文件可能包含了关于该版本中拦截器的详细使用和实现方法。通常,笔记会涵盖如何创建自定义拦截器、如何配置拦截器链、以及各种内置拦截...

    struts2学习笔记二

    在本篇学习笔记中,我们将重点讨论Struts2框架中的Action和拦截器(Interceptor)如何处理请求参数。 首先,Struts2的核心是拦截器机制,它允许我们在Action执行前后插入自定义的处理逻辑。在`struts-default.xml`...

    struts2学习笔记和源码

    这份"struts2学习笔记和源码"资源是学习这个框架的理想材料,特别适合初学者。 一、Struts2框架基础 Struts2是Apache软件基金会下的一个项目,它是Struts1的升级版,弥补了Struts1的一些不足,如动作映射和拦截器等...

    struts2学习笔记.rar

    在请求到达时,Struts2的拦截器(Interceptor)链会处理请求,执行预定义的任务,如验证、日志记录等,然后将请求转发给相应的Action。 Struts2的配置文件通常是struts.xml,用于定义Action、结果类型、拦截器等。...

    struts 2 学习笔记

    以上内容仅是Struts2学习笔记中的核心部分,实际学习时还需要深入理解拦截器、结果类型配置、插件机制、异常处理等更多高级特性。Struts2提供了强大的功能和灵活性,是Java Web开发中不可或缺的一部分。

    struts学习笔记(2)

    ### Struts2 拦截器 (Interceptor) 学习笔记 #### 一、拦截器的概念及作用 在Struts2框架中,拦截器扮演着非常重要的角色,它与Java Web开发中的过滤器(Filter)有相似之处但又有显著区别。拦截器的主要作用在于...

Global site tag (gtag.js) - Google Analytics