什么是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. python re 正则表达式

    元字符和其含义 . 匹配除换行符以外的任意字符 \ 转义字符,使后一个字符改变原来的意思 \w 匹配字母.数字.下划线:[A-Za-z0-9_] \W 匹配特殊字符:[^A-Za-z0-9_] \s ...

  2. Ubuntu16.04进入无限登录状态的解决办法

    具体来说就是,输入密码之后又到了登录界面,无限循环(也许可能不能输入密码,这种状态我没有测试) 此方案仅适用于安装过NVIDIA显卡驱动的系统并且在登录界面会发现分辨率变了 如果你没有安装过NVIDI ...

  3. LeetCode(81) Search in Rotated Array II

    题目 Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would t ...

  4. OI中的小智慧

    反正不会咕咕的. sort之类没+1的问题不说 双向边n*2的问题不说 变量n+5的问题不说 1.先生成后判断 (见NOIP 2016 pj t2回文日期) 这个思想在这道题体现的不明显,记得洛谷上面 ...

  5. ArrayList练习之存储字符串并遍历

    在myArrayList项目下 新建一个包 在这个包中新建一个类:ArrayListDemo4.java ArrayListDemo4.java import java.util.ArrayList; ...

  6. Couchbase V(管理任务)

    Couchbase V(管理任务) 多读写 在Couchbase2.1中支持硬盘多读些(Multi- Readers and Writers),一般双核4G服务默认3个thread 4核16G内存一个 ...

  7. 五、PL/SQL循环、游标、函数和过程

    --PL/SQL基础知识学习 --一.PL/SQL语句块,基础语法格式 DECLARE --变量声明列表 info varchar(25); --变量声明 stu_unm integer := 15; ...

  8. python协程有多厉害?

    爬一个××网站上的东西,测算了一下协程的速度提升到底有多大,网站链接就不放了... import requests from bs4 import BeautifulSoup as sb import ...

  9. 利用PHP SOAP实现WEB SERVICE[转载]

    php有两个扩展可以实现web service,一个是NuSoap,一个是php 官方的soap扩展,由于soap是官方的,所以我们这里以soap来实现web service.由于默认是没有打开soa ...

  10. JavaScript 将行结构数据转化为树结构数据源(高效转化方案)

    js接收到后台的数据如下 /// 部门信息 var departRows = [{ parentDepartId: 'root', departId: 'DC', departName: '集团' } ...