众所周知,Strut 2的Action类通过属性可以获得所有相关的值,如请求参数、Action配置参数、向其他Action传递属性值(通过chain结果)等等。要获得这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性,在Struts 2调用Action类的Action方法(默认是execute方法)之前,就会为相应的Action属性赋值。
要完成这个功能,有很大程度上,Struts 2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action实例都有一个ActionContext,ActionContext用一个map来存放各种参数,valuestatck就存放在这个map中。Key为:ValueStack.VALUE_STACK)。当Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。只是所有的属性值都是默认的值,如String类型的属性值为null,int类型的属性值为0等。
在处理完上述工作后,Struts 2就会调用拦截器链中的拦截器,当调用完所有的拦截器后,最后会调用Action类的Action方法,在调用Action方法之前,会将ValueStack对象顶层节点中的属性值赋给Action类中相应的属性。大家要注意,在这里就给我们带来了很大的灵活性。也就是说,在Struts 2调用拦截器的过程中,可以改变ValueStack对象中属性的值,当改变某个属性值后,Action类的相应属性值就会变成在拦截器中最后改变该属性的这个值。
从上面的描述很容易知道,在Struts 2的的Action类可以获得与属性同名的参数值就是通过不同的拦截器来处理的,如获得请求参数的拦截器是params,获得Action的配置参数的拦截器是staticParams等。在这些拦截器内部读取相应的值,并更新ValueStack对象顶层节点的相应属性的值。而ValueStack对象就象一个传送带,将属性值从一个拦截器传到了另一个拦截器(当然,在这其间,属性值可能改变),最后会传到Action对象,并将ValueStack对象中的属性的值终值赋给Action类的相应属性。
也许有的读者会看出来一个问题,如果有多个拦截器都改变同一个属性值,那么在后面引用的拦截器将覆盖之前引用的拦截器改变的属性值。由于在defaultStack拦截器栈中staticParams是在params之前引用的,因此,如果某个请求参数与Action类的配置参数同名的话,请求参数值将覆盖配置参数值。
分享到:
相关推荐
在使用Struts2框架进行Web应用开发时,经常会遇到需要从Value Stack(值栈)中获取数据的场景,尤其是在表单验证中。Struts2的Value Stack是一种可以方便地在Action和JSP页面之间传递数据的机制。本文将详细介绍如何...
ValueStack是Struts2的核心组件之一,它是一个数据存储结构,用于管理Action上下文中的对象。Action中的属性会被放入ValueStack,从而可以直接在JSP中通过OGNL表达式访问。 8. **ValueStack Debug和Contents** ...
ValueStack是Struts2的核心概念之一,它是一个存储Action、拦截器返回值和其他对象的栈。通过OGNL(Object-Graph Navigation Language),可以从ValueStack中获取和修改数据。使用`ValueStack Debug`可以帮助开发者...
ValueStack是Struts2的核心概念,它是一个对象栈,存储Action实例和其他值,方便视图层获取数据。调试ValueStack可以帮助理解数据流和数据绑定过程。 以上就是Struts2学习笔记中的主要内容,通过这些知识点的学习...
深入讲解Struts中的ognl和valueStack
关于ValueStack的描述: 1、 ValueStack其实就是一个放置Java对象的堆栈而已,唯一特别的是可以使用EL来获得值堆栈中对象属性的数据,并可以为值堆栈的对象属性赋值。 2、 EL,全称Express Language,即表达式...
ValueStack是Struts2框架中的核心组件之一,它是ActionContext和ActionInvocation之间的一个数据传递层,负责在Action与视图之间传递和管理数据。ValueStack的作用在于简化模型-视图-控制器(MVC)架构中的数据交互...
- **Struts2**: 引入了ValueStack的概念,这使得开发者可以在视图层直接访问Action中的数据。Struts2还支持多种视图技术,如FreeMarker、Velocity等。 #### 数据绑定 - **Struts1**: 使用Commons-BeanUtils进行...
它定义了请求处理的流程,提供了ActionContext、ValueStack等关键对象。 2. **xwork-core.jar**:XWork是Struts2的基础,它提供了一些基础功能,如类型转换、Ognl表达式支持、拦截器机制等。很多Struts2的功能都是...
页面绑定方面,Struts1依赖JSP标准机制,而Struts2采用ValueStack技术,允许taglib直接访问值栈中的对象,无需在视图和对象之间建立直接绑定,提高了重用性。 在类型转换上,Struts1的ActionForm属性通常是String...
- **Struts2**:采用ValueStack技术,允许taglib直接访问视图,无需显式绑定,增强了重用性。 8. **类型转换**: - **Struts1**:依赖Commons-Beanutils进行类型转换,转换器不可配置且通常是针对String类型。 -...
Struts的核心组件包括配置文件(struts-config.xml或struts2的struts.xml)、Action类、ActionForm(在Struts 1中)或ValueStack(在Struts 2中)、Result(视图结果)以及Interceptor(拦截器)。ActionForm用于在...
Struts是Java Web开发中的一个开源框架,它主要用于构建基于MVC(Model-View-Controller)模式的应用程序。在Struts中,OGNL(Object-Graph Navigation Language)和Value Stack(VS)是两个核心概念,它们对于理解...
此外,Struts2还提供了一个强大的ValueStack机制,用于在Action和视图之间传递数据。 #### 六、配置机制的不同 - **Struts1**: 使用XML配置文件进行配置,这种方式虽然直观但随着项目规模的增长可能会变得难以管理...
- **Struts2**则使用了ValueStack来存储Action对象和视图数据,这种机制允许在不同的页面之间传递数据,从而实现了更加灵活的页面导航。 #### 数据类型转换 - **Struts1**使用ActionForm中的方法来转换表单提交的...
7. **ValueStack**: 用于存储Action的属性和OGNL表达式,便于在视图层和控制器之间传递数据。 8. **OGNL (Object-Graph Navigation Language)**: 是Struts2中的默认表达式语言,用于访问和修改对象属性,以及在视...
在本次培训中,参与者将全面了解栈数据结构的基础知识,以及在Struts2框架中ValueStack的重要角色。以下是详细的知识点讲解: 1. **栈的特点与使用方法** 栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)...
- **Struts2**: 采用“ValueStack”技术,允许标签库访问值而无需显式绑定视图与对象。这种策略使得视图可以重用,即使它们引用的是不同类型的属性。 #### 8. 类型转换的能力 - **Struts1**: Struts1通常将`...