struts2拦截器原理
一、理解Struts2拦截器
1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。
二、实现Struts2拦截器原理
Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的 拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器
三、定义Struts2拦截器。
Struts2规定用户自定义拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接口。该接口声明了3个方法,
void init(); void destroy(); String intercept(ActionInvocation invocation) throws Exception; |
其中,init和destroy方法会在程序开始和结束时各执行一遍,不管使用了该拦截器与否,只要在struts.xml中声明了该Struts2拦截器就会被执行。
intercept方法就是拦截的主体了,每次拦截器生效时都会执行其中的逻辑。
不过,struts中又提供了几个抽象类来简化这一步骤。
public abstract class AbstractInterceptor implements Interceptor; public abstract class MethodFilterInterceptor extends AbstractInterceptor; |
都是模板方法实现的。
其中AbstractInterceptor提供了init()和destroy()的空实现,使用时只需要覆盖intercept()方法;
而MethodFilterInterceptor则提供了includeMethods和excludeMethods两个属性,用来过滤执行该过滤器的action的方法。可以通过param来加入或者排除需要过滤的方法。
一般来说,拦截器的写法都差不多。看下面的示例:
package interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class MyInterceptor implements Interceptor { public void destroy() { // TODO Auto-generated method stub } public void init() { // TODO Auto-generated method stub } public String intercept(ActionInvocation invocation) throws Exception { System.out.println("Action执行前插入 代码"); //执行目标方法 (调用下一个拦截器, 或执行Action) final String res = invocation.invoke(); System.out.println("Action执行后插入 代码"); return res; } } |
四、配置Struts2拦截器
Struts2拦截器需要在struts.xml中声明,如下struts.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.objectFactory" value="spring" /> <package name="default" extends="struts-default"> <interceptors> <interceptor name="MyInterceptor" class="interceptor.MyInterceptor"></interceptor> <interceptor-stack name="myInterceptorStack"> <interceptor-ref name="MyInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <action name="loginAction" class="loginAction"> <result name="fail">/index.jsp </result> <result name="success">/success.jsp</result> <interceptor-ref name="myInterceptorStack"></interceptor-ref> </action> </package> </struts> |
拦截器 |
名字 |
说明 |
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拦截器原理相关推荐
- struts2 javaweb 过滤器、监听器 拦截器 原理
转: 过滤器.监听器 拦截器 过滤器 创建一个 Filter 只需两个步骤: (1)创建 Filter 处理类: (2)在 web.xml 文件中配置 Filter . 创建 Filter 必须实现 ...
- Struts2 拦截器(Interceptor )原理和配置
Struts2 拦截器 拦截器在概念上与servlet过滤器或JDK代理类相同.拦截器允许横切功能,把action以及框架分开实现.你可以使用拦截器实现以下操作: 在调用action之前提供预处理逻辑 ...
- struts2拦截器简介
2019独角兽企业重金招聘Python工程师标准>>> 一.理解Struts2拦截器 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦 ...
- Struts2拦截器的使用
如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了str ...
- 从struts2拦截器到自定义拦截器
http://www.cnblogs.com/withyou/p/3170440.html 拦截器可谓struts2的核心了,最基本的bean的注入就是通过默认的拦截器实现的,一般在struts2.x ...
- Struts2拦截器的使用 (详解)
Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...
- struts2拦截器理论知识
软件设计中DRY规则,即不要写重复的代码,这样可以大大减轻后期维护的工作量!但是问题来了,重复的代码是不可避免的,比如在用户发送请求之前先判断用户是否登录,怎么办呢?于是就把这些重复代码提取出来,封装 ...
- Struts2拦截器和标签
一.struts2拦截器 1.struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面. 2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每 ...
- 《struts2拦截器的使用》
struts2 拦截器的使用 在struts2的工作原理博文中http://blog.csdn.net/u010412719/article/details/51193352,可以看到,拦截器是str ...
- Struts2拦截器属性excludeMethods、includeMethods配置无效之解决方法
参考:http://blog.csdn.net/coolcoffee168/article/details/7963251 在配置struts2 拦截器属性excludeMethods.include ...
最新文章
- 中国互联网+机器视觉行业商业模式创新与投资机会深度研究报告
- 2022-2028年中国三网融合产业深度调研及投资前景预测报告
- 在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合
- 计算机设计大赛海洋世界,全国大学生海洋文化设计大赛第二届获奖作品(三)...
- mysql mydumper_MySQL 之mydumper安装详解
- Tomcat内存释放不了、Tomcat内存溢出原因
- number类型转换java_Number()数据类型转换
- 解决Android的adb命令行报错Permission denied
- 电大系统服务器的性能测试报告表,湖南电大校教职工绩效管理系统的设计与实现...
- RubyonRails是WebDev最佳选择的5个原因
- Java多线程电影院_java 多线程-快乐订座电影院
- 病毒分析四:steam盗号病毒
- 动态相关系数dcc_常相关系数(CCC)和动态条件相关系数(DCC)
- 识别INSB号码C语言如何讲述,探究机器码,深入研究C语言程序的机制
- 小论电阻1(电阻的参数)
- 2021年焊工(初级)考试内容及焊工(初级)最新解析
- 2021肇庆各中学高考成绩查询入口,2021高考即将来袭!肇庆各学校的同学们准备好了吗?...
- 小米路由器3有信号无网络连接到服务器,小米路由器3上不了网(不能上网)怎么办?...
- java设计模式之策略模式应用:订单手续费计算
- 如果你有多余的想象力,请安放在手机上
热门文章
- 16进制与2进制转换
- 超像素块提取 matlab,GitHub - CielChen/Make3DFeature: 将图像分割成超像素,并提取每个超像素块的Make3D特征...
- 工厂5S管理的内容和标准
- 推导飞机飞行动力学方程组
- 硬盘的IDE、AHCI和NVMe模式区别
- android从assets文件下面复制文件
- IDEA更改maven镜像源
- imageJ打不开mp4怎么办?
- 智能客服搭建(4) - 语音流的分贝计算
- sd卡插入计算机要格式化,内存卡一直提示格式化,内存卡插电脑要格式化-