- 浏览: 62525 次
- 性别:
- 来自: 应县
最新评论
-
fc19861011:
请问你解决了吗?poi修改word中生成的图表数据找了好久没发 ...
jacob 怎么改变 word图表的数据呢? -
longgol:
GridPanel中mouseover事件获取列index
...
GridPanel中mouseover事件获取行index
Interceptor(拦截器)将Action共用的行为独立出来,在Action执行前后运行。这也就是我们所说的AOP(Aspect Oriented Programming,面向切面编程),它是分散关注的编程方法,它将通用需求功能从不相关类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。
Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。Interceptor在框架中的应用如下图所示:
当你提交对Aciton(默认是.action结尾的Url)的请求时,ServletDispatcher会根据你的请求,去调度并执行相应的Action。在Action执行之前,调用被 Interceptor截取,Interceptor在Action执行前后运行。
我们在用户注册的例子中就使用了取得Request请求参数的拦截器,配置文件中将拦截器params组装到RegisterAction中。“params”在我们的webwork-default.xml配置文件中有定义,webwork-default.xml中拦截器的定义如下:
<interceptors>
<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
<interceptor name="static-params" class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
<interceptor name="conversionError" class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="static-params"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
</interceptors>
这些都时有框架提供的默认的Interceptor,下面我来看看Interceptor使用的步骤:
1、 创建一个自己需要的Interceptor类,它必需实现com.opensymphony.xwork.interceptor.Interceptor接口,具体的开发见下面的Interceptor的原理。
2、 在配置文件(xwork..xml)中申明这个Interceptor类,它放在标签中,同是标签嵌入在标签内部。
3、 创建Interceptor栈,使用标签: />,让一组Interceptor可以按次序调用。(可选)
4、 指定Action所要用到的Interceptor(前面申明过的),可以用或标签。前面的标签指定某个Action所用到的Interceptor,如果Action没有被用指定Interceptor,它将使用指定的Interceptor。
框架中给我们提供了很多实用的Interceptor,它的定义上面已经给出,它的具体功能如下:
● timer:记录Action执行的时间,并做为日志信息输出;
● logger:在日志信息中输出要执行的Action信息;
● chain:将前一个执行结束的Action属性设置到当前的Action中。它被用在ResultType为“chain”指定结果的Action中,该结果Action对象会从OgnlValueStack中获得前一个Action对应的属性,它实现Action链之间的数据传递;
● static-params:将xwork.xml配置文件里定义的Action参数,设置到对应的Action中。Action参数使用标签,是标签的直接子元素。我们这里定义的Action类必需实现com.opensymphony.xwork.config.entities. Parameterizable接口;
● params:将Request请求的参数设置到相应Action对象的属性中,用户注册例子用到过这个拦截器;
● model-driven:如果Action实现ModelDriven接口,它将getModel()取得的模型对象存入OgnlValueStack中;
● component:激活组件功能支持,让注册过的组件在当前Action中可用,即为Action提供IoC(依赖倒转控制)框架的支持;
● token:核对当前Action请求(request)的有效标识,防止重复提交Action请求(request)。
● token-session:功能同上,但是当提交无效的Action请求标识时,它会将请求数据保存到session中。
● validation:实现使用xml配置文件({Action}-validation.xml)对Action属性值进行验证,详细请看后面介绍的验证框架。
● workflow:调用Action类的验证功能,假设Action使用ValidationAware实现验证(ActionSupport提供此功能),如果验证没有通过,workflow会将请求返回到input视图(Action的中定义的)。
● servlet-config:提供Action直接对HttpServletRequest或HttpServletResponse等JavaServlet api的访问,Action要实现相应的接口,例如:ServletRequestAware或ServletResponseAware等。如果必需要提供对JavaServlet api的访问,我们建议使用ServletActionContext,在前面ActionContext章节中有介绍。
● prepare:在Action执行之前调用Action的prepare()方法,这个方法是用来准备Action执行之前要做的工作。它要求我们的Action必需实现com.opensymphony.xwork. Preparable接口
● conversionError:用来处理框架进行类型转化(Type Conversion)时的出错信息。它将存储在ActionContext中的类型转化(Type Conversion)错误信息转化成相应的Action字段的错误信息,保存在堆栈中。根据需要,可以将这些错误信息在视图中显示出来。
Interceptor的原理
下面我们来看看Interceptor是如何实现在Action执行前后调用的:
Action和Interceptor在框架中的执行,是由ActionInvocation对象调用的。它是用方法:String invoke() throws Exception;来实现的,它首先会依次调用Action对应的Interceptor,执行完成所有的Interceptor之后,再去调用Action的方法,代码如下:
if (interceptors.hasNext()) ...{
Interceptor interceptor = (Interceptor) interceptors.next();
resultCode = interceptor.intercept(this);
} else ...{
if (proxy.getConfig().getMethodName() == null) ...{
resultCode = getAction().execute();
} else ...{
resultCode = invokeAction(getAction(), proxy.getConfig());
}
}
它会在拦截器栈中遍历Interceptor,调用Interceptor的方法:
String intercept(ActionInvocation invocation) throws Exception;。
我们一直都提到,Interceptor是在Action前后执行,可是从上面的代码我们看到的却是执行完所有Interceptor的intercept()方法之后再去调用我们的Action。“在Action前后执行”是如何实现的呢?我们来看看抽象类AroundInterceptor的intercept()实现:
public String intercept(ActionInvocation invocation) throws Exception ...{
String result = null;
before(invocation);
result = invocation.invoke();
after(invocation, result);
return result;
}
原来在intercept()方法又对ActionInvocation的invoke()方法进行递归调用,ActionInvocation循环嵌套在intercept()中,一直到语句result = invocation.invoke();执行结束,即:Action执行完并返回结果result,这时Interceptor对象会按照刚开始执行的逆向顺序依次执行结束。这样before()方法将在Action执行前调用,after()方法在Action执行之后运行。
参考:
(1) webwork中的Interceptor http://www.blogchinese.com/06042/201878/archives/2006/200682171647.shtml
(2) Interceptor(拦截器)框架 http://hellboys.bokee.com/2093340.html
Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。Interceptor在框架中的应用如下图所示:
当你提交对Aciton(默认是.action结尾的Url)的请求时,ServletDispatcher会根据你的请求,去调度并执行相应的Action。在Action执行之前,调用被 Interceptor截取,Interceptor在Action执行前后运行。
我们在用户注册的例子中就使用了取得Request请求参数的拦截器,配置文件中将拦截器params组装到RegisterAction中。“params”在我们的webwork-default.xml配置文件中有定义,webwork-default.xml中拦截器的定义如下:
<interceptors>
<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
<interceptor name="static-params" class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
<interceptor name="conversionError" class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="static-params"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
</interceptors>
这些都时有框架提供的默认的Interceptor,下面我来看看Interceptor使用的步骤:
1、 创建一个自己需要的Interceptor类,它必需实现com.opensymphony.xwork.interceptor.Interceptor接口,具体的开发见下面的Interceptor的原理。
2、 在配置文件(xwork..xml)中申明这个Interceptor类,它放在标签中,同是标签嵌入在标签内部。
3、 创建Interceptor栈,使用标签: />,让一组Interceptor可以按次序调用。(可选)
4、 指定Action所要用到的Interceptor(前面申明过的),可以用或标签。前面的标签指定某个Action所用到的Interceptor,如果Action没有被用指定Interceptor,它将使用指定的Interceptor。
框架中给我们提供了很多实用的Interceptor,它的定义上面已经给出,它的具体功能如下:
● timer:记录Action执行的时间,并做为日志信息输出;
● logger:在日志信息中输出要执行的Action信息;
● chain:将前一个执行结束的Action属性设置到当前的Action中。它被用在ResultType为“chain”指定结果的Action中,该结果Action对象会从OgnlValueStack中获得前一个Action对应的属性,它实现Action链之间的数据传递;
● static-params:将xwork.xml配置文件里定义的Action参数,设置到对应的Action中。Action参数使用标签,是标签的直接子元素。我们这里定义的Action类必需实现com.opensymphony.xwork.config.entities. Parameterizable接口;
● params:将Request请求的参数设置到相应Action对象的属性中,用户注册例子用到过这个拦截器;
● model-driven:如果Action实现ModelDriven接口,它将getModel()取得的模型对象存入OgnlValueStack中;
● component:激活组件功能支持,让注册过的组件在当前Action中可用,即为Action提供IoC(依赖倒转控制)框架的支持;
● token:核对当前Action请求(request)的有效标识,防止重复提交Action请求(request)。
● token-session:功能同上,但是当提交无效的Action请求标识时,它会将请求数据保存到session中。
● validation:实现使用xml配置文件({Action}-validation.xml)对Action属性值进行验证,详细请看后面介绍的验证框架。
● workflow:调用Action类的验证功能,假设Action使用ValidationAware实现验证(ActionSupport提供此功能),如果验证没有通过,workflow会将请求返回到input视图(Action的中定义的)。
● servlet-config:提供Action直接对HttpServletRequest或HttpServletResponse等JavaServlet api的访问,Action要实现相应的接口,例如:ServletRequestAware或ServletResponseAware等。如果必需要提供对JavaServlet api的访问,我们建议使用ServletActionContext,在前面ActionContext章节中有介绍。
● prepare:在Action执行之前调用Action的prepare()方法,这个方法是用来准备Action执行之前要做的工作。它要求我们的Action必需实现com.opensymphony.xwork. Preparable接口
● conversionError:用来处理框架进行类型转化(Type Conversion)时的出错信息。它将存储在ActionContext中的类型转化(Type Conversion)错误信息转化成相应的Action字段的错误信息,保存在堆栈中。根据需要,可以将这些错误信息在视图中显示出来。
Interceptor的原理
下面我们来看看Interceptor是如何实现在Action执行前后调用的:
Action和Interceptor在框架中的执行,是由ActionInvocation对象调用的。它是用方法:String invoke() throws Exception;来实现的,它首先会依次调用Action对应的Interceptor,执行完成所有的Interceptor之后,再去调用Action的方法,代码如下:
if (interceptors.hasNext()) ...{
Interceptor interceptor = (Interceptor) interceptors.next();
resultCode = interceptor.intercept(this);
} else ...{
if (proxy.getConfig().getMethodName() == null) ...{
resultCode = getAction().execute();
} else ...{
resultCode = invokeAction(getAction(), proxy.getConfig());
}
}
它会在拦截器栈中遍历Interceptor,调用Interceptor的方法:
String intercept(ActionInvocation invocation) throws Exception;。
我们一直都提到,Interceptor是在Action前后执行,可是从上面的代码我们看到的却是执行完所有Interceptor的intercept()方法之后再去调用我们的Action。“在Action前后执行”是如何实现的呢?我们来看看抽象类AroundInterceptor的intercept()实现:
public String intercept(ActionInvocation invocation) throws Exception ...{
String result = null;
before(invocation);
result = invocation.invoke();
after(invocation, result);
return result;
}
原来在intercept()方法又对ActionInvocation的invoke()方法进行递归调用,ActionInvocation循环嵌套在intercept()中,一直到语句result = invocation.invoke();执行结束,即:Action执行完并返回结果result,这时Interceptor对象会按照刚开始执行的逆向顺序依次执行结束。这样before()方法将在Action执行前调用,after()方法在Action执行之后运行。
参考:
(1) webwork中的Interceptor http://www.blogchinese.com/06042/201878/archives/2006/200682171647.shtml
(2) Interceptor(拦截器)框架 http://hellboys.bokee.com/2093340.html
发表评论
-
Tomcat集群与负载均衡
2011-01-26 16:00 612在单一的服务器上执行W ... -
xalan-2.7.0.jar下载地址
2011-01-26 15:59 3203xalan-2.7.0.jar下载地址:http://svn. ... -
provider org.apache.xalan.processor.TransformerFactoryImpl not found
2011-01-26 15:58 984完整的Exception: Exception startin ... -
Apache与Tomcat整合的简单方法
2011-01-26 15:57 6961、准备,下载需要的文件。这里假定你已经正确安装配置好了JDK ... -
(转)Tomcat源码学习(一)
2011-01-26 15:57 619Tomcat源码学习(一) http://carllgc.bl ... -
Tomat源码学习(二) [图片]
2011-01-26 15:55 746Tomat源码学习(二) Tomat6的整体架构 在上篇文 ... -
Tomat6架构探讨(续)
2011-01-26 15:54 737Tomat源码学习(二) 下面,我们重点针对Catalin ... -
JNDI
2011-01-26 15:49 739Java术语 英文全称是:Java ... -
JSP内建对象- - 转
2011-01-26 15:48 589① out - javax.servlet.jsp.jspWr ... -
全面理解String(JAVA复习)- -
2011-01-26 15:48 6101. 首先String不属 ... -
初学者如何开发出高质量的J2EE系统 (转载)
2011-01-26 15:47 725J2EE学习者越来越多,J2E ... -
关于JSP中的taglib uri
2011-01-26 15:47 1025自定义标签在jsp中应用是需要声明标签库,有下面两种方式: 1 ... -
context-param和init-param区别
2011-01-26 15:46 478web.xml里面可以定义两种参数: (1)applicati ... -
javax.servlet.Filter运用
2011-01-26 15:46 720Servlets Filter 是Servlet 2.3 规范 ... -
javax.servlet.FilterChain
2011-01-26 15:45 995javax.servlet Interface Filter ... -
引用 五个有用的过滤器 Filter
2011-01-26 15:45 644引用 xyz 的 五个有用的过滤器 Filter 来源:htt ... -
spring:简单的属性参考
2011-01-26 15:43 574在定义文件(XML配置文件)中定义Bean时,可以直接指定一个 ... -
spring:Inversion of Control具体实现【资料搜集】
2011-01-26 15:42 632IoC(Inversion of Control)控制反转的具 ... -
学习Spring前必须了解的几点【资料搜集】
2011-01-26 15:42 891轻量级(Lightweight) 轻量级的形容是相对于 ... -
struts2配置文件介绍
2011-01-26 15:40 666一、Struts2配置文件 Struts2相关的配置文件有w ...
相关推荐
STRUTS2:拦截器Interceptor
在`struts.xml`配置文件中,可以使用`<interceptors>`标签定义拦截器栈,然后使用`<interceptor>`标签定义具体的拦截器。例如,以下配置创建了一个包含日志拦截器和权限检查拦截器的拦截器栈: ```xml ...
2. **配置Interceptor**:在struts.xml配置文件中,可以通过`<interceptors>`标签定义拦截器栈,并使用`<interceptor>`子标签声明具体的拦截器。`<action>`标签中的`interceptor-ref`属性用于指定该Action应使用的...
org.apache.struts2.interceptor.debugging, org.apache.struts2.interceptor.validation, org.apache.struts2.servlet.interceptor, org.apache.struts2.util, org.apache.struts2.views, org.apache.struts2....
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
3. **配置方式**:Interceptor的配置通过Struts2的配置文件(通常为struts.xml)完成,包括指定哪些Action使用哪些Interceptor等。 #### 四、Interceptor 应用实例 假设我们需要实现一个登录验证的功能,即用户...
在Struts中,`struts.xml`和`struts.properties`文件是两个核心的配置文件,它们分别负责定义应用的行为和设置全局属性。 **`struts.xml`配置详解** `struts.xml`是Struts 2框架的核心配置文件,用于定义动作映射...
配置拦截器**:在`struts.xml`中添加新的拦截器和拦截器栈。 ```xml <interceptor name="anotherInterceptor" class="com.example.AnotherInterceptor" /> <interceptor-stack name="anotherStack"> ...
配置方面,Interceptor的定义和绑定在Struts2的配置文件`struts.xml`中完成,可以通过多种方式配置,包括单个Interceptor的直接配置、Interceptor栈的定义以及修改默认的Interceptor栈。 ### 深入分析区别 - **...
通过学习《精通Struts 2:Web 2.0开发实战》,开发者不仅可以掌握Struts 2框架的基本用法,还能深入了解其内在机制,从而在实际项目中更高效地运用这一强大的工具。无论是初学者还是有一定经验的开发者,都能从中...
在Struts2中,`struts.xml`是核心配置文件,它定义了应用的行为、动作、结果和其他组件。为了在Eclipse这样的集成开发环境中获得代码提示和自动完成,我们需要引入DTD(文档类型定义)文件,例如`struts-2.3.dtd`。 ...
在 Struts2 项目开发中,需求分析是非常重要的一步。通过对项目的需求分析,可以确定项目的功能需求、性能需求、安全需求等。例如,在个人信息管理系统中,需要分析用户的需求,例如登录与注册、个人基本信息管理、...
- **Struts2.x** 配置文件较少,主要为struts.xml,支持注解配置,减少XML配置的繁琐。 8. **插件与扩展性**: - **Struts1.x** 插件较少,扩展性相对较弱。 - **Struts2.x** 有丰富的插件系统,如Ajax、...
在Struts2配置文件(struts.xml或struts.properties)中,我们要定义Action的映射,指定Action类和结果视图: ```xml <struts> <package name="default" namespace="/" extends="struts-default"> ...
在`org.apache.struts2.interceptor`包下,你可以找到各种预定义的拦截器类。 2. **配置管理(Configuration Manager)**:Struts2通过`org.apache.struts2.config`包中的类来管理配置信息,包括XML配置文件和注解...
2. 配置struts.xml:在`struts.xml`配置文件中,启用文件上传,设置`struts.multipart.saveDir`属性指定临时文件保存位置,并配置相应的action接收文件。 ```xml <constant name="struts.multipart.saveDir" value=...
4. **配置文件**: `struts.xml`是Struts2的主要配置文件,定义了Action、Interceptor、结果类型等。通过这个文件,开发者可以控制Action的映射、拦截器链的设置以及结果的跳转规则。 5. **Plug-in(插件)**: ...