struts拦截器的使用
拦截器的使用
转自http://blog.csdn.net/woshisap/article/details/7271854
1:拦截器(Interceptor)
拦截器是Struts2最强大的特性之一,它是一种可以让用户在Action执行之前和Result执行之后进行一些功能处理的机制。
图中示意了三个拦截器,Interceptor1、Interceptor2、Interceptor3,注意的是他们的执行顺序,在Action运行之前是按照Interceptor1、Inteceptor2和Inteceptor3的顺序,而在Result执行之后,再次运行拦截器的时候是按照Interceptor3、Interceptor2和Interceptor1的顺序执行的,顺序刚好相反。
2:拦截器的优点
a:简化了Action的实现。拦截器能把很多功能从Action中独立出来,大量减少了Action的代码
b:功能更单一。按照上面的描述,把功能从Action中分离出来,分散到不同的拦截器中,这样每个拦截器的功能,以及Action本身的功能就更单一了。
c:通用代码模块化。从Action中把功能分离出来,放到拦截器中去实现,这样能把一些在多个Action中通用的代码进行模块化,封装在一个或者几个拦截器中。
d:提高重用性。当通用的功能代码被封装在拦截器中,实现了代码模块化过程之后,就可以对不同的Action,根据功能需要,来配置相同的拦截器了。
e:实现AOP。
拦截器相比Filter具有更强大的功能,比如拦截器与Servlet的API无关,比如拦截器可以访问到值栈等。
3:拦截器的的调用顺序
a:首先,要找到它自己有没有声明拦截器的引用,即<action>元素有没有<interceptor-ref>子元素,如果有,则不用继续寻找,直接使用这些拦截器,如果没有进行下一步的查找。
b:其次,找到这个<action>所在包有没有声明默认的拦截器引用,即<package>元素的<default-interceptor-ref>子元素,如果有,则不用继续再找,直接使用这些拦截器,如果没有,则进行下一步的查找。
c:递归的查找这个包的父包,看看有没有声明默认的拦截器引用,直到找到默认的拦截器引用为止。
4:开发自定义的拦截器
开发自定义的拦截器,要实现Interceptor接口,还要使用到ActionInvocation接口,现在对ActionInvocation接口进行简单的介绍。
它里面有一些方法,如下:
a:getAction,获得这次请求准备执行的Action对象。
b:getProxy,返回这次请求的ActionProxy对象,可以在这个对象上获得要运行Action的哪个方法。
c:getInvocationContext,返回这个Action执行的上下文(ActionContext),可以在这个上下文对象中获得大量的数据,比如请求的parameter值,session的值等。
d:在ActionContext中取到的parameter值是一个Map<String, Object>,其中以String为key,以String[]为value,这个Map记录了所有的request参数。
e:getResult方法,返回Result运行之后代表结果的Result对象。
我们要实现这样一个Aciton,要求拦截器输出如下的信息:运行哪个Action类,运行哪个方法,请求的参数和Action运行完要跳转到哪个JSP。
import java.util.Map; import org.apache.struts2.dispatcher.ServletDispatcherResult; import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.interceptor.Interceptor; public class LoggerInterceptor implements Interceptor { @Override
public void destroy() { } @Override
public void init() { } @Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("-----begin------"); //运行的action的名字
String actionName = invocation.getAction().getClass().getName();
System.out.println("Action:" + actionName); //执行的action的方法
String method = invocation.getProxy().getMethod();
System.out.println("method:" + method); //获得这次请求的parameter对象,并打印
Map<String, Object> params = invocation.getInvocationContext().getParameters();
for(String key : params.keySet()) {
Object obj = params.get(key); if(obj instanceof String[]) {
String[] array = (String[])obj;
System.out.print("Param: " + key + "values: ");
for(String value : array) {
System.out.print(value + ", ") ;
}
System.out.print("\n");
}
} //运行后续的拦截器、Action和Result
String resultCode = invocation.invoke(); //在Action和Result运行之后,得到Result对象,并且可以强制转换成ServletDispatcherResult
//打印其下一个jsp的位置
Result result = invocation.getResult();
if(result instanceof ServletDispatcherResult) {
ServletDispatcherResult dispatcherResult = (ServletDispatcherResult)result;
System.out.println("JSP:" + dispatcherResult.getLastFinalLocation());
} System.out.println("-----end-----"); return resultCode;
} }
5:一个重要的拦截器timer
timer拦截器是Struts2的预定义拦截器之一,可以用来记录Action运行的时间。
配置:在struts.xml中写入配置信息,如下所示,
<package name="hello" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="MyLogger" class="com.capinfotech.inteceptor.LoggerInterceptor">
</interceptor>
</interceptors>
<action name="hello" class="com.capinfotech.action.HelloAction">
<interceptor-ref name="MyLogger"></interceptor-ref>
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">/WEB-INF/jsp/success.jsp</result>
</action>
</package>
程序运行输入信息如下:
6:Struts2的预定义拦截器
a:params拦截器
把请求参数设置进Action的相应属性,并自动进行类型转换
b:staticParams拦截器
将struts.xml配置文件里定义的Action参数,设置到对应的Action实例中,Action参数使用<param>标签,是<action>标签的子元素。
<action name="hello" class="HelloAction">
<param name="account">test</param>
</action>
这要求action中有一个account属性,并有相应的setter和getter方法,运行的时候,action的account属性在初始化过后,会接到这里的赋值test。
c:prepare拦截器
在action执行之前调用Action的prepare方法,这个方法是用来准备action之前要做的工作,它要求用户必须实现com.opensymphony.xwork2.Preparable接口。
d:modelDriven拦截器
如果action实现了ModelDriven接口,它将getModel方法取得的模型对象存入OgnlValueStack中。
e:chain拦截器
chain拦截器,将前一个执行结束的Action属性设置到当前的action中,它被用在ResultType为"chain"所指定的结果的Action中,该结果Action对象会从值栈获得前一个Action对应的属性,它实现Action链之间的数据传递。
f:exception拦截器
在抛出异常的时候,这个拦截器起作用,任何应用都应该引用这个拦截器,而且引用的时候,最好把它放在第一位,让它能捕获所有的异常。
g:validation拦截器
调用验证框架读取*-validation.xml文件,并且应用在这些文件中声明的校验。
h:token拦截器
核对当前Action请求(request)的有效标识,防止重复提交Action请求,使用标签<s:token>可以生成表单令牌,该标签会在Session中设置一个预期的值,并且在表单中创建一个隐藏的input字段,Token拦截器会检查这个令牌,如果不合法,将不会执行Action,这个拦截器是手工添加的,还需要一个invalide.token的result。
i:conversionError拦截器
用来处理框架进行类型转化(Type Conversion)时的出错信息,它将存储在ActionContext中的类型转化错误信息转化成相应的Action字段的错误信息,保存在堆栈中。根据需要,可以将这些错误信息在视图中显示出来。
j:fileUpload拦截器
用来处理上传文件
k:workflow拦截器
Action默认的工作流,如果Action实现了Validateable接口,那么interceptor会调用action的validate()方法,如果Action实现了ValidateAware接口,那么interceptor将会检查Action是否包含错误信息,如果包含错误信息,那么Interceptor将会返回input,而不让Action继续执行。
l:servletConfig拦截器
这个拦截器提供Action直接对Servlet API的调用,把Servlet API的对象注入到Action中,包括ServletRequestAware,ServletResponseAware,ParameterAware,SessionAware和ApplicationAware
m:timer拦截器
记录ActionInvocation剩余部分执行的时间,并作为日志信息记录下来,便于寻找性能瓶颈。
n:logger拦截器
在日志信息中输出要执行的Action信息,这样,在调试的时候,就能很快的定位到这个对应的Action中了。
o:tokenSession拦截器
扩展了token拦截器的功能,当提交无效的Action请求标识时,它会跳转到第一次成功后的页面
struts拦截器的使用的更多相关文章
- [置顶] 使用struts拦截器+注解实现网络安全要求中的日志审计功能
J2EE项目中出于安全的角度考虑,用户行为审计日志功能必不可少,通过本demo可以实现如下功能: 1.项目中记录审计日志的方法. 2.struts拦截器的基本配置和使用方法. 3.struts拦截器中 ...
- 利用Struts拦截器限制上传图片的格式和大小
在这之前 Struts的一个核心功能就是大量的拦截器,既然是框架,那么自然也就贴心地为我们准备好了各种常用的功能,比如这里即将讨论的如何限制上传图片的格式和大小.那么既然是使用Struts已经写好的拦 ...
- Struts拦截器设置完的值为什么在页面取不到
Struts拦截器设置完的值为什么在页面取不到. ActionContext ac = (ActionContext) invocation.getInvocationContext(); ac.pu ...
- struts 拦截器 Interceptor
拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用.正如上面 Struts2的Reference中讲述的,Stru ...
- struts拦截器实现原理
图1: 上1来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请 ...
- struts拦截器
struts中的拦截器相当于过滤器的作用 一在struts.xml中配置拦截器或拦截器栈 <interceptors>!--全部的拦截器 <interceptor name=&quo ...
- (转)Struts 拦截器
一.拦截器是怎么实现: 实际上它是用Java中的动态代理来实现的 二.拦截器在Struts2中的应用 对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作.像params拦截器将http请 ...
- struts——拦截器
什么是拦截器 拦截器(Interceptor)是Struts 2的一个强有力的工具,有许多功能都是构建于它之上,如国际化(前两篇博客介绍过).转换器,校验等. 拦截器是动态拦截Action调用的对象. ...
- Struts拦截器使用
创建拦截器java程序 package cn.itcast.oa.util; import com.opensymphony.xwork2.ActionInvocation; import com.o ...
- 六 Struts 拦截器、OGNL表达式
一.OGNL表达式1.概念:是表达式语言,专门用来访问对象取值用的.2.对比EL表达式使用场景: A.EL主要用在web的jsp页面取值 B.OGNL适用以下环境 1.java程序中 2.在页面使用( ...
随机推荐
- GPnP profile内容
<?xml version="1.0" encoding="UTF-8"?> <gpnp:GPnP-Profile Version=&quo ...
- intellij idea自定义快捷键
intellij idea自定义快捷键比较简单,自带. 首先进入idea,File-->Settings-->Live Templates. 点击右上方的“+”,第一次需要创建一个分组. ...
- QT+event() + 事件过滤器
其存在的意义: mywidget.h: #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> namespace Ui { cl ...
- javaweb基础(17)_jsp九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- lua 分割字符串
-- 参数:待分割的字符串,分割字符 -- 返回:子串表.(含有空串) function split(str, split_char) local sub_str_tab = {} while tru ...
- 直接用bcdedit创建bootmgr数据库和修复启动菜单
直接用bcdedit创建bootmgr数据库和修复启动菜单 使用下面方法之前需要bcdedit和bootsect两条命令,这两条命令可以到vista或者windows 7安装光盘上获得.bootsec ...
- Codeforces Round #513 (rated, Div. 1 + Div. 2)
前记 眼看他起高楼:眼看他宴宾客:眼看他楼坍了. 比赛历程 开考前一分钟还在慌里慌张地订正上午考试题目. “诶这个数位dp哪里见了鬼了???”瞥了眼时间,无奈而迅速地关去所有其他窗口,临时打了一个缺省 ...
- CNCF 有哪些具体的项目内容?
前言:CNCF(Cloud Native Computing Foundation)于 2015 年 7 月成立,隶属于 Linux 基金会,初衷围绕“云原生”服务云计算,致力于维护和集成开源技术,支 ...
- MYSQL不能显示中文字,显示错误“ERROR 1366 (HY000): Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89'”
或者建表时带上编码utf8 CREATE TABLE `students`( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR( ...
- 【mysql】mysql存储过程实例
```mysql DELIMITER $$ DROP PROCEDURE IF EXISTS `system_number_update` $$ CREATE DEFINER=`root`@` ...