前段日子对ognl表达式不是很理解,看了几本书上关于ognl表达式的描述后还是感觉很难,前几天学习了struts2中值栈的内容,现在感觉ognl表达式其实很容易。

struts2中利用值栈来存储数据,在struts2中,把数据存在值栈中,然后在jsp页面用ognl表达式取出。

在struts2中的action有三种方法获取值栈

ValueStack valueStack=ActionContext.getContext().getValueStack();
ValueStack valueStack=(ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
ValueStack valueStack=ServletActionContext.getValueStack(ServletActionContext.getRequest());

可以看到我们可以利用request来获取值栈,而request的生命周期为一次请求,所以值栈的生命周期也为一次请求。

ValueStack 是一个接口,它的实现类是ognlvalueStack。

在valueStack中有两个数据结构,一个名字为context,另一个为root。

context的类型是OgnlContext,OnglContext实现了Map接口,所以context本质上是一个Map。

valueStack中的另一个数据结构root,它的类型是CompoundRoot,CompoundRoot继承了ArrayList类,所以它本质上是一个ArrayList,我们称它为对象栈。

map栈中有一个名称为_values的对象,它是一个HashMap,在这里存放了request,response,session,application等servlet容器的内容,我们称它为map栈。

map栈中还有一个名称为_root的对象,它和我们上面说的valueStack中的另一个数据结构root相同,都是对象栈,为什么valueStack中会有两个对象栈呢,这是因为struts2继承了以前一些框架的内容导致的。

对象栈中保存了两个对象,一个是ValueStackAction,它代表的是当前请求的Action,

另一个是DefaultTextProvider,它是用于struts2国际化的。

我手动用一个粗糙的涂鸦图解下:

所以在jsp页面中,如果要输出的内容在对象栈中,直接指定属性名字,如果在map栈中,要用#来指定

例如

String name="aaa";
String Bname="bbb";
ActionContext.getContext().getValueStack().push(name);  //把字符串放入对象栈中
ActionContext.getContext().put("Bname", Bname);    //把字符串放入map栈中

 在jsp页面中取出的对应的值:

<s:property value="name"/>
<s:property value="#Bname"/>

有错误请指出

转载于:https://www.cnblogs.com/ChanSS/p/5515040.html

struts2值栈分析相关推荐

  1. Struts2值栈详解

    Struts2值栈详解 基本介绍 ValueStack是Struts2的一个接口,字面意义为值栈,OgnlValueStack是 ValueStack的实现类,客 户端发起一个请求,struts2架构 ...

  2. struts2值栈内部数据结构详解

    值栈是struts2内部一片很重要的区域,我在初学的时候,发现对于值栈这个数据结构的理解不是很深刻.例如OGNLContext是什么,ActionContext和值栈有什么关系.为什么ActionCo ...

  3. (十)Struts2 值栈/OGNL

    值栈是一组对象,按照提供的顺序存储以下这些对象: 序号 对象和说明 1 Temporary对象 实际中存在各种在页面执行期间创建的temporary对象.例如,JSP标签循环集合的当前迭代值. 2 M ...

  4. struts2值栈、struts2标签、ONGL表达式、EL表达式、JSTL表达式、jsp标签

    1.struts2值栈: 参考:https://blog.csdn.net/superit401/article/details/83994149 (1) ValueStack是Struts2的一个接 ...

  5. java struts2值栈ognl_Struts2 (三) — OGNL与值栈

    一.OGNL表达式 1.概述 1.1什么是OGNL ​ OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单 ...

  6. java struts2值栈ognl_Struts2的值栈和OGNL牛逼啊

    Struts2的值栈和OGNL牛逼啊 一 值栈简介: 值栈是对应每个请求对象的一套内存数据的封装,Struts2会给每个请求创建一个新的值栈,值栈能够线程安全的为每个请求提供公共的数据存取服务. 二 ...

  7. struts2值栈,OGNL表达式,interceptor

    struts2获取servlet api 第一种获取方式 获得原生request HttpServletRequest request = ServletActionContext.getReques ...

  8. Struts2数据传输的背后机制:ValueStack(值栈)

    1.     数据传输背后机制:ValueStack(值栈) 在这一切的背后,是因为有了ValueStack(值栈)! ValueStack基础:OGNL 要了解ValueStack,必须先理解OGN ...

  9. Struts2框架--学习笔记(下):OGNL表达式、值栈操作、拦截器、struts2标签、文件上传

    一.OGNL概述:OGNL是一种表达式 (1)在struts2中操作值栈数据. (2)一般把ognl在struts2中操作,和struts2标签一起使用操作值栈. (3)ognl不是strut2的一部 ...

最新文章

  1. vant组件实现上传图片裁剪_如何用 120 行代码,实现交互完整的拖拽上传组件?...
  2. 干货|10 张 GIF 动图让你弄懂基础算法必备概念
  3. 如何编写与非贪婪匹配的正则表达式? [重复]
  4. 页面加载进度条改进版
  5. mysql受影响的行: 0_mysql执行update语句受影响行数是0
  6. ci持续集成工程师前景_不要忽视持续集成(CI)/持续交付(CD)的13个优势
  7. 进程间通信(6) 邮槽
  8. springboot jar服务器运行后无法请求_Spring boot、微服务、OAuth、OpenID的爱恨情仇!...
  9. 《梦断代码》阅读笔记Ⅱ
  10. I can accept failure but I can't accept not trying.-Michael Jordan 我可以接受失败,但绝对不能接受自己都未曾奋斗过。-迈克.乔丹...
  11. SAP 电商云 Spartacus UI 修改 Delivery Mode 触发的三个 HTTP 请求
  12. Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(七)...
  13. HDU 4686 Arc of Dream(递归矩阵加速)
  14. linux上dig命令,Linux中dig命令起什么作用呢?
  15. 创邻科技荣登机器之心Pro·AI 趋势先锋 Insight 榜单
  16. java.lang.NoSuchMethodError: com.xxx.xxx.xxx.po.xxxPo.setXXX(D)V
  17. 一杯凉茶 mysql_那一杯凉茶
  18. 简单明了的java反射机制
  19. UNIX 设计哲学:Do one thing and do it well
  20. 华中科技大学计算机学院培养计划,华中科技大学计算机专业培养计划

热门文章

  1. Mongo 常用的server命令
  2. ListView vs FlatList vs RecyclerListView性能对比
  3. jQuery学习(十二)—jQuery中对象的查找方法总结
  4. php arff文件,python实现txt文件格式转换为arff格式
  5. 为何我的苹果手机,每次打开软件都提示要登录ID帐号,而且软件打不开
  6. 酒局中同事说“不把这杯酒喝了就是不给我面子”,我该怎么办?
  7. 大家有哪些被骗的很惨的经历?
  8. 26岁宝妈去汤臣倍健面试兼职工作
  9. 人是不是不应该善良?
  10. 马化腾一直都在闷声发财,马云却到处开课当导师