- 浏览: 333100 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
xing0029:
这样配置的话 事物不成功啊 还有什么地方需要注意的么 可以加我 ...
JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器) -
mengqingyu:
liuxiaolu 写道jotm的我的没有成功,楼主能否帮助一 ...
JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器) -
liuxiaolu:
jotm的我的没有成功,楼主能否帮助一下
JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器) -
aptech406328627:
求解救,没弄好QQ:1053942353
Spring邮件发送(可带附件,模板,群发,异步发送等功能) -
ghpaas:
web可视化自定义表单推荐使用GForms开发平台(http: ...
在线表单设计器设计原理
Struts中默认的拦截器栈
打开struts-default.xml文件,在最下面我们可以看到
<default-interceptor-refname="defaultStack"/>
该配置说明Struts默认使用的拦截器栈是defaultStack。我们看一下默认的拦截器栈都有哪些拦截器:
下面,我们就分别对这些拦截器进行分析,看Struts在处理请求的时候,通过拦截器都做了哪些工作。
1:异常处理拦截器(exception)
<interceptorname="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
看该类源码中的intercept:
注意,这里是对invocation.invoke(); 中出现的异常进行捕获的。
2:别名拦截器(aliasInterceptor)
该拦截器主要作用是将一个参数别名成为另一个参数,在不同的action之间相似的参数(但是不同名)扮演着胶水的角色。该拦截器在action链中有很大的作用。
这个拦截器在xwork的jar包里,它的作用是给参数起一个别名,可用于在action链中以不同的名字共享同一个参数,也可用于把http请求参数以不同的名字映射到action里。
拦截器有一个参数:aliasesKey,可通过在struts.xml中定义该拦截器时指定其值,默认值是aliases,表示一个别名的map。
下面以实现在action链中以不同的名字共享同一个参数为例:
param标签的name属性值应该和拦截器参数aliasesKey的值一样,这样拦截器才知道你是否指定了action的别名map。这个map应该象#{原参数名1 : 别名1, 原参数名2 : 别名2}这样的形式,这是一个定义map的OGNL表达式。
该拦截器已经包含在defaultStack中,因此上面没有显示的指定。
相应的,在本例中,test.AliasInterceptorTestFromAction里有一个字段someList:
注 意:在AliasInterceptorTestToAction中不能有一个叫someList的字段,如果有的话,otherList最终的值将是AliasInterceptorTestToAction中的someList,而非AliasInterceptorTestFromAction的值。因为该拦截器的实现是在action的值栈里找到原参数名后设置给别名,如果两个action都有someList,而AliasInterceptorTestToAction位于栈顶,它的someList将被赋给otherList,这并不是我们所期望的结果。
someList也可以来自于http请求参数,因为拦截器如果在action的值栈里没有找到someList,还会在http请求参数里找。
3:配置拦截器(servletConfig)
该拦截器设置基于action接口实现的action属性。比如说,一个action实现{@link ParameterAware} 接口,那么action上下文的参数map将会被设置到action中。该拦截器设计成如果action需要获取基于servlet的参数,则设置所有的属性到action中,包括servlet context,session等。需要实现的接口如下:
<li>{@link ServletContextAware}</li>
<li>{@linkServletRequestAware}</li>
<li>{@linkServletResponseAware}</li>
<li>{@linkParameterAware}</li>
<li>{@linkRequestAware}</li>
<li>{@linkSessionAware}</li>
<li>{@linkApplicationAware}</li>
<li>{@linkPrincipalAware}</li>
这里需要注意的是ServletReqeustAware接口和RequestAware接口的区别。前者是获取httpServletRequest原生对象,后者是获取包含了request则很难过所有attribute属性的map类型的参数。
4:国际化拦截器(i18n)
5:预处理拦截器(prepare)
在action 方法执行前,调用prepare方法。(只对实现了prepareAble接口的aciton有效)。
该拦截器通常用于执行执行action条件判断,判断是否执行action中所有的条件都已经满足。
6:action链拦截器(chain)
能将所有实例的所有属性都拷贝到当前执行的对象的valueStack中。除非该对象实现了Unchainable接口。该连接器同 action返回类型为chain联合使用。
这里其实并不难理解。request请求在服务器端进入另一个action可以理解成为是服务器端跳转。但是,因为struts2本身的设计思想,所有的action都是prototype的也就是对于每一个请求都单独生成一个action。所有,跳转后的action中没有相应的参数,就需要从前一个action获取参数。该chain就是将前一个action中的参数复制到要跳转的action中。
7:debug拦截器(debugging)
8:scopedModelDriven
该拦截器只对实现了ScopedModelDriven 接口的action实例起作用。
从该方法中可以看到,默认的都是对context起作用的。除非设置了scopeKey。
9:modelDriven
类:com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor
该拦截器同上面原理一样,是只对实现了ModelDriven接口的action起作用
10:文件上传拦截器(fileUpload)
类:org.apache.struts2.interceptor.FileUploadInterceptor
拦截器基于MultiPartRequestWapper,只要是在request中包含一个文件,就会被自动调用。他加入了一下几个参数:File , ContentType,FileName。
该拦截器只对request是MultiPartRequestWrapper 类型的才进行处理。注意,如果是文件上传的请求,在过滤器还是dispatcher中就已经对request进行包装了。
11:checkBox处理拦截器(checkbox)
类:org.apache.struts2.interceptor.CheckboxInterceptor
此拦截器是针对checkbox表单控件的。
当提交的表单里有checkbox时,默认情况下,如果没选中,提交的值是null;如果选中,提交的值是"true"。
CheckboxInterceptor的作用是当没选中checkbox时,提交一个指定的值,而不是null。
你需要在页面为每个checkbox指定一个名字为"__checkbox_"+checkbox名的hidden控件,例如,如果表单有一个名为vip的checkbox,就需要一个名为_checkbox_vip的hidden。默认的,这个事情不需要你来做,因为Struts2在checkbox的simple模板中已经为你做了,即下面这条语句:
checkbox.ftl
<input type="hidden" name="_checkbox_${parameters.name?html}" value="${parameters.fieldValue?html}"/>
CheckboxInterceptor实现原理如下:
当提交表单后,CheckboxInterceptor会在请求参数里查找名字以"_checkbox_"开头的参数,如果找到,继续在请求参数里找对应的checkbox参数,如果没找到(表示没有选中该checkbox),就给checkbox参数一个指定的值,默认的,这个值为"false"。可以在struts.xml定义拦截器时改变这个值,如下,将其值改成"no":
<interceptor-ref name="checkbox">
<param name="uncheckedValue">no</param>
</interceptor-ref>
默认情况下,请求每个action都会调用CheckboxInterceptor,因为在Struts2定义的默认拦截器defaultStack中包含了它。
12:多选拦截器(multiselect)
类:org.apache.struts2.interceptor.MultiselectInterceptor
同checkbox一样,如果没有选中,则设置默认的值。
13:静态参数拦截器(staticParams)
类:com.opensymphony.xwork2.interceptor.StaticParametersInterceptor
该拦截器将action中配置的静态参数添加到action中。如果action实现了Parameterizable接口,那么,一个map的静态参数也将会设置到action中。
14:actionMappingParams
类:org.apache.struts2.interceptor.ActionMappingParametersInteceptor
该拦截器设置从action映射,当前请求,所有的参数到值栈中。他的操作就像parametersInterceptor一样,只是参数从ActionMapping中来,而不是从actionContext.getParameters()
15:params
打开struts-default.xml文件,在最下面我们可以看到
<default-interceptor-refname="defaultStack"/>
该配置说明Struts默认使用的拦截器栈是defaultStack。我们看一下默认的拦截器栈都有哪些拦截器:
<interceptor-stackname="defaultStack"> <interceptor-refname="exception"/> <interceptor-refname="alias"/> <interceptor-refname="servletConfig"/> <interceptor-refname="i18n"/> <interceptor-refname="prepare"/> <interceptor-refname="chain"/> <interceptor-refname="debugging"/> <interceptor-refname="scopedModelDriven"/> <interceptor-refname="modelDriven"/> <interceptor-refname="fileUpload"/> <interceptor-refname="checkbox"/> <interceptor-refname="multiselect"/> <interceptor-refname="staticParams"/> <interceptor-refname="actionMappingParams"/> <interceptor-refname="params"> <paramname="excludeParams">dojo\..*,^struts\..*</param> </interceptor-ref> <interceptor-refname="conversionError"/> <interceptor-refname="validation"> <paramname="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-refname="workflow"> <paramname="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> </interceptor-stack>
下面,我们就分别对这些拦截器进行分析,看Struts在处理请求的时候,通过拦截器都做了哪些工作。
1:异常处理拦截器(exception)
<interceptorname="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
看该类源码中的intercept:
try { result = invocation.invoke(); } catch(Exception e) { if(isLogEnabled()) { handleLogging(e); } List<ExceptionMappingConfig> exceptionMappings =invocation.getProxy().getConfig().getExceptionMappings(); String mappedResult = this.findResultFromExceptions(exceptionMappings,e); if (mappedResult!=null) { result = mappedResult; publishException(invocation, new ExceptionHolder(e)); } else { throw e; } }
注意,这里是对invocation.invoke(); 中出现的异常进行捕获的。
2:别名拦截器(aliasInterceptor)
该拦截器主要作用是将一个参数别名成为另一个参数,在不同的action之间相似的参数(但是不同名)扮演着胶水的角色。该拦截器在action链中有很大的作用。
这个拦截器在xwork的jar包里,它的作用是给参数起一个别名,可用于在action链中以不同的名字共享同一个参数,也可用于把http请求参数以不同的名字映射到action里。
拦截器有一个参数:aliasesKey,可通过在struts.xml中定义该拦截器时指定其值,默认值是aliases,表示一个别名的map。
下面以实现在action链中以不同的名字共享同一个参数为例:
struts.xml: <package name="test"namespace="/test"> <action name="aliasTestFrom"class="test.AliasInterceptorTestFromAction"> <result type="chain">aliasTestTo</result> </action> <actionname="aliasTestTo"class="test.AliasInterceptorTestToAction"> <paramname="aliases">#{'someList' :'otherList'}</param> <result>/test/alias_result.jsp</result> </action> </package>
param标签的name属性值应该和拦截器参数aliasesKey的值一样,这样拦截器才知道你是否指定了action的别名map。这个map应该象#{原参数名1 : 别名1, 原参数名2 : 别名2}这样的形式,这是一个定义map的OGNL表达式。
该拦截器已经包含在defaultStack中,因此上面没有显示的指定。
相应的,在本例中,test.AliasInterceptorTestFromAction里有一个字段someList:
AliasInterceptorTestFromAction.java private List someList; public List getSomeList() { return someList; } public void setSomeList(List someList) { this.someList = someList; } test.AliasInterceptorTestToAction里有一个字段otherList: AliasInterceptorTestToAction.java private List otherList; public List getOtherList() { return otherList; } public void setOtherList(List otherList) { this.otherList =otherList; }
注 意:在AliasInterceptorTestToAction中不能有一个叫someList的字段,如果有的话,otherList最终的值将是AliasInterceptorTestToAction中的someList,而非AliasInterceptorTestFromAction的值。因为该拦截器的实现是在action的值栈里找到原参数名后设置给别名,如果两个action都有someList,而AliasInterceptorTestToAction位于栈顶,它的someList将被赋给otherList,这并不是我们所期望的结果。
someList也可以来自于http请求参数,因为拦截器如果在action的值栈里没有找到someList,还会在http请求参数里找。
3:配置拦截器(servletConfig)
该拦截器设置基于action接口实现的action属性。比如说,一个action实现{@link ParameterAware} 接口,那么action上下文的参数map将会被设置到action中。该拦截器设计成如果action需要获取基于servlet的参数,则设置所有的属性到action中,包括servlet context,session等。需要实现的接口如下:
<li>{@link ServletContextAware}</li>
<li>{@linkServletRequestAware}</li>
<li>{@linkServletResponseAware}</li>
<li>{@linkParameterAware}</li>
<li>{@linkRequestAware}</li>
<li>{@linkSessionAware}</li>
<li>{@linkApplicationAware}</li>
<li>{@linkPrincipalAware}</li>
这里需要注意的是ServletReqeustAware接口和RequestAware接口的区别。前者是获取httpServletRequest原生对象,后者是获取包含了request则很难过所有attribute属性的map类型的参数。
4:国际化拦截器(i18n)
5:预处理拦截器(prepare)
在action 方法执行前,调用prepare方法。(只对实现了prepareAble接口的aciton有效)。
该拦截器通常用于执行执行action条件判断,判断是否执行action中所有的条件都已经满足。
6:action链拦截器(chain)
能将所有实例的所有属性都拷贝到当前执行的对象的valueStack中。除非该对象实现了Unchainable接口。该连接器同 action返回类型为chain联合使用。
这里其实并不难理解。request请求在服务器端进入另一个action可以理解成为是服务器端跳转。但是,因为struts2本身的设计思想,所有的action都是prototype的也就是对于每一个请求都单独生成一个action。所有,跳转后的action中没有相应的参数,就需要从前一个action获取参数。该chain就是将前一个action中的参数复制到要跳转的action中。
7:debug拦截器(debugging)
8:scopedModelDriven
该拦截器只对实现了ScopedModelDriven 接口的action实例起作用。
protected ObjectresolveModel(ObjectFactory factory, ActionContext actionContext, StringmodelClassName, String modelScope, String modelName)throwsException { Objectmodel = null; Map<String, Object> scopeMap = actionContext.getContextMap(); if ("session".equals(modelScope)) { scopeMap =actionContext.getSession(); } model = scopeMap.get(modelName); if (model == null) { model = factory.buildBean(modelClassName, null); scopeMap.put(modelName,model); } return model; }
从该方法中可以看到,默认的都是对context起作用的。除非设置了scopeKey。
9:modelDriven
类:com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor
该拦截器同上面原理一样,是只对实现了ModelDriven接口的action起作用
10:文件上传拦截器(fileUpload)
类:org.apache.struts2.interceptor.FileUploadInterceptor
拦截器基于MultiPartRequestWapper,只要是在request中包含一个文件,就会被自动调用。他加入了一下几个参数:File , ContentType,FileName。
该拦截器只对request是MultiPartRequestWrapper 类型的才进行处理。注意,如果是文件上传的请求,在过滤器还是dispatcher中就已经对request进行包装了。
11:checkBox处理拦截器(checkbox)
类:org.apache.struts2.interceptor.CheckboxInterceptor
此拦截器是针对checkbox表单控件的。
当提交的表单里有checkbox时,默认情况下,如果没选中,提交的值是null;如果选中,提交的值是"true"。
CheckboxInterceptor的作用是当没选中checkbox时,提交一个指定的值,而不是null。
你需要在页面为每个checkbox指定一个名字为"__checkbox_"+checkbox名的hidden控件,例如,如果表单有一个名为vip的checkbox,就需要一个名为_checkbox_vip的hidden。默认的,这个事情不需要你来做,因为Struts2在checkbox的simple模板中已经为你做了,即下面这条语句:
checkbox.ftl
<input type="hidden" name="_checkbox_${parameters.name?html}" value="${parameters.fieldValue?html}"/>
CheckboxInterceptor实现原理如下:
当提交表单后,CheckboxInterceptor会在请求参数里查找名字以"_checkbox_"开头的参数,如果找到,继续在请求参数里找对应的checkbox参数,如果没找到(表示没有选中该checkbox),就给checkbox参数一个指定的值,默认的,这个值为"false"。可以在struts.xml定义拦截器时改变这个值,如下,将其值改成"no":
<interceptor-ref name="checkbox">
<param name="uncheckedValue">no</param>
</interceptor-ref>
默认情况下,请求每个action都会调用CheckboxInterceptor,因为在Struts2定义的默认拦截器defaultStack中包含了它。
12:多选拦截器(multiselect)
类:org.apache.struts2.interceptor.MultiselectInterceptor
同checkbox一样,如果没有选中,则设置默认的值。
13:静态参数拦截器(staticParams)
类:com.opensymphony.xwork2.interceptor.StaticParametersInterceptor
该拦截器将action中配置的静态参数添加到action中。如果action实现了Parameterizable接口,那么,一个map的静态参数也将会设置到action中。
14:actionMappingParams
类:org.apache.struts2.interceptor.ActionMappingParametersInteceptor
该拦截器设置从action映射,当前请求,所有的参数到值栈中。他的操作就像parametersInterceptor一样,只是参数从ActionMapping中来,而不是从actionContext.getParameters()
15:params
发表评论
-
基于Mybatis封装的增删改查实现通用自动化sql
2014-12-07 20:59 41801.基于map或javaBean的增删改查可实现不写dao接口 ... -
S2SH读取XML扩展点
2014-07-27 01:39 726由于struts2、hibernate通过默认配置文件不支持通 ... -
导出Word、Excel、PPT通用功能设计思路
2014-03-07 16:25 1845工作中经常 ... -
HttpClient抓取解析网站支持多种验证方式
2014-03-06 10:10 1431工作中遇到了抓取多个项目数据并且有多种验证方式包括Http标准 ... -
Tomcat架构分析及性能调优
2014-02-16 17:59 3223一.Tomcat容器层级结构 分为四个等级,由四个子容器组成 ... -
基于FLEX,MINA消息推送核心代码
2013-10-21 16:15 1727import java.util.List; impor ... -
(转载)拦截器与过滤器的区别
2013-05-10 15:36 1034拦截器与过滤器的区别 : 1.拦截器是基于java的反射机制 ... -
Java并发模式
2013-04-02 12:58 2274在公司做培训时用到,顺便在这里做个总结。 1.生产者消费者模式 ... -
海量数据、高并发优化方案
2013-03-16 18:53 8547一.应用服务器负载均衡 1.链路负载均衡 通过DNS解析域 ... -
Lucene 详解
2013-03-01 11:10 15381.什么是全文检索 对于搜索,按被搜索的资源类 ... -
Spring JDBC批量操作
2013-01-20 02:51 271、使用JdbcTemplate进行批 ... -
集成JBPM3,实现流程流转
2012-11-29 16:48 2197集成JBPM到OA系统,并实现JbpmFacade接口 - ... -
Spring MVC 文件上传
2010-03-23 16:45 1124MultipartHttpServletRequest mul ... -
导出Excel(jxl)
2009-08-05 09:15 526Action代码: import java.io.IOExce ... -
Hibernate笔记(常用技术)
2009-07-21 17:13 2154一.对象关系映射基础 1.hibernate对象属性映射 ...
相关推荐
在Struts2配置文件中,这个拦截器通常位于默认拦截器栈的顶部。当一个请求到达时,`prepare`拦截器会先于其他拦截器执行,为Action创建实例并调用其`prepare()`方法,如果该方法存在。这样可以确保在业务逻辑开始...
上述代码中,`logging`拦截器会在Action执行前后打印日志,`myStack`拦截器栈包含默认拦截器栈和`logging`拦截器,`someAction`会使用这个拦截器栈。 接下来,我们关注描述中提到的注解使用。Struts2在`...
例如,`struts-default.xml`中包含了默认的拦截器栈,如`params`拦截器用于处理请求参数,`exception`拦截器用于处理异常,`validation`拦截器进行数据校验。 在深入源码之前,我们需要了解几个关键类: 1. `...
-- 拦截器栈中其他默认的拦截器 --> <!-- 将你的拦截器添加到栈中 --> <!-- 使用自定义的拦截器栈 --> <result>success.jsp ``` 这里的`WelcomeAction`是你定义的一个控制器,`success.jsp`是对应的...
3. **配置拦截器栈**:在上面的配置中,我们创建了一个名为`authStack`的拦截器栈,它包含了默认的拦截器栈和我们的`auth`拦截器。这意味着每个被`authStack`引用的Action在执行前都会先经过`auth`拦截器。 4. **...
这里,我们创建了一个名为“myStack”的拦截器栈,并在其中添加了默认拦截器栈和我们自定义的`authorization`拦截器。 3. 应用拦截器:接下来,我们需要在Action配置中引用这个拦截器栈。这样,每次请求该Action时...
通过`<package>`标签的`default-interceptor-ref`属性,可以指定默认拦截器栈,或者在具体的Action配置中使用`interceptor-ref`引用特定的拦截器栈。 **5. 拦截器的生命周期** 拦截器的生命周期包括实例化、初始化...
在添加自定义拦截器时,可以将其插入到默认拦截器栈中,也可以创建自定义的拦截器栈。 ### 五、测试与优化 完成上述步骤后,你可以通过访问受保护的URL来测试拦截器的效果。如果用户未登录,系统应重定向到登录页面...
默认情况下,Struts2提供了一系列内置的拦截器,这些拦截器已经配置在`struts-default.xml`文件中,以便开发者可以直接使用或进行自定义组合。 首先,让我们逐一了解这些默认拦截器的功能: 1. **alias**:别名...
- XML配置:在`struts.xml`文件中,使用`<interceptor>`元素定义拦截器,`<interceptor-stack>`元素组合多个拦截器,`<package>`元素下的`interceptors`属性指定拦截器栈。 ```xml <!-- 可以添加其他内置或...
拦截器通过配置文件或者注解与Action关联,形成一个拦截器栈,每个Action的执行都会经过这个栈中的每个拦截器。 JPA(Java Persistence API)是Java平台上的对象关系映射(ORM)标准,用于处理数据库操作。在这个...
2. **默认拦截器栈**:`defaultStack`包含了Struts2内置的一些拦截器,如`params`(处理参数),`i18n`(处理国际化),`exception`(处理异常)等。 3. **应用全局拦截器**:现在,所有Action都会在执行前经过`...
3. **注册拦截器**:将自定义拦截器加入到`struts-default`或`struts-plugin`拦截器栈中,或者创建新的拦截器栈并应用到特定Action。 ### 四、Struts2内置拦截器 Struts2提供了一些内置的拦截器,如: 1. **...
3. **配置拦截器栈**:在`struts-config.xml`中,可以使用`<interceptor-stack>`标签定义拦截器栈,栈中的拦截器会按照定义的顺序执行。 4. **插件使用**:Struts1.2提供了一些预定义的拦截器插件,例如`...
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
通过在`struts.xml`或`struts-plugin.xml`配置文件中定义拦截器栈,可以指定拦截器的执行顺序。 以下是一些常见的Struts2内置拦截器及其用途: 1. `params`:负责从请求参数中填充Action属性。 2. `i18n`:处理国际...
这里的`myStack`定义了一个拦截器栈,将默认拦截器栈与我们的`loginCheck`拦截器组合在一起。`protectedAction`将使用这个拦截器栈,如果用户未登录,`loginCheck`将返回"login",使得用户被重定向到登录页面。 ...
如果在具体的控制器中显式引用了拦截器,那么默认的拦截器栈将失效。 #### 六、拦截器栈的作用 拦截器栈可以包含多个拦截器,这些拦截器按照配置的顺序依次执行。拦截器栈提供了一种灵活的方式来组合不同的拦截器...
20. **StackInterceptor** - 栈拦截器:处理值栈中的对象,例如在Action和结果之间传递数据。 21. **ValidationInterceptor** - 验证拦截器:基于Action的验证规则执行字段验证,如果验证失败,将错误信息放入Value...
`defaultStack`是Struts2提供的默认拦截器栈,包含了如`exception`、`params`、`i18n`等常用拦截器。 了解了拦截器的基本原理后,我们可以通过`Struts2.x 拦截器.avi`这个视频文件深入学习Struts2拦截器的实现细节...