什么是拦截器(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中,拦截器是一个实现了`Interceptor`接口的类,它通过在动作执行前后插入额外的处理逻辑,实现了对请求处理的增强。拦截器链是由多个拦截器按照特定顺序组成的,每个拦截器都可以执行预处理和后处理任务。...
- **原理**:Struts2 的拦截器会在 Action 执行完成后,调用 getter 方法并将结果存储到适当的范围对象中。 **3.4 请求转发与重定向** - **转发**:Action 的 execute 方法返回一个字符串,根据这个字符串找到对应...
Struts2是MVC(Model-View-Controller)设计模式的一种实现,它通过拦截器(Interceptor)机制实现了灵活的业务逻辑处理。控制器负责接收用户请求,解析并转发到相应的业务逻辑,模型层处理业务,视图则负责展示结果...
在实际项目中,Struts2可以处理类型转换、文件上传下载、拦截器(Interceptor)防止重复提交等问题。Interceptor是Struts2中的重要特性,它允许在Action执行前后插入额外的处理逻辑,如登录验证、日志记录等。深入...
在本篇“Struts2学习笔记十一”中,我们将深入探讨Struts2的核心拦截器及其应用。 **1. 拦截器的概念** 拦截器是AOP(面向切面编程)的一部分,在Struts2中,它们作为一系列可插入的处理链,可以在Action执行前后...
这个"struts2学习笔记"涵盖了Struts2的核心概念、配置、动作、拦截器、结果类型等关键知识点,旨在帮助初学者深入理解并掌握Struts2框架。 1. **Struts2核心概念** - **Action**:是Struts2的核心,负责处理用户的...
它在原有的Struts1基础上进行了大量的改进和优化,引入了更多现代框架的理念和技术,如依赖注入(DI)、面向切面编程(AOP)以及拦截器模型等。本学习笔记将深入探讨Struts2的核心概念、架构以及实际应用。 一、...
`struts2_2` 可能指的是 Struts2 的某个特定版本,而 `struts2拦截器笔记.txt` 文件可能包含了关于该版本中拦截器的详细使用和实现方法。通常,笔记会涵盖如何创建自定义拦截器、如何配置拦截器链、以及各种内置拦截...
在本篇学习笔记中,我们将重点讨论Struts2框架中的Action和拦截器(Interceptor)如何处理请求参数。 首先,Struts2的核心是拦截器机制,它允许我们在Action执行前后插入自定义的处理逻辑。在`struts-default.xml`...
这份"struts2学习笔记和源码"资源是学习这个框架的理想材料,特别适合初学者。 一、Struts2框架基础 Struts2是Apache软件基金会下的一个项目,它是Struts1的升级版,弥补了Struts1的一些不足,如动作映射和拦截器等...
在请求到达时,Struts2的拦截器(Interceptor)链会处理请求,执行预定义的任务,如验证、日志记录等,然后将请求转发给相应的Action。 Struts2的配置文件通常是struts.xml,用于定义Action、结果类型、拦截器等。...
以上内容仅是Struts2学习笔记中的核心部分,实际学习时还需要深入理解拦截器、结果类型配置、插件机制、异常处理等更多高级特性。Struts2提供了强大的功能和灵活性,是Java Web开发中不可或缺的一部分。
### Struts2 拦截器 (Interceptor) 学习笔记 #### 一、拦截器的概念及作用 在Struts2框架中,拦截器扮演着非常重要的角色,它与Java Web开发中的过滤器(Filter)有相似之处但又有显著区别。拦截器的主要作用在于...