什么是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. JavaScript 的类型

    var a ="111"; console.log(a.constructor);//function String() { [native code]} var b= Strin ...

  2. Hibernate分页查询报错

    不知道什么原因,就是这里报错的

  3. iis性能监控

    文章:对于IIS上的应用程序池监控 文章:IIS并发连接数及性能优化

  4. POJ 2288 汉密尔顿回路 DP解决

    题目大意: 有n个岛屿,令Vi为岛屿Ci的权值.一条汉密尔顿路径C1,C2,C3...Cn的值为3部分 第一部分,将路径中的岛的权值相加,第二部分将每条边上的(Ci,Cj),加上所有的Vi*Vj 第三 ...

  5. Java设计模式之(工厂模式)

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  6. linux下mysql登录报错“Access denied for user 'root'@'localhost' (using password: YES”)的处理方法

    最近登录某台服务器的mysql时候总报错: Access[root@log01 ~]# mysql -u root -p Enter password: ERROR 1045 (28000): Acc ...

  7. 【linux】ls与ll区别

    ll是一个事先被定义好的别名(alias).别名就是赋予一条命令或者一列命令的名称.可以将别名作为缩写的同义词.在我的Ubuntu系统上,~/.bashrc文件中有这么一条语句alias ll='ls ...

  8. 理解流方式上传和form表单上传

    流方式上传: $post_input = 'php://input'; $save_path = dirname( __FILE__ ); $postdata = file_get_contents( ...

  9. SHELL脚本运行的几种方法以及区别

    #1 给脚本加上执行权限chmod u+x a.sh, 而后就可以直接用全路径来执行脚本了,比如当前文件夹下用./a.sh,如果如果脚本所在目录在PATH环境变量之中, 则直接用a.sh即可(这和运行 ...

  10. Java课堂测试--实现ATM的基本操作体会

    9月20的周四的Java课堂第一节课上就是有关于实现ATM的考试内容,在实现的过程中我了解到自己本身还是有很多的不足之处,例如在实现工程方面的相似性上面还有些许就的欠缺,再者就是回宿舍拿电源的原因导致 ...