在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最多,功能也最多,那么两者的区别是什么呢?
下面看看具体的顺序:
<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;
}
}
分享到:
相关推荐
在配置文件中,我们可以定义Action类、对应的URL路径、结果视图以及与之关联的拦截器。例如: ```xml <result name="success">/success.jsp ``` 这段配置表示当用户请求`saveUser`时,将调用`...
总结,Struts2配置涉及多个方面,包括核心库的引入、配置文件的编写、Action、Result、Interceptor的定义以及与Spring的整合等。通过合理配置,可以构建出高效、灵活的Web应用。在实际项目中,应根据需求调整和优化...
本篇文章将详细介绍如何配置Struts2的登录拦截器,以及其背后的原理和实践应用。 首先,让我们理解一下拦截器的概念。在Struts2中,拦截器是基于Java的动态代理机制实现的,它们按照预定义的顺序对Action调用进行...
在这个“struts2的配置信息”主题中,我们将深入探讨Struts2的核心配置及其lib资源。 首先,让我们关注`lib`目录。这个目录包含了Struts2运行所需的库文件,这些文件是JAR(Java Archive)格式,它们提供了框架的...
总的来说,Struts2作为Java Web开发的主流框架之一,不仅提供了丰富的功能,而且具有良好的可扩展性和灵活性。开发者可以根据实际需求选择合适的配置方式,利用拦截器实现业务逻辑的解耦,同时关注框架的安全性,...
这个"struts2之配置实用案例struts001"很可能是针对初学者或者开发者提供的一份实践教程,旨在帮助他们理解和掌握Struts2的基本配置和用法。 在Struts2框架中,配置是至关重要的部分,它决定了应用程序的行为和流程...
9. **国际化与主题**:Struts2支持多语言环境,可以通过配置文件定义资源文件以实现国际化。同时,可以配置主题来改变应用的外观。 通过深入理解和灵活运用这些配置,开发者可以构建出高效、可维护的Struts2应用...
本文将深入讲解Struts2的配置文件及其重要性。 首先,我们要理解的是,Struts2的核心配置文件是`struts.xml`。这个文件定义了应用的全局行为,包括Action类的映射、结果页面的指定、拦截器的配置等。`struts.xml`...
在处理“struts2配置文件的问题”时,我们需要深入理解Struts2的配置机制,这包括核心配置文件`struts.xml`以及相关的Action、结果类型、拦截器等配置元素。 首先,`struts.xml`是Struts2框架的核心配置文件,它...
5. **简化拦截器配置**:Struts2允许在Action类或方法上使用注解来指定需要的拦截器,比如`@InterceptorRef("defaultStack")`,这使得拦截器的配置也变得更加简单。 6. **约定优于配置**:这是Struts2零配置的核心...
### Struts2配置详解 #### 一、Struts2简介 Struts2是Apache基金会下的一个开源项目,它是一款基于MVC(Model-View-Controller)设计模式的Web应用框架,用于简化Java Web应用程序的开发过程。Struts2提供了一种...
这个"struts2配置文件改变DEMO"是用于展示如何修改Struts2的配置文件来改变应用的运行方式。 首先,我们要了解Struts2的核心配置文件——`struts.xml`。这是一个XML文件,通常位于`src/main/resources`或`WEB-INF/...
在这个"struts2.1.6零配置DEMO"中,我们将深入探讨如何在不使用XML配置文件的情况下搭建一个简单的Struts2应用。 首先,Struts2的核心是Action类,它是处理用户请求的中心。在传统的Struts2应用中,我们通常会在...
- 在web.xml中配置过滤器(Filter),通常使用`FilterDispatcher`作为入口点,它是Struts2的核心组件之一。 - 这个过滤器会捕获所有进入Web应用的HTTP请求,并将它们传递给Struts2框架处理。 - 配置过程中需要注意...
SSH框架是Java Web开发中的...综上所述,`struts.xml`在SSH框架整合中的作用至关重要,它是实现业务逻辑与视图解耦、控制流程的关键配置文件。正确理解和配置`struts.xml`,能有效地提升SSH框架的使用效率和项目质量。
3. 包继承与命名空间:Struts2支持包的继承,可以定义全局的配置,如拦截器栈。命名空间可以组织动作,例如: ```xml <package name="basePackage" namespace="/" extends="struts-default"> <!-- 共享配置 --> ...
本文将深入探讨Struts2的配置,包括核心配置、拦截器、结果类型和动作配置。 1. **核心配置**:Struts2的核心配置通常在`struts.xml`文件中进行,这是框架的入口点。这个文件定义了Action、包、拦截器和结果等元素...