一、值栈是什么
简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心。
Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action、Result、Interceptor等Struts2的其他部分使用,这样一来,数据被集中管理起来而不会凌乱,大大方便了程序编写。
Struts2中关于值栈的另外一个很激动人心的特性就是:大多数情况下,你根本无需关心值栈,你不用管它在哪里,不用管它里面有什么,你只需要去获取自己需要的数据就可以了。也就是说,你可以隐式的使用值栈。
当然,如果编写自定义的Result或拦截器等较复杂功能的时候,还是需要显示访问值栈的,因此,还是需要你掌握值栈的知识。
二、值栈能干什么
简单的说,值栈能够线程安全的为每个请求提供公共的数据存取服务。
当有请求到达的时候,Struts2会为每个请求创建一个新的值栈,也就是说,值栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据。
正是因为值栈和请求的对应关系,因而值栈能保证线程安全的为每个请求提供公共的数据存取服务。
三、值栈有什么
事实上,到现在为止,我们一直在讲“值栈”,这种说法其实是不够准确的。为什么呢?因为在Struts2中,值栈又有广义和狭义之分:
1:狭义值栈
通常指的是实现com.opensymphony.xwork2.util.ValueStack接口的对象,目前就是com.opensymphony.xwork2.ognl.OgnlValueStack对象。
狭义值栈主要用来存取动态EL(表达式语言)运算需要的值和结果,当然OgnlValueStack对象主要是用来支持OGNL(对象图导航语言)运算的。
狭义值栈里面存放着一些OGNL可以存取访问的数据,典型如:
- Action的实例,这样就可以通过OGNL来访问Action实例中的属性的值了
- OGNL表达式运算的值,可以设置到值栈中,可以主动访问值栈对象,强行设置
- OGNL表达式产生的中间变量,比如在后面使用Struts2的标签的时候,使用循环标签,自然会有循环的变量,这些都存放在值栈中
2:广义值栈
通常指的是ActionContext对象,ActionContext是Action运行的上下文,每个ActionContext是一个基本的容器,包含着Action运行需要的数据,比如请求参数、会话等。
ActionContext是线程安全的,每个线程有一个独立的ActionContext,这样你就不用担心值栈中值的线程安全问题了。
ActionContext里面存放有很多的值,典型如:
- Request的parameters:请求中的参数,要注意这里的数据是从请求对象里面拷贝出来的,因此这里数据的变化是不会影响到请求对象里面的参数的值的
- Request的Attribute:请求中的属性,这里其实就是个Map,存放着请求对象的属性数据,这些数据和请求对象的Attribute是连动的
- Session的Attribute:会话中的属性,这里其实就是个Map,存放着会话对象的属性数据,这些数据和会话对象的Attribute是连动的
- Application的Attribute:应用中的属性,这里其实就是个Map,存放着应用对象的属性数据,这些数据和应用对象的Attribute是连动的
- Value stack:也就是狭义值栈,ActionContext以value stack作为被OGNL访问的根,简单点说,OGNL在没有特别指明的情况下,访问的就是value stack里面的数据
- attr:在所有的属性范围中获取值,依次搜索page、request、session和application。
前面已经了解到Xwork与Web是无关的,因此Action不用去依赖于任何Web容器,不用和Servlet 的API去交互,但是Action需要能访问到Web应用的数据,不仅仅是取得请求参数的值,往往也需要在Action里直接获取请求或会话的一些数据,对于这些数据,现在都可以通过ActionContext来获取到。
3:关于广义和狭义
你会看到,在ActionContext里面其实是包含着狭义值栈的,正是因为这个原因,再加上ActionContext还包含其他的数据,因此把ActionContext称为广义值栈。
今后在说值栈的时候,没有特别指明的情况下,多数就是指的广义值栈,反正开发的时候都是说从值栈中获取值。当然,有一种情况除外,就是在页面上使用OGNL的时候,没有特殊标识的情况下,默认是从value statck中取值的。
相关推荐
Struts2 值栈的理解 Struts2 值栈是 Struts2 框架中的一种核心机制,负责存储和管理 Action 中的数据。在 Struts2 中,每个 Action 类都有一个 ValueStack 对象,该对象贯穿整个 Action 的生命周期。在 Struts2 ...
OGNL(Object-Graph Navigation Language)是Struts2中的表达式语言,而值栈则是OGNL工作的重要机制。这两者是Struts2框架的核心组件,使得数据绑定和动态方法调用变得更加便捷。 **OGNL:对象图导航语言** OGNL是...
用一个小小的flash来形象的演示struts2中值栈的操作过程,非常直观!
01 Struts2入门 02 Struts2拦截器 03 Struts2值栈与类型转换 04 Struts2标签 05 Struts2验证和国际化 06 Struts2 CRUD 07 Struts2 研讨
6. **值栈(Value Stack)**:值栈是Struts2中的一个核心组件,它存储了请求中的所有对象。ActionContext提供了对值栈的访问,使得视图能够方便地获取和展示数据。 7. **Freemarker和Velocity模板**:Struts2支持...
`%{}`用来访问Struts2值栈(ValueStack)中的对象,它可以是Action对象或其他存储在栈中的任何对象。例如,如果你的Action对象有一个属性`systemSettingModel`,你可以这样获取其`settingValue`属性的值: ```xml ...
为了调试目的,可以开启Struts2的值栈调试功能,查看栈中的内容,帮助开发者了解当前请求的状态和数据流。 9. **Struts2访问Web元素** Struts2可以通过OGNL(Object-Graph Navigation Language)轻松地访问和操作...
struts2模拟模拟工具,可以实现action访问,我表单属性的自动封装。提供了页面显示和跌带器,利用struts2值栈(valueStack)和对象栈map栈的思想。可以用来了解struts2的执行过程,纯属个人学习
5. **Value Stack**:值栈是Struts2的一个重要概念,它是一个对象容器,存储Action实例和需要传递到视图的数据。视图可以直接通过OGNL(Object-Graph Navigation Language)表达式访问值栈中的对象。 二、OGNL...
4. **值栈(Value Stack)**:Struts2的模型部分主要依赖于值栈,它是`org.apache.struts2.util`包的一部分,用于存储Action的属性和结果,方便视图层直接访问。 5. **结果类型(Result Types)**:`org.apache....
5. **值栈(Value Stack)**:Struts2使用值栈来存储Action实例以及Action属性,方便在视图层(JSP)中直接访问。在JSP页面中,你可以通过OGNL(Object-Graph Navigation Language)表达式来获取值栈中的数据。 6. ...
5. **Value Stack**:Struts 2使用值栈来传递数据,Action中的属性可以直接放入值栈,视图层可以直接访问这些属性。 6. **OGNL(Object-Graph Navigation Language)**:Struts 2默认使用OGNL作为表达式语言,用于...
在本教程中,我们将深入探讨Struts2的基础知识,包括环境配置、OGNL(Object-Graph Navigation Language)以及值栈和域的概念。 首先,让我们开始介绍如何配置Struts2环境。安装Struts2需要以下步骤: 1. **添加...
在这个主题中,我们将深入探讨OGNL(Object-Graph Navigation Language)以及如何通过`<s:property>`标签来访问Struts2中的值栈(Value Stack)。值栈是Struts2中一个核心的概念,它是一个存储用户请求数据和应用...
5. **值栈(Value Stack)**:Struts2使用值栈存储请求中的数据,简化视图层的数据访问。 **JSP技术的基本概念:** 1. **指令元素(Directives)**:如page、include、taglib,它们用于设置全局属性、包含其他页面...
值栈是Struts2中的一种数据管理机制,它存储Action、结果和其他对象,方便在Action之间共享数据。 **5.拦截器(Interceptors)** 拦截器是Struts2的一大特色,它们在Action执行前后进行额外处理,如日志记录、权限...
值栈是Struts2框架中的核心概念之一,它是一个用于临时存储对象的栈结构,这些对象包括Action实例、模型对象、临时对象等。值栈中的对象可以按照以下四种类型划分: 1. 栈顶对象:在程序执行过程中,由容器自动创建...
这个特性主要依赖于Struts2的OGNL(Object-Graph Navigation Language)表达式语言和Struts2的核心拦截器栈。OGNL是一种强大的、直观的语言,用于访问和操作对象及其属性。在Struts2中,它用于从HTTP请求中提取参数并...
在Action类中,可以创建一个getter方法来获取存储在session中的用户名,并通过Struts2的值栈(Value Stack)将其传递给JSP页面。在JSP页面上,我们可以使用OGNL(Object-Graph Navigation Language)表达式来访问并...
4. **Value Stack**: 值栈是Struts2中一个重要的概念,它是一个存储对象的栈结构,用于在Action与视图之间传递数据。ActionContext是访问值栈的上下文对象,可以通过它将数据放入栈中供JSP或其他视图技术使用。 5. ...