一、值栈(ValueStack)

1.实现类:OGNLValueStack

2.对象栈:CompoundRoot(针对的是类级别的)

(1)继承自 ArrayList —— 先进后出

(2)提供了栈的几个操作:peek() 返回栈顶对象,pop() 弹出栈顶对象,push() 将对象压入栈顶

(3)默认情况下,会将当前 Action 对象压入栈顶。通过这个 Action 对象,可以访问到该 Action 的所有属性以及错误信息。

(4)获取方式

可以通过 ValueStack 对象的 getRoot() 方法来获取到。

(5)页面中获取对象栈中的内容:

结合 struts2 标签和 OGNL,不需要指定根,默认为值栈。唯一需要注意的一点是:会从指定下标开始向下查找第一个 属性,若不指定,则从栈顶开始向下找。

如:<s:property value="[1].userName"/>

3.Map栈(针对的是 action 级别的,方法级别的)(相当于一个容器,存放了所有的东西,所有东西的获取都可以从它里拿)

(1)ActionContext 中的 context 就是 Map栈,和从 ValueStack 中获取的 context 是一个东西。

(2)内容:
原生的 Web 资源,
Web资源对应的 Map 对象(通过 ActionContext 获取 sessionMap 等,其实也是从 Map 栈中获取的)
ValueStack 对象
Action 类运行相关的环境信息

(3)获取方式:
后台:Map<String, Object> context = ActionContext.getContext().getValueStack().getContext();

(4)页面中获取 Map 栈中的数据:

结合 Struts2 标签和 OGNL 来取值,指定 #。

如:<s:property value="#request.requestAttrKey"/>

(5)Map 栈结构如图:

4.ValueStack 对象的获取方式:

(1)通过 ActionContext 对象获得

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

(2)通过读取请求域获取

ValueStack valueStack = (ValueStack) request.get("struts.valueStack");

(3)通过 ServletActionContext 获取

ValueStack valueStack = ServletActionContext.getValueStack(ServletActionContext.getRequest());

5.Struts2会为每一个请求创建一个 ValueStack 对象,保证了线程安全。

对象栈是针对 Action 类或者手动压入栈顶的对象,而 map 栈针对的是一个 action 请求,针对的是方法,在方法中我们可以得到的东西或者可以设置的东西,在map栈中就能够体现。

二、OGNL(对象图导航语言)

1.本身不属于 Struts2 ,是属于 Apache Common 下的一个子项目。ognl-3.0.6.jar,依赖 javassist-3.11.0.GA.jar

2.未指定上下文,从根对象中读取数据:

(1)从 root 对象中读取 rootProperty 属性:

Object value = Ognl.getValue("rootProperty", root);

(2)从 rootList 或是 rootArray 中读取 第一个 root 的 rootProperty 属性:

Object value = Ognl.getValue("[0].rootProperty", rootList);

(3)从 rootMap 中读取属性  rootMapKey01 对应的值:

e1:

Object depart02 = Ognl.getValue("rootMapKey01", rootMap);

e2:

HashMap<String, String> map = new HashMap<>();
map.put("attr.name", "attr.value");
Object value = Ognl.getValue("['attr.name']", map);

3.同时指定了上下文(必须为一个Map对象)和根(为一个 List)

(1)若指定了 #,则表示从 Map 中查找

Object value = Ognl.getValue("#mapKey02.propertyName", map, rootList);

(2)若没有指定 #,则表示从根中查找

Object value = Ognl.getValue("[1].propertyName", map, rootList);

4.调用非静态方法:

Object value = Ognl.getValue("size()", list);

5.调用静态方法:

e1:

Object value = Ognl.getValue("@java.lang.Math@PI", null);

e2:

Object value1 = Ognl.getValue("@java.lang.Math@floor('3.14')", null);

struts2重点——ValueStack和OGNL的更多相关文章

  1. ValueStack和OGNL达到Struts2形式的数据存储原理

    (1)最近学习struts相框,我们在快乐struts强大.为了便于使用转发,但不了解详细的内部数据存储: (2)网上找了很多关于struts数据存储的原理,但我还没有找到一个具体的解释,本书上找到了 ...

  2. Struts2:ValueStack

    一.ValueStack     1 .ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用       ...

  3. 浅析=======Struts2之==========valueStack

    今天刚学习了struts2的valueStack,在这里把自己学到的做个分享,说道valueStack就不得不提OGNL表达式=== struts2工作流程 1.OGNL(Object Graph N ...

  4. Struts2中ValueStack结构和总结

    [ValueStack和ActionContext的关系] 首先,从结构上来看ValueStack是ActionContext的一个组成部分,是对ActionContext功能的扩展.ActionCo ...

  5. Struts2第九篇【OGNL、valueStack详解】

    什么是OGNL表达式? OGNL是Object Graphic Navigation Language 是操作对象属性的开源表达式. Struts2框架使用OGNL作为默认的表达式语言. 为什么我们学 ...

  6. 【Struts2五】ValueStack以及ognl表达式二(经常使用标签)

    Ognl经常使用标签:   1.s:debug       假设把该标签放入到s:iterator中能够看到当前正在迭代的元素的状态    2.s:property       1.输出       ...

  7. 4. ValueStack 和 OGNL

    1. 属性哪来的 当我们通过Action处理完用户请求以后,可以直接在页面中获取到 action 的属性值. 如果我们在页面中尝试遍历四个域中的属性,会发现域中并没有username之类的Action ...

  8. [原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. struts2的 result 通配符 OGNL

    result: 1). result 是 action 节点的子节点 2). result 代表 action 方法执行后, 可能去的一个目的地 3). 一个 action 节点可以配置多个 resu ...

随机推荐

  1. Hadoop map和reduce数量估算

    Hadoop在运行一个mapreduce job之前,需要估算这个job的maptask数和reducetask数.首先分析一下job的maptask数,当一个job提交时,jobclient首先分析 ...

  2. Android Studio生成javadoc出错的解决办法

    一般使用Android Studio生成javadoc会有两个问题: 空指针异常 文档乱码 解决办法如下: 第1个问题:Tools --> Generate JavaDoc -->打开对话 ...

  3. Jmeter属性和变量

    一.Jmeter中的属性: 1.JMeter属性统一定义在jmeter.properties文件中,我们可以在该文件中添加自定义的属性 2.JMeter属性在测试脚本的任何地方都是可见的(全局),通常 ...

  4. oracle导入导出小记

    问题:11.2.0.3.0 导入  11.2.0.2.0 都是oracle 11g ,从0.3.0到0.2.0 报错,以为是版本问题,结果不是 采用impdp 导入exp导出的文件会报错 所以改为im ...

  5. Scala 深入浅出实战经典 第78讲:Type与Class实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  6. 用ASP.NET Core 1.0中实现邮件发送功能

    准备将一些项目迁移到 asp.net core 先从封装类库入手,在遇到邮件发送类时发现在 asp.net core 1.0中并示提供SMTP相关类库,于是网上一搜发现了MailKit 好东西一定要试 ...

  7. fio terse输出详解

    fio, the flexible IO tester, is a very useful tool for benchmarking IO performance. It has an option ...

  8. HttpModule生命周期示意图

  9. 彩色的Shell

    我常在命令行下工作,以前老被同事说"你整天在那个黑窗口上倒腾什么?" 现在这个问题变成了"你这个花花绿绿的窗口是什么东西?" 其实都是同一个东西:一个兼容于xterm的终端窗口,要么是PuTTY/Ki ...

  10. 降低屏幕亮度,减缓眼疲劳 (linux/windows/firefox/android)

    Linux 在Linux上自动调整屏幕亮度来保护眼睛 - 51CTO.COM -- 介绍了Camera和RedShift这两款工具 How to automatically dim your scre ...