http://my.oschina.net/mlongbo/blog/88250

Value Stack的作用:

1.       可以作为一个数据中转站

2.       用于在前台-后台之间传递数据,最典型的做法就是struts2标签也ognl表达式的结合。我用得最多的就是数据回显。

Value Stack的生命周期:

在struts-default.xml文件中决定了在web容器启动时将会创建OgnlValueStackFactory对象,该对象实现了ValueStackFactory接口,负责ValueStack的创建工作。

ValueStack的生命周期是随着request的创建而创建,随request的销毁而销毁。具体可见源代码:

在PrepareOperations类的createActionContext中有

至于清理工作,struts统一放在了PrepareOperations类的cleanupRequest方法中。

Value Stack结构:

主要看OgnlValueStack类,此类实现了ValueStack接口。

在OgnlValueStack中有两个至关重要的东西,

,简称“对象栈”和“Map栈”。

CompoundRoot:

CompoundRoot继承了ArrayList类,即是一个List集合,详见源码CompoundRoot类。

Context:而context实际上是一个hashMap,

其中_values就是平时使用的map栈,而_root只是对对象栈的引用。

使用Value Stack:

常用方法解析:

1.       push方法:

,再查看root的push方法

,顿时明白什么叫将对象压入栈顶了。

2.       set(String key,Object o)方法:

再看

也就是说第一次使用该方法时,struts会创建一个新的map。

3.       pop方法:

,移除栈顶对象,查看root的pop方法

4.       peek方法

获取栈顶对象,做法与pop方法相同,只不过是get数据。

所以即可总结出使用方法:

1.       将数据放入值栈

将对象放入栈顶:

a)   ActionContext.getContext().getValueStack().push("aa);

b)   ActionContext.getContext().getValueStack().getRoot().add(0,"bb");

将数据放入map栈

ActionContext.getContext().getValueStack().set(“a”,”a”);

2.       从值栈中获取数据

a)         获取栈顶数据

i.              ActionContext.getContext().getValueStack().peek();

ii.              ActionContext.getContext().getValueStack().getRoot().get(0);

一般情况下,将对象放入栈顶之前先移除栈顶对象,这样可以节省内存空间。

重要:

1.       Interator标签当前迭代的对象在栈顶。

2.       Iterator标签的value可以不写,默认是迭代栈顶元素。

Struts2-Value Stack浅析的更多相关文章

  1. Struts2源码浅析-ConfigurationProvider

    ConfigurationProvider接口 主要完成struts配置文件 加载 注册过程 ConfigurationProvider接口定义 public interface Configurat ...

  2. Struts2的Stack Context和ValueStack

    1.提到Struts2的传值功能时,经常会见到Stack Context和ValueStack等概念,那么它们到底是什么,有什么作用呢. ValueStack(值栈):Struts2将OGNL上下文设 ...

  3. Struts2拦截器浅析

    一.拦截器简介: Struts2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能. 拦截器方法在Action执行之前或者之后执行. 拦截器栈: 从结构上看,拦截器栈相当于多个拦截器的组合. 在 ...

  4. Struts2的OGNL标签详解

    一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...

  5. 一站式学习Wireshark(转载)

    一站式学习Wireshark(一):Wireshark基本用法 2014/06/10 · IT技术 · 4 评论 · WireShark 分享到: 115 与<YII框架>不得不说的故事— ...

  6. Struts2.3.15.1源码浅析

    Struts2 两大运行主线: 1.初始化主线:初始化主线主要是为Struts2创建运行环境(此处的环境与Struts2身处的Web环境是有区别的),初始化入口StrutsPrepareAndExec ...

  7. 浅析Struts1和Struts2的Action线程安全问题 转

    浅析Struts1和Struts2的Action线程安全问题  转 http://blog.csdn.net/virgoboy2004/article/details/5876133 [问题描述]最近 ...

  8. 浅析=======Struts2之==========valueStack

    今天刚学习了struts2的valueStack,在这里把自己学到的做个分享,说道valueStack就不得不提OGNL表达式=== struts2工作流程 1.OGNL(Object Graph N ...

  9. struts2.1.6教程四_2、ActionContext 、ValueStack 、Stack Context

    ActionContext 一次Action调用都会创建一个ActionContext 调用:ActionContext context = ActionContext.getContext() Va ...

随机推荐

  1. autoRelease

    cocos2dx采用的是引用计数的方式来管理对象的持有和释放. 所谓引用计数就是说,每个对象都会有一个属性用来记录当前被几个地方引用了.在释放内存的时候会根据这个引用计数来确定是否要用delete操作 ...

  2. Laravel之加密解密/日志/异常处理及自定义错误

    一.加密解密 1.加密Crypt::encrypt($request->secret) 2.解密try { $decrypted = Crypt::decrypt($encryptedValue ...

  3. springboot 有用网址收集

    http://www.ityouknow.com/spring-boot.html springboot多数据源配置: https://blog.csdn.net/neosmith/article/d ...

  4. awk、sed、cut、grep

    二.sed [可以理解为 行在线编辑工具] 作用:sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命 ...

  5. 【经典数据结构】B树与B+树(转)

    本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树 ...

  6. UnrealEngine4 尝鲜

    把官方事例的demo扩展成横版过关视角

  7. 如果你报createSQLQuery is not valid without active transaction,请看这里

    原文:https://blog.csdn.net/yinjian520/article/details/8666695 很多时候我们使用hibernate的session时,都是让session在某一 ...

  8. 1 android 人脸识别

    1 https://www.google.com.hk/search?newwindow=1&safe=strict&q=android+%E5%9B%BE%E7%89%87%E4%B ...

  9. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  10. 用HTML5canvas绘制一个圆环形的进度表示

    先看一下画出来的效果,如下图,这样一个圆环形的进度.  我这里使用HTML5的Canvas来要制作这样一个圆环形的进度, 首先是HTML页面,HTML5的文档标识是: 这个文档标识要比HTML4的简单 ...