`
一日一博
  • 浏览: 229576 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2配置精要之defaultStack与paramsPrepareParamsStack

阅读更多
在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;
    }
}
分享到:
评论

相关推荐

    struts2配置文件

    在配置文件中,我们可以定义Action类、对应的URL路径、结果视图以及与之关联的拦截器。例如: ```xml &lt;result name="success"&gt;/success.jsp ``` 这段配置表示当用户请求`saveUser`时,将调用`...

    SSH笔记_Struts2配置

    总结,Struts2配置涉及多个方面,包括核心库的引入、配置文件的编写、Action、Result、Interceptor的定义以及与Spring的整合等。通过合理配置,可以构建出高效、灵活的Web应用。在实际项目中,应根据需求调整和优化...

    Struts2 配置登陆拦截器

    本篇文章将详细介绍如何配置Struts2的登录拦截器,以及其背后的原理和实践应用。 首先,让我们理解一下拦截器的概念。在Struts2中,拦截器是基于Java的动态代理机制实现的,它们按照预定义的顺序对Action调用进行...

    struts2的配置信息

    在这个“struts2的配置信息”主题中,我们将深入探讨Struts2的核心配置及其lib资源。 首先,让我们关注`lib`目录。这个目录包含了Struts2运行所需的库文件,这些文件是JAR(Java Archive)格式,它们提供了框架的...

    struts2包及配置

    总的来说,Struts2作为Java Web开发的主流框架之一,不仅提供了丰富的功能,而且具有良好的可扩展性和灵活性。开发者可以根据实际需求选择合适的配置方式,利用拦截器实现业务逻辑的解耦,同时关注框架的安全性,...

    struts2之配置实用案例struts001

    这个"struts2之配置实用案例struts001"很可能是针对初学者或者开发者提供的一份实践教程,旨在帮助他们理解和掌握Struts2的基本配置和用法。 在Struts2框架中,配置是至关重要的部分,它决定了应用程序的行为和流程...

    收集整理的所有 Struts2 配置文件

    9. **国际化与主题**:Struts2支持多语言环境,可以通过配置文件定义资源文件以实现国际化。同时,可以配置主题来改变应用的外观。 通过深入理解和灵活运用这些配置,开发者可以构建出高效、可维护的Struts2应用...

    struts2配置文件讲解

    本文将深入讲解Struts2的配置文件及其重要性。 首先,我们要理解的是,Struts2的核心配置文件是`struts.xml`。这个文件定义了应用的全局行为,包括Action类的映射、结果页面的指定、拦截器的配置等。`struts.xml`...

    struts2 配置文件的问题

    在处理“struts2配置文件的问题”时,我们需要深入理解Struts2的配置机制,这包括核心配置文件`struts.xml`以及相关的Action、结果类型、拦截器等配置元素。 首先,`struts.xml`是Struts2框架的核心配置文件,它...

    struts2零配置

    5. **简化拦截器配置**:Struts2允许在Action类或方法上使用注解来指定需要的拦截器,比如`@InterceptorRef("defaultStack")`,这使得拦截器的配置也变得更加简单。 6. **约定优于配置**:这是Struts2零配置的核心...

    struts2配置

    ### Struts2配置详解 #### 一、Struts2简介 Struts2是Apache基金会下的一个开源项目,它是一款基于MVC(Model-View-Controller)设计模式的Web应用框架,用于简化Java Web应用程序的开发过程。Struts2提供了一种...

    struts2配置文件改变DEMO

    这个"struts2配置文件改变DEMO"是用于展示如何修改Struts2的配置文件来改变应用的运行方式。 首先,我们要了解Struts2的核心配置文件——`struts.xml`。这是一个XML文件,通常位于`src/main/resources`或`WEB-INF/...

    struts2.1.6零配置DEMO

    在这个"struts2.1.6零配置DEMO"中,我们将深入探讨如何在不使用XML配置文件的情况下搭建一个简单的Struts2应用。 首先,Struts2的核心是Action类,它是处理用户请求的中心。在传统的Struts2应用中,我们通常会在...

    struts2讲义 struts2讲义struts2讲义struts2讲义struts2讲义

    - 在web.xml中配置过滤器(Filter),通常使用`FilterDispatcher`作为入口点,它是Struts2的核心组件之一。 - 这个过滤器会捕获所有进入Web应用的HTTP请求,并将它们传递给Struts2框架处理。 - 配置过程中需要注意...

    SSH框架整合中struts2框架所需要的配置文件

    SSH框架是Java Web开发中的...综上所述,`struts.xml`在SSH框架整合中的作用至关重要,它是实现业务逻辑与视图解耦、控制流程的关键配置文件。正确理解和配置`struts.xml`,能有效地提升SSH框架的使用效率和项目质量。

    struts2 的配置代码

    3. 包继承与命名空间:Struts2支持包的继承,可以定义全局的配置,如拦截器栈。命名空间可以组织动作,例如: ```xml &lt;package name="basePackage" namespace="/" extends="struts-default"&gt; &lt;!-- 共享配置 --&gt; ...

    Struts2的配置

    本文将深入探讨Struts2的配置,包括核心配置、拦截器、结果类型和动作配置。 1. **核心配置**:Struts2的核心配置通常在`struts.xml`文件中进行,这是框架的入口点。这个文件定义了Action、包、拦截器和结果等元素...

Global site tag (gtag.js) - Google Analytics