Struts2配置精要之defaultStack与paramsPrepareParamsStack
2015-11-25 00:00
495 查看
在Struts2.3.4的struts-default.xml文件中配置了很多拦截器栈interceptor-stack:
1.basicStack
2.validationWorkflowStack
3.fileUploadStack
4.modelDrivenStack
5.chainStack
6.i18nStack
7.paramsPrepareParamsStack
8.defaultStack
9.completeStack(这个跟defaultStack一模一样)
10.executeAndWaitStack
其中defaultStack与paramsPrepareParamsStack包含的interceptor最多,功能也最多,那么两者的区别是什么呢?
下面看看具体的顺序:
顾名思义,这里的paramsPrepareParamsStack调用interceptor顺序是先params然后prepare最后再params,而defaultStack是直接prepare然后params(参考上一篇博文贴出的代码中的AbstractBaseAction),如果是defaultStack那么在prepareLoad()调用之前id是取不到页面传过来的值的,那么如果我加载一个人员信息页面的话,返回的页面字段都会是空值,如果用paramsPrepareParamsStack拦截器那么在prepareLoad()调用之前id就会被赋值之后执行空的load()方法返回视图页面就会取到值栈中的属性值。
当使用struts2标签遇到这种错误的时候,你也应该考虑拦截器顺序的问题了:
出现这个错误的原因可能如下:
1 刚进入该界面的时候发生错误,原因是 list="roles"中的这个集合是空的,导致错误
解决办法很简单,不能让list为空
2 刚进入该界面的时候list是有数据的,当点击提交等按钮的时候,数据被提交到后台,这时候在执行指定方法之前会调用拦截器,如果配置了验证框架或者在action中写了validate方法,校验没有通过,未走action,直接返回了input,又指定回了当前界面。
此时的checkboxlist中的list就没有初始化,值为空,一开始没有出错是因为执行了action里面对应的方法,而这里是拦截器validation拦截出错后直接跳转,没有执行action中应该执行的方法,导致了如上错误(这个错误提示的不太友好,让人认为是类转换错误)
解决办法是把初始化list的工作放到prepare拦截器中,因为prepare是在validate拦截器之前执行,所有默认的拦截器栈都是这样的顺序,即实现prepareble接口:
但是不推荐上面这种方法,最好是用get方法取值,页面加载的时候才取值。
1.basicStack
2.validationWorkflowStack
3.fileUploadStack
4.modelDrivenStack
5.chainStack
6.i18nStack
7.paramsPrepareParamsStack
8.defaultStack
9.completeStack(这个跟defaultStack一模一样)
10.executeAndWaitStack
其中defaultStack与paramsPrepareParamsStack包含的interceptor最多,功能也最多,那么两者的区别是什么呢?
下面看看具体的顺序:
<interceptor-stack name="paramsPrepareParamsStack"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="i18n"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="multiselect"/> <interceptor-ref name="params"> <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param> </interceptor-ref> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <interceptor-ref name="chain"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"> <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> </interceptor-stack>
顾名思义,这里的paramsPrepareParamsStack调用interceptor顺序是先params然后prepare最后再params,而defaultStack是直接prepare然后params(参考上一篇博文贴出的代码中的AbstractBaseAction),如果是defaultStack那么在prepareLoad()调用之前id是取不到页面传过来的值的,那么如果我加载一个人员信息页面的话,返回的页面字段都会是空值,如果用paramsPrepareParamsStack拦截器那么在prepareLoad()调用之前id就会被赋值之后执行空的load()方法返回视图页面就会取到值栈中的属性值。
public void prepareLoad() throws Exception { if (getId() != null) { entity = getEntityById(getId()); } } public String load() throws Exception{ return SUCCESS; }
当使用struts2标签遇到这种错误的时候,你也应该考虑拦截器顺序的问题了:
<s:checkboxlist list="roles" listKey="id" listValue="name" name="selectRoleId"/>
org.apache.jasper.JasperException: tag 'checkboxlist', field 'list', name 'selectRoleId': The requested list key 'roles' could not be resolved as a collection/array/map/enumeration/iterator type.
出现这个错误的原因可能如下:
1 刚进入该界面的时候发生错误,原因是 list="roles"中的这个集合是空的,导致错误
解决办法很简单,不能让list为空
2 刚进入该界面的时候list是有数据的,当点击提交等按钮的时候,数据被提交到后台,这时候在执行指定方法之前会调用拦截器,如果配置了验证框架或者在action中写了validate方法,校验没有通过,未走action,直接返回了input,又指定回了当前界面。
此时的checkboxlist中的list就没有初始化,值为空,一开始没有出错是因为执行了action里面对应的方法,而这里是拦截器validation拦截出错后直接跳转,没有执行action中应该执行的方法,导致了如上错误(这个错误提示的不太友好,让人认为是类转换错误)
解决办法是把初始化list的工作放到prepare拦截器中,因为prepare是在validate拦截器之前执行,所有默认的拦截器栈都是这样的顺序,即实现prepareble接口:
public class RoleAction extends ActionSupport implements Preparable{ @Override public void prepare() throws Exception { //初始化list } }
但是不推荐上面这种方法,最好是用get方法取值,页面加载的时候才取值。
public class RoleAction extends ActionSupport implements Preparable{ public List getRoles(){ .... return list; } }
相关文章推荐
- struts2 jquery 打造无限层次的树
- struts2入门Demo示例
- 通过Ajax两种方式讲解Struts2接收数组表单的方法
- ajax交互Struts2的action(客户端/服务器端)
- struts2 spring整合fieldError问题
- Struts2的s:radio标签使用及用jquery添加change事件
- struts2 中文乱码的解决办法分享
- Struts2访问servlet分享
- struts2单个文件上传的两种实现方式
- struts2+jsp实现文件上传的方法
- struts2+jquery实现ajax登陆实例详解
- struts2中一个表单中提交多个请求的例子(多个提交按钮)
- JQuery+Ajax+Struts2+Hibernate框架整合实现完整的登录注册
- Java(基于Struts2) 分页实现代码
- 从搭建Struts2 开发环境说起
- JAVA+Struts2获取服务器地址的方法
- 使用maven+eclipse搭建struts2开发环境
- 关于国际化、OGNL表达式语言
- 在Struts2中如何将父类属性序列化为JSON格式的解决方法
- 在Struts2中的结果集类型