什么是拦截器
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
实现原理
Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器,如图1所示。
图1 拦截器调用序列图
已有的拦截器
Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。大家可以到struts2-all-2.0.1.jar或struts2-core-2.0.1.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。
以下部分就是从struts-default.xml文件摘取的内容:
< 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 ="createSession" class ="org.apache.struts2.interceptor.CreateSessionInterceptor" />
< interceptor name ="debugging" class ="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
< interceptor name ="external-ref" class ="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor" />
< 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 ="model-driven" class ="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor" />
< interceptor name ="scoped-model-driven" class ="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor" />
< interceptor name ="params" class ="com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
< interceptor name ="prepare" class ="com.opensymphony.xwork2.interceptor.PrepareInterceptor" />
< interceptor name ="static-params" class ="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor" />
< interceptor name ="scope" class ="org.apache.struts2.interceptor.ScopeInterceptor" />
< interceptor name ="servlet-config" class ="org.apache.struts2.interceptor.ServletConfigInterceptor" />
< interceptor name ="sessionAutowiring" class ="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor" />
< interceptor name ="timer" class ="com.opensymphony.xwork2.interceptor.TimerInterceptor" />
< interceptor name ="token" class ="org.apache.struts2.interceptor.TokenInterceptor" />
< interceptor name ="token-session" class ="org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
< interceptor name ="validation" class ="com.opensymphony.xwork2.validator.ValidationInterceptor" />
< 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" />
配置和使用拦截器
在struts-default.xml中已经配置了以上的拦截器。如果您想要使用上述拦截器,只需要在应用程序struts.xml文件中通过“<include file="struts-default.xml" />”将struts-default.xml文件包含进来,并继承其中的struts-default包(package),最后在定义Action时,使用“<interceptor-ref name="xx" />”引用拦截器或拦截器栈(interceptor stack)。一旦您继承了struts-default包(package),所有Action都会调用拦截器栈 ——defaultStack。当然,在Action配置中加入“<interceptor-ref name="xx" />”可以覆盖defaultStack。
Struts2常用的内置拦截器
alias:实现不同请求中相似参数别名的转换
autowiring:自动装配。主要用于Struts2和Spring整合时,Struts2可以使用自动装配的方式访问Spring容器中的Bean
chain:构建一个Action链,使当前Action可以访问前一个Action的属性。一般与<result type="chain"….../>一起使用
conversionError:处理类型转换错误。负责将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误
createSession:负责创建一个HttpSession对象,主要用于那些需要提供HttpSession对象才能正常工作的拦截器中
debugging:当使用Struts2的开发模式时,该拦截器会提供更多的调试信息
execAndWait:后台执行Action,负责将等待画面发送给用户
exception:负责处理异常。它会将异常映射为结果
fileUpload:用于文件上传。负责解析表单中文件域的内容
i18n:支持国际化。它负责把所选的语言和区域放入用户Session中
logger:负责日志记录。主要是输出Action的名字
modelDriven:用于模型驱动。当Action实现了ModelDriven接口时,它负责把getModel()方法的结果推入ValueStack中
scopedModelDriven:若Action实现ScopedModelDriven接口,它负责从指定生存范围中找出指定Model,并通过setModel()将该Model传给Action实例
params:最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值
主要用于在提交表单后,将表单中的参数自动赋值到Action的属性中
prepare:如果Action实现了Preparable接口,将会调用该拦截器的prepare()方法
staticParams:负责将XML中<action/>标签下<param/>标签中的参数传入Action
scope:范围转换拦截器,可以将Action状态信息保存到HttpSession范围或ServletContext范围内
servletConfig:如果某个Action需要直接访问Servlet API,就是通过该拦截器实现的
用于将HTTP请求中的HttpServletRequest和HttpServletResponse对象传递给Action对象
roles:JAAS拦截器。Java授权和认证服务Java Authentication and Authorization Service
只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action
timer:负责输出Action的执行时间。它在分析Action的性能瓶颈时比较有用
token:阻止表单重复提交。它检查传到Action中的token,从而防止多次提交
tokenSession:作用与token基本类似,只是它把token保存在HttpSession中
validation:通过执行在XxxAction-validation.xml中定义的校验器,从而完成数据校验
workflow:负责调用Action类的validate()方法。如果校验失败,则返回input逻辑视图
分享到:
相关推荐
xwork-2.x.x.jar是XWork框架,是Struts2的基石。ognl-2.6.x.jar是对象图导航语言,用于在框架内部表达对象的访问和操作。freemarker-2.3.x.jar是模板引擎,用于生成动态HTML或其他格式的输出。commons-logging-1.1.x...
拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。本文将深入探讨Struts2拦截器的基本概念、工作原理以及其实现机制,并结合实际应用场景来展示如何利用拦截器提高代码的复用性与可维护性。...
5. **拦截器(Interceptors)**:Struts 2的核心特性之一是拦截器,它们在Action执行前和执行后执行特定的任务,如日志记录、权限验证、异常处理等。`struts2-interceptor-*`系列的JAR文件包含了这些拦截器实现。 6...
Struts2的核心优势在于其强大的拦截器机制,允许开发者自定义请求处理流程,并提供了丰富的动作类、结果类型和插件支持。通过使用Struts2,开发者可以实现清晰的业务逻辑分离,提高代码可维护性和可测试性。 **...
它实现了请求处理、视图渲染、拦截器链等功能。 2. **ognl-2.6.9.jar**:Object-Graph Navigation Language(OGNL)是一个强大的表达式语言,用于获取和设置对象的属性。在Struts 2中,OGNL用于表示Action方法的...
Interceptors(拦截器)是Struts2的一个重要特性,它们是可复用的代码片段,可以在Action执行前后进行增强,比如日志记录、权限验证等。 此外,Struts2还支持多种结果类型(Results),如dispatcher(默认的JSP渲染...
struts2的基石-拦截器 struts2中实现IOC struts2中实现文件上传 struts2中实现CRUD struts2中的OGNL struts2的新表单标志的使用 struts2与AJAX一 struts2与AJAX二 struts2与AJAX三 struts2中用Spring实现IOC struts2...
Struts 2是Java Web开发中的一个开源框架,它的核心机制之一就是拦截器(Interceptor)。拦截器在MVC模式中扮演着重要的角色,允许开发者在请求处理前后插入自定义的逻辑,增强了系统的可扩展性和灵活性。 ### 拦截...
它继承了 Struts 1 的优点,并引入了许多改进,如拦截器机制,使开发者可以更加灵活地处理请求和响应。Struts 2 与 Spring 的整合提供了更强大的功能,例如利用 Spring 的 DI 来管理 Struts 2 的动作类,以及事务...
在实际开发中,Struts2允许灵活的扩展性,例如通过编写自定义拦截器来增强功能,或使用FreeMarker或JSP作为视图层模板技术。文档中还会讲解如何使用Struts2的异常处理机制,以及如何调试和解决常见的运行时问题。 ...
3. **拦截器库**:`struts2-convention-plugin.jar`和`struts2-interceptor-plugin.jar`提供了多种内置拦截器,如Params拦截器处理参数绑定,Validation拦截器负责验证,以及Tiles拦截器用于页面布局。 4. **结果...
同时,Struts2还支持丰富的结果类型和拦截器,可以实现权限控制、日志记录等功能,提高系统的灵活性和可扩展性。 Mybatis则专注于数据持久化,作为一个轻量级的ORM(对象关系映射)框架,它使得开发者可以使用SQL...
2. **拦截器机制**:Struts 2的拦截器是其强大功能的关键,它们可以用来添加额外的功能,如日志、权限验证、数据校验等。 3. **Action与结果**:理解Action是如何处理请求并返回结果的,以及如何配置结果类型。 4. *...
Struts2的拦截器机制可以确保这些操作在合适的时机执行,并返回相应的视图进行展示。 2. **读取(Read)**: 为了从SQLite3数据库中检索数据,可以编写查询语句,如SELECT,以获取满足特定条件的数据。Struts2 ...
Struts框架提供了一套详细的机制,包括动作类、配置文件和拦截器,来协调应用程序的各个部分,使得开发者可以更有效地管理用户界面和后端逻辑。 Spring框架则是一个全面的企业级应用框架,它不仅包含Struts的MVC...
开发者可以通过阅读文档了解如何配置Struts2的XML文件(如struts.xml和web.xml),如何定义Action,如何使用拦截器,以及如何创建自定义结果类型等。 总之,Struts2开发包是一个完整的开发环境,它集成了处理请求、...
首先,Struts2的核心库包括`struts2-core.jar`,它包含了框架的主要功能,如Action映射、拦截器、结果类型和插件接口。这个jar包是所有Struts2应用的基础,提供了请求处理和视图渲染的能力。 接下来,`xwork-core....
8. **javassist.jar**:这是一个代码生成库,Struts2使用它来实现运行时动态代理,创建拦截器。 9. **slf4j-api.jar** 和 **log4j.jar**:日志框架接口和实现,Struts2使用它们进行日志记录,方便调试和问题定位。 ...
它基于Model-View-Controller(MVC)架构模式,提供了丰富的特性,包括动作调度、拦截器、结果类型、插件扩展等,极大地简化了Java Web开发。在Struts2开发中,jar包扮演着至关重要的角色,它们包含了框架的核心功能...
它提供了请求处理、拦截器链、插件架构等功能,是Struts2框架的基石。 2. **JSP和Struts2的集成**:在JSP页面中,我们可以通过`<s:form>`、`<s:textfield>`等Struts2标签库来创建表单和输入字段,实现与Action的...