热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

struts2重点——ValueStack和OGNL

一、值栈(ValueStack)1.实现类:OGNLValueStack2.对象栈:CompoundRoot(

一、值栈(ValueStack)

1.实现类:OGNLValueStack

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

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

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

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

(4)获取方式

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

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

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

如:

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

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

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

(3)获取方式:
后台:Map context = ActionContext.getContext().getValueStack().getContext();

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

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

如:

(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 map &#61; new HashMap<>();
map.put(
"attr.name", "attr.value");
Object value
&#61; Ognl.getValue("[&#39;attr.name&#39;]", map);

3.同时指定了上下文&#xff08;必须为一个Map对象&#xff09;和根&#xff08;为一个 List&#xff09;

&#xff08;1&#xff09;若指定了 #&#xff0c;则表示从 Map 中查找

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

&#xff08;2&#xff09;若没有指定 #,则表示从根中查找

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

4.调用非静态方法&#xff1a;

Object value &#61; Ognl.getValue("size()", list);

5.调用静态方法&#xff1a;

e1:

Object value &#61; Ognl.getValue("&#64;java.lang.Math&#64;PI", null);

e2:

Object value1 &#61; Ognl.getValue("&#64;java.lang.Math&#64;floor(&#39;3.14&#39;)", null);

 

转:https://www.cnblogs.com/solverpeng/p/5646225.html



推荐阅读
  • Synchronized一、应用对于普通同步方法,锁是当前实例对象;对于静态同步方法,锁是当前类的Class对象;对于同步代码块,锁是Synchronized括号里配置的对象。二、实现 ... [详细]
  • 笔试强训(二十六)
    目录一、选择题二、编程题2.1快到碗里来2.1.1题目2.1.2题解2.2跳台阶扩展问题2.2.1题目2.2.2题解一、选择题(1)下列哪些语句关于内 ... [详细]
  • 在某些时候,我们可能想基于字符串做一些事情,比如:针对同一用户的并发同步操作,使用锁字符串的方式实现比较合理。因为只有在相同字符串的情况下,并发操作才是不被允许的。而如果我们不分青 ... [详细]
  • 1、深拷贝和浅拷贝是什么意思?浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当 ... [详细]
  • 1.post与get区别(1)post是向指定的资源提交要被处理的数据,get是从指定的资源请求数据;(2&# ... [详细]
  • Java Servlet简介
     一、了解Servlet的概念 Servlet定义 Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容。Servlet引擎作为WEB服务器的扩展提供支持Ser ... [详细]
  • ※Java初级 常见面试题①
    2022春招面试指南:Java岗位基础篇(适用于各大企业招聘Java初级工程师岗位,附配套MD文档)_哔哩哔哩_bilibi ... [详细]
  • APMpinpoint(分布式集群环境下的性能监控)
    [官方参考](https:github.comnaverpinpointblobmasterdocinstallation.md”pinpoint官方文档”)中文文档参考环境要求: ... [详细]
  • HashMap的结构和底层实现原理是什么?HashMap用的是非常常见的结构:数组和链表的结合的数据结构。数组的每个地方都存了Key-Value这样的实例,在JDK8中交做Node ... [详细]
  • 通过Class对象获取对象的方式是通过class.newInstance()方式获取,通过调用默认构造参数实例化一个对象。1**2*Createdbyhunton201762 ... [详细]
  • 解题:洛谷2093 JZPFAR
    题面初见K-DTree其实这样的题(欧几里得距离第$x$近点对)不应该用K-DTree做,因为会被构造数据卡成$O(n^2)$,随机的另说。但是并没有找 ... [详细]
  • 异步投递与确认签收回调ActiveMQ支持同步、异步两种发送的模式将消息发送到broker,模式的选择对发送延时有巨大的影响。producer能达到怎样的产出率(产出率发送数据总量 ... [详细]
  • Java链表基本操作和Java.util.ArrayList今天做了一道《剑指offer》上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回 ... [详细]
  • 再来一篇深度优先遍历/搜索总结?
    再来一篇深度优先遍历搜索总结?简介:深度优先搜索算法(Depth-First-Search,DFS),最初是一种用于遍历或搜索树和图的算法,在LeetCode中很常见,虽然感觉不难 ... [详细]
  • 注册github账号github.com创建新的文件增加至githubgitinit初始化gitaddREADME.md将文件提交至缓存区gitcommit-mfirs ... [详细]
author-avatar
他的一个号码_616
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有