什么是ValueStack

它是一个接口com.opensymphony.xwork2.util.ValueStack。我们使用它是将其做为一个容器,用于携带action数据到页面。在页面上通过ognl表达式获取数据。 
valueStack主要是将action数据携带到页面上,通过ognl获取数据

1.ValueStack有一个实现类叫OgnlValueStack. 
2.每一个action都有一个ValueStack.(一个请求,一个request,一个action,一个valueStack) valueStack生命周期就是request生命周期。 
3.valueStack中存储了当前action对象以及其它常用web对象(request,session,application.parameters) 
4.struts2框架将valueStack以“struts.valueStack”为名存储到request域中。

valueStack结构

 
ValueStack中 存在root属性 (CompoundRoot) 、 context 属性 (OgnlContext )!并且context中含有root 
* CompoundRoot 就是ArrayList 
* OgnlContext 就是 Map

list集合中存储的是action相关信息 
map集合中存储的是相关映射信息,包含 paramters,request,session,application attr等。

我们想要从list中获取数据,可以不使用#号.(它就是ognl的root) 
如果从map中获取数据,需要使用#. (其实在struts2中的map–context其实就是ognlContext)

结论: 
ValueStack它有两部分 List Map 
在struts2中List就是root Map就是ognlContext. 
默认情况下,在struts2中从valueStack获取数据从root中获取。

值栈对象的创建 ,ValueStack 和 ActionContext 是什么关系 ?

valueStack是每一次请求时,都会创建.

ActionContext ctx = ActionContext.getContext();
if (ctx != null) {
stack = ctx.getValueStack();
}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

如何获得值栈对象?

对于valueStack获取有两种方式:

1.通过 request获取

ValueStack vs=(ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

2.通过ActionContext获取.

ValueStack vs=ActionContext.getContext().getValueStack();

向值栈保存数据 (主要针对 root)

主要有两个方法 
push(Object obj)——->底层就是 root.add(0,obj) 将数据存储到栈顶。 
set(String name,Object obj);—–>底层是将数据封装到HashMap中,在将这个HashMap通过push存储。

在jsp中 通过 <s:debug /> 查看值栈的内容

在JSP中获取值栈的数据

root中数据不需要#,而context中数据需要#

1.如果栈顶是一个Map集合,获取时,可以直接通过Map集合的key来获取value.

<s:property  value="username"/>

2.如果栈顶数据不是一个Map,没有key值,可以使用序号来获取。

<s:property value="[0]">  从0的位置向下查找所有。

<s:property value="[0].top"> 只查找0位置上数据。

如何获取OgnlContext中数据: 
request: <s:property value="#request.username"/> 
session: <s:property value="#session.username"/> 
application:<s:property value="#application.username"/> 
attr: <s:property value="#attr.username"/> 
parameters:<s:property value="#parameters.cid[0]"/>

Strus2中关于ValueStack详解的更多相关文章

  1. php中关于引用(&)详解

    php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...

  2. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  3. AngularJS select中ngOptions用法详解

    AngularJS select中ngOptions用法详解   一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...

  4. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  5. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

  6. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  7. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  8. Android中mesure过程详解

    我们在编写layout的xml文件时会碰到layout_width和layout_height两个属性,对于这两个属性我们有三种选择:赋值成具体的数值,match_parent或者wrap_conte ...

  9. Android中Intent组件详解

    Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...

随机推荐

  1. Specified VM install not found: type Standard VM, name JDK1.8

    真正的问题解决方法在这里:在项目中,右键点击ant文件,选择Run As -- External Tools Configuration,在这个页面的顶端就会看到有红叉叉的报错,报错信息就是Speci ...

  2. 如何根据实体动态生成sql语句

    该文章同时解决了,如何向数据库中添加Null值,以及如何处理“参数化查询未提供参数”的错误.解决方案请看第二段折叠的代码. 背景: 在项目开发的过程中,往往需要根据实体的值来修改sql语句,比如说,有 ...

  3. bootspring + mybaits +mysql Date 类型的处理

    mysql 中有date 类型的属性,java实体类中对应的属性是java.sql.Date 类的. 最初的bug是怎么新增,joinDate 值都是null. 千辛万苦学会了用String转Date ...

  4. &quot;转成"

    在java中这样转 StringEscapeUtils.unescapeHtml(soapResponseData); 在js中这样转 str.replace(""",& ...

  5. HDU 5468 Puzzled Elena

    Puzzled Elena Time Limit: 2500ms Memory Limit: 131072KB This problem will be judged on HDU. Original ...

  6. hexo干货系列:(八)hexo文章自动隐藏侧边栏

    前言 使用Jacman主题的时候发现打开具体文章后,侧边栏还是会展示,我想要的效果是自动隐藏侧边栏,并且展示目录.但是当我修改了主题配置文件里面close_aside属性为true的时候,发现侧边栏隐 ...

  7. Linux核心参数Shmmax,shmall,shmni

    Linux 下核心参数调整 kernel.shmmax shmmax是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,shmmax设置应足够大,能在一个共享内存段下容纳下整个的SGA,设置 ...

  8. POJ 3090 坐标系上的视线遮蔽问题

    Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal ...

  9. BZOJ 1221: [HNOI2001] 软件开发【最小费用最大流】

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

  10. 【判连通】HDU 6113 度度熊的01世界

    http://acm.hdu.edu.cn/showproblem.php?pid=6113 [题意] 度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成. 现在给你一个n ...