Struts2学习笔记四:深入拦截器
一:拦截器的工作原理

拦截器的执行过程可以类比filter过滤器,ActionInvocation实例执行过程中,先执行action实例上引用的拦截器们,然后才执行action实例处理请求,返回result,决定响应内容(注:此时还没进行响应!),然后倒序再执行一遍拦截器们,才通过response进行响应。
二:拦截器的使用
1:定义拦截器类
法一:实现Interceptor接口定义拦截器类
实现接口需要重写三个方法,分别是初始化方法、销毁方法、拦截方法,一般我们只需重写拦截方法即可。

参数ActionInvocation可以通过getXX()的方法获取action对象等。
法二:继承AbstractInterceptor类
这AbstractInterceptor抽象类默认提供了init()/destroy()方法的空实现,所以我们只需重写intercep(ActionInvocation ai)方法即可,参数ActionInvocation可以通过getXX()的方法获取action对象等。
拦截器代码执行顺序:类比与filterchain上过滤器的执行顺序
class myinter extends AbstractInterceptor{
public String intercept(ActionInvocation invocation) throws Exception{
before拦截:调用action前执行的代码;
invocation.invoke();//执行下一个拦截器,如果没有,则执行action
after拦截:action执行完毕后,执行的拦截器代码,倒序执行完拦截器栈
}
}
2:注册拦截器
在structs.xml中注册拦截器
<interceptors>
<interceptor name="定义拦截器在框架中的名字" class="拦截器类的完整路径"/>
</interceptors>
3:引用拦截器
在配置action时,引用拦截器
<package name="default" extends="struts-default">//在一个package中注册、配置拦截器与action
<interceptors>
<interceptor name="inter" class=".."/>//注册拦截器
</interceptors> <action name="xxAction" class="..">
<interceptor-ref name="inter"/>//引用拦截器
<result name="success"
type="redirect">...jsp</result>
</action>
</package>
三:内建拦截器以及使用
Structs2自带了许多实用的拦截器,封装在“struts-defaust”包中。在配置package时,可以通过 extends=“struts-defaust”引入这些内置拦截器。在此package下配置action时,如果没有为action引用自定义拦截器,则默认会引用struts-defaust包中的默认拦截器栈。但如果引用了自定义的拦截器,则需要显式引用默认拦截器栈,否则不生效。
内建拦截器主要有:
alias (别名拦截器):允许参数在跨越多个请求时使用不同别名,该拦截器可将多个Action采用不同名字链接起来,然后用于处理同一信息。
autowiring (自动装配拦截器):主要用于当Struts2和Spring整合时,Struts2可以使用自动装配的方式来访问Spring容器中的Bean。
chain (链拦截器):构建一个Action链,使当前Action可以访问前一个Action的属性,一般和<result type="chain" .../>一起使用。
checkbox (多选框拦截器):将没有选中的checkbox项设置为false,协助管理多选框。在HTTP请求里,那些没有被选中的项通常没有任何值。
conversionError (转换器错误拦截器):这是一个负责处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext 中取出,并转换成Action的FieldError错误。
createSession (创建Session拦截器):该拦截器负责创建一个HttpSession对象,主要用于那些需要有HttpSession对象才能正常工作的拦截器中。
clearSession (清除Session拦截器):负责销毁HttpSession对象.
debugging (调试拦截器):当使用Struts2的开发模式时,这个拦截器会提供更多的调试信息。
execAndWait (执行和等待拦截器):后台执行Action时,给用户显示一个过渡性的等待页面。
externalRef (扩展拦截器):负责扩展引用
exception (异常拦截器):将Action抛出的异常映射到结果,这样就通过重定向自动处理异常。
fileUpload (文件上传拦截器):这个拦截器主要用于文件上传,它负责解析表单中文件域的内容,并把上传文件设置为action中的对应属性变量值。
i18n (国际化拦截器):主要负责把用户所选的语言、区域放入用户Session中。
logger (日志拦截器):主要是输出Action的名字,提供简单的日志输出。
modelDriven (模型驱动拦截器):这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel ()方法的结果堆入ValueStack中。
scopedModelDriven (作用域模型驱动拦截器):如果一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定生存范围中找出指定的Model,并将通过setModel方法将该Model传给Action实例。
params (参数过滤拦截器):这是一个最基本的拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值。
prepare (预备拦截器):如果action实现了Preparable接口,将会调用该拦截器的prepare()方法。
staticParams (静态参数拦截器):这个拦截器负责将xml中<action>标签下<param>标签中的参数传入action。
scope (作用域拦截器):这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext 范围内。
servletConfig (Servlet配置拦截器):如果某个Action需要直接访问Servlet API,就是通过这个拦截器实现的,它提供访问HttpServletRequest和HttpServletResponse的方法,以map方式访问。
roles (角色拦截器):这是一个JAAS(Java Authentication and Authorization Service,Java授权和认证服务)拦截器,只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action。
timer (计时拦截器):这个拦截器负责输出Action的执行时间,在分析该Action的性能瓶颈时比较有用。
token (令牌拦截器):这个拦截器主要用于阻止重复提交,它检查传到Action中的token,从而防止多次提交。
tokenSession (令牌会话拦截器):这个拦截器的作用与前一个基本类似,只是它把非法提交的数据保存在HttpSession中,不跳转到错误页面,再次生成与第一次相同的响应页面
validation (验证拦截器):通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验。
workflow (工作流拦截器):这个拦截器负责调用Action类中的validate方法,如果校验失败,则不执行业务方法,而是返回input的逻辑视图。
jsonValidation (json拦截器):验证失败时,可以将fieldError和actionErrors信息序列化成json,返回给客户端
profiling (概要拦截器):允许Action记录简单的概要信息。
actionMappingParams (Action映射拦截器):Parameters set by the action mapping are not set/not available through ParameterAware
annotationWorkflow (注解工作流拦截器):利用注解替代XML配置,使用annotationWorkflow拦截器可以使用@After、@Before、@BeforeResult等注解,执行流程为before-execute-beforeResult-after顺序
store (消息存储拦截器):在会话中为Action存储和检索消息、字段错误以及Action错误,该拦截器要求Action实现ValidationAware接口。
引用内建拦截器:
<package name="mypackage" extends="struts-default">//继承默认包 <!-- 定义自定义拦截器 -->
<interceptors>
<interceptor name="myinterceptor" class="com.test.interceptors.myinterceptor">
<interceptors> <action name="myaction">
<result>/success.jsp</result>
<result>/error.jsp</result>
<!-- 引入自定义拦截器 -->
<interceptor-ref name="myinterceptor" />
<!-- 引入系统默认拦截器栈 -->
<interceptor-ref name="defaultStack" />
</action> </package>
四:拦截器栈:模块化管理拦截器
当拦截器比较多的时候,如果某一些拦截器被多个action引用,那么在多个action配置时逐个引用,会造成大量重复内容。这时,我们可以配置拦截器栈,把某一类被多个action公用的拦截器放到一个拦截器栈中,然后action引用拦截器栈即可。
<interceptors>
<interceptor name="inter1" class="路径" />
<interceptor name="inter.." class="路径" /> //注册拦截器 <interceptor-stack name="XX_Stack">//定义拦截器栈,在action中通过拦截器栈名进行引用
<interceptor-ref name="inter.." />//引用拦截器
<interceptor-ref name="defaultStack" />//自定义的拦截器栈一般都要引用默认拦截器栈
</interceptor-stack>
</interceptors>
Struts2学习笔记四:深入拦截器的更多相关文章
- 【Struts2学习笔记-6--】Struts2之拦截器
简单拦截器的使用 拦截器最基本的使用: 拦截方法的拦截器 拦截器的执行顺序 拦截结果的监听器-相当于 后拦截器 执行顺序: 覆盖拦截器栈里特定拦截器的参数 使用拦截器完成-权限控制 主要完成两个功能: ...
- Struts2学习笔记(十)——自定义拦截器
Struts2拦截器是基于AOP思想实现的,而AOP的实现是基于动态代理.Struts2拦截器会在访问某个Action之前或者之后进行拦截,并且Struts2拦截器是可插拔的:Struts2拦截器栈就 ...
- Struts2学习第四天——拦截器及文件上传
1.概述 Struts2的很多核心功能都是由拦截器完成的. 拦截器很好的实现了AOP的编程思想,在动作的执行之前和结果的返回之后,做拦截处理. 2.struts2的默认拦截器栈 3.自定义拦截器 St ...
- Struts2学习笔记04 之 拦截器
一.创建拦截器组件 1. 创建一个类,实现Interceptor接口,并实现intercept方法 2.注册拦截器 3.引用拦截器 二.拦截器栈 预置拦截器: 默认引用拦截器 拦截器调用顺序: Fil ...
- SpringBoot学习笔记:自定义拦截器
SpringBoot学习笔记:自定义拦截器 快速开始 拦截器类似于过滤器,但是拦截器提供更精细的的控制能力,它可以在一个请求过程中的两个节点进行拦截: 在请求发送到Controller之前 在响应发送 ...
- [原创]java WEB学习笔记74:Struts2 学习之路--自定义拦截器,struts内建的拦截器
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- struts2框架学习笔记6:拦截器
拦截器是Struts2实现功能的核心部分 拦截器的创建: 第一种: package interceptor; import com.opensymphony.xwork2.ActionInvocati ...
- Struts2学习:interceptor(拦截器)的使用
对于需要登陆验证.权限验证等功能的网站,每一次请求,每一个action都写一段验证的代码,未免显得冗余且不易维护.struts2提供了拦截器interceptor,为这些页面提供一个切面,或者说公共组 ...
- Struts2学习第4天--拦截器
第1章 Struts2_day04笔记 1.1 上次课内容回顾 l OGNL表达式 n OGNL的概述 u OGNL:对象图导航语言,是一门功能强大的表达式语言. n OGN ...
随机推荐
- fabric-ca-server
fabric-ca-server start -b admin:adminpw -d --db.type mysql --db.datasource "root:rootpwd@tcp(17 ...
- 利用ViewStub来延迟加载视图
很多情况下,我们的视图可能会随着用户的操作的不同而变化,比如一个新的页面包含多个控件,但仅仅在用户点击这个按钮后,所有的控件才能完全显示.也就是说一上来可能就显示一个控件,点击按钮后把其他隐藏的控件再 ...
- 摩拜单车模式优于OFO双向通信才能被认可
马化腾 :摩拜单车模式优于OFO双向通信才能被认可 2017-06-20 00:12 最近共享单车里最头条的新闻是 悟空单车宣布退出竞争,并全部退还投资款和押金以及余额.运营才5个月,成为第一家倒下的 ...
- 置顶菜单demo
一朋友需要置顶菜单的功能,给了个网站,让弄下来.看了下,就把样式及效果拔了下来.去掉了复杂的东西,只保留了其基本实现.有需要的朋友可以拿去用用. <style> #navigation{ ...
- OA系统权限管理设计方案【转】
l 不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最基本的功能. l 可以对“组”进行权限分配.对于一个大企业的业务系统来说,如果要求管理员为其下员工逐一分配系统操作权限的话,是 ...
- 在springboot项目中使用mybatis 集成 Sharding-JDBC
前段时间写了篇如何使用Sharding-JDBC进行分库分表的例子,相信能够感受到Sharding-JDBC的强大了,而且使用配置都非常干净.官方支持的功能还包括读写分离.分布式主键.强制路由等.这里 ...
- JS条件判断
JavaScript 是一种可以在浏览器中运行的脚本语言,是一种弱语言(相对于C,C#,JAVA而言),只要是计算机语言就会使用到条件判断式,而JavaScript作为一种“弱”语言,它的条件判断常常 ...
- C#访问远程主机资源的方法
实现访问远程主机的共享目录中的一个文件的解决方法: 一.调用Net use命令 // 使用方法: //if (Connect("192.168.1.48", &quo ...
- IntelliJ IDEA windows与mac下常用快捷键
摘自: http://www.th7.cn/Program/java/201604/817219.shtml 1.找文件找代码找引用 shif双击在项目的所有目录查找 ctrl+f(mac下:comm ...
- java--线程认识与实例记录 NO.1
下面的内容都是从java编程思想一书中摘取出来,我认为很有产考价值,并且便于后续使用. 主要内容是记录继承thread和实现runnable接口两种方式的代码用法,及内部类中启用线程的用法. 1.首先 ...