什么是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]"/>

转载于:https://www.cnblogs.com/xtdxs/p/6527380.html

Strus2中关于ValueStack详解相关推荐

  1. ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route

    前几篇文章我们从dapm的数据结构入手,了解了代表音频控件的widget,代表连接路径的route以及用于连接两个widget的path.之前都是一些概念的讲解以及对数据结构中各个字段的说明,从本章开 ...

  2. Asp.net中GridView使用详解(引)【转】

    Asp.net中GridView使用详解(引) GridView无代码分页排序 GridView选中,编辑,取消,删除 GridView正反双向排序 GridView和下拉菜单DropDownList ...

  3. Linux中iptraf命令详解(IP局域网监控工具)

    2019独角兽企业重金招聘Python工程师标准>>> Linux中iptraf命令详解(IP局域网监控工具) 发布时间:2017-12-27 20:46:03   作者:佚名    ...

  4. ArcGIS Engine中的Symbols详解

    转自原文 ArcGIS Engine中的Symbols详解 本文由本人翻译ESRI官方帮助文档.尊重劳动成果,转载请注明来源. Symbols ArcObjects用了三种类型的Symbol(符号样式 ...

  5. js路由在php上面使用,React中路由使用详解

    这次给大家带来React中路由使用详解,React中路由使用的注意事项有哪些,下面就是实战案例,一起来看一下. 路由 通过 URL 映射到对应的功能实现,React 的路由使用要先引入 react-r ...

  6. Linux中etc目录详解

    Linux中etc目录详解 /etc目录 包含很多文件.许多网络配置文件也在/etc 中. /etc/rc   or/etc/rc.d   or/etc/rc*.d   启动.或改变运行级时运行的sc ...

  7. java 自定义正则表达式_java中正则表达式实例详解

    Java中正则表达式运用实例(参看java中正则表达式运用详解): 测试代码 package test; /** * 在String的matches()方法,split()方法中使用正则表达式. * ...

  8. numpy中reshape方法详解

    numpy中reshape方法详解_zhanggonglalala的博客-CSDN博客_reshape

  9. JavaScript中getBoundingClientRect()方法详解

    JavaScript中getBoundingClientRect()方法详解 getBoundingClientRect() 这个方法返回一个矩形对象,包含四个属性:left.top.right和bo ...

最新文章

  1. php图片发送另一台,phpcurl发送图片处理
  2. 编程之美-阶乘方法整理
  3. 【168天】黑马程序员27天视频学习笔记【Day07】
  4. Go中数字转换字符串的正确姿势
  5. [C++] C++标准中定义的实体(entity)/ 声明 / 定义
  6. expect脚本同步文件,expect脚本指定host和要同步的文件,构建文件分发系统,批量远程执行命令...
  7. maven插件开发(二)
  8. 在php中isset什么意思,php – isset()和__isset()之间有什么区别?
  9. Total Commander工具栏图标 备份
  10. 2 多贝西小波_【原创】土超:安卡拉高古VS贝西克塔斯
  11. 【直观图解】模型选择之-N折交叉验证法(v-fold cross-validation)
  12. 最优化理论与凸优化的用处
  13. 计算机系大一开学需要带什么,大一新生上学要不要带电脑?辅导员给出建议,家长可以参考...
  14. 软件默认安装在C盘解决方案 eg:google浏览器、XMind脑图工具等
  15. 计算机软件ghb,GHB 文件扩展名: 它是什么以及如何打开它?
  16. 艾奇KTV电子相册制作软件 4.7 破解安装版
  17. 探究opencv中的moments函数和HuMoments函数
  18. 小蛋白泛素(Ub)共价附着降解靶向嵌合体-Ibrutinib/HS-27/Ibrutinib-biotin
  19. 食物相克小知识http://www.best4c.com/loginForLink.do?domain=www.csdn.net
  20. 深入剖析斐波拉契数列

热门文章

  1. java实现ListObject转List实体类,java实现Object转对象,java实现Object转实体类
  2. java人体识别_用华为HMS ML kit人体骨骼识别技术,Android快速实现人体姿势动作抓拍...
  3. Linux简单命令收录(who,echo,date)【上】
  4. C++:34---union:联合/共用体,一种节省空间的类
  5. 多进程鱼多线程的权衡选择
  6. 《剑指Offer》36:二叉搜索树与双向链表
  7. java 场景处理,将黄瓜场景示例作为一个场景处理
  8. anaconda中怎么sh_【好工具】 深度学习炼丹,你怎么能少了这款工具!JupyterLab 远程访问指南...
  9. 英语口语-文章朗读Week10 Thursday
  10. 完成一个H.265/HEVC码流分析工具