OGNL与值栈

好的时光

  1. OGNL
    • 什么是OGNL
    • OGNL功能
    • OGNL简单使用
  2. 值栈
    • 什么是值栈
    • 值栈结构

OGNL

什么是OGNL?

OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。

对比EL表达式:

OGNL对象图导航语言,比EL表达式强大很多倍的语言

EL表达式只能从域中获取数据

OGNL可以调用对象的方法,获取struts的值栈的数据。

OGNL是第三方的表达式语言,用它来获取struts中值栈的数据

OGNL的功能

支持运算符(如+-*/)

支持对象方法调用,如xxx.doSomeSpecial();

支持类静态的方法调用和值访问

支持赋值操作和表达式串联

访问OGNL上下文

操作集合对象

可以直接new一个对象

OGNL入门

OGNL使用要素三个:

表达式

根区

非根区(context对象)

OGNL核心OgnlContext本质是一个map

java程序中使用ognl:

在context中存取(需要#号)

在根元素中存取(不需要#)

使用对象方法和静态方法

在页面中使用ognl

导入标签库

调用静态方法默认不行,需要开启

值栈

什么是值栈?

ValueStack实际上就是一个容器。是一个接口,实现类为OgnlValueStack

当用户每次访问action对象的业务方法时, 会先创建ActionContext对像里面又包含OgnlValueStack对象、Action对象

它由Struts框架创建,当前端页面如jsp发送一个请求时,Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。

Struts框架中的数据就都保存到了ValueStack中,各种域也是被包含在值栈当中,存到域当中只能在页面中把它取出来存到值栈当中可以在任何地方取出数据

ValueStack贯穿整个action的生命周期, action一旦创建,就会创建一个valuestack对象

ValueStac

值栈的内部结构

当请求过来的时候,执行

StrutsPrepareAndExecuteFilter过滤器当中的doFilter方法

在这个方法当中创建ActionContext

在创建ActionContext过程中,创建ValueStack对象

将valueStack对象传递给ActionContext对象。通过ActionContext获取值栈对象

ActionContext对象之所以能够访问servlet的API(域对象的数据)就是因为内部有值栈的引用,与action相关的存在根区请求完毕后清空,而其他域的数据存在非根区

值栈存数据

通过ActionContext类的静态方法getContext得到ActionContext对象,ActionContext对象调用getValueStack获取到值栈

获取值栈

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

根区

// getRoot()可以省略
Student stu = new Student();
valueStack.getRoot().push(stu);
valueStack.getRoot().pop();

非根区

ActionContext.getContext().push(数据);
ActionContext.getContext()pop();

从值栈取

用struts标签库的debug在页面展示值栈信息

使用debug需开启

 <constant name="struts.devMode" value="true"></constant>

点开debug就是当前值栈信息

从根区当中取(注意它是从栈顶取,若根区中两个或多个Property Name相同取到的是上面的)

成功获取到根区的name

非根区取数据

成功获取到非根区相应信息

本文分享自微信公众号 - IT那个小笔记(qq1839646816),作者:木瓜煲鸡脚

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 构造器和包

    木瓜煲鸡脚
  • 代码块和final关键字

    若该类有父类则在创建该类对象即调用该类的构造方法时会先调用父类构造方法。即堆中会出现两个对象

    木瓜煲鸡脚
  • Struts2配置

    Struts2中有很多配置文件可以去配置常量,对同一个量在不同配置文件都配置了,那么生效的肯定是最后加载的,因此需要知道配置文件的加载顺序

    木瓜煲鸡脚
  • 为什么 JS 中的对象字面量很酷

    在 ES6 之前,JS 中的对象字面量(也称为对象初始化器)是非常基础的。可以定义两种类型的属性:

    前端小智@大迁世界
  • 《你不知道的js(上卷)》笔记2(this和对象原型)

    this关键字是javascript中最复杂的机制之一。它是一个很特别的关键字,被自动定义在 所有函数的作用域中。

    陨石坠灭
  • 从零开始单排学设计模式「UML类图」定级赛

    本篇是设计模式系列的开篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统。

    良月柒
  • 机器学习(六)--------神经网络(Neural Networks)

    无论是线性回归还是逻辑回归都有这样一个缺点,即:当特征太多时, 计算的负荷会非常大。 比如识别图像,是否是一辆汽车,可能就需要判断太多像素。 这时候就需要...

    实时计算
  • 当房奴这么痛苦,为什么很多年轻人还贷款买房?

    PS:买房对于普通家庭而言并非易事,我其实非常感谢我的父母,亲戚的帮助,朋友结婚了都有了自己的家庭都有了自己负担,很多时候还是感觉亲戚更可靠些,毕竟血溶于水。很...

    IT故事会
  • iOS SwiftyJSON 对应的JSON 转化为 对象

    SwiftyJSON确实很好用 不会因为取了某个空对象的值而导致程序的崩溃 但是 一直这样data["a"]["b"]["c"].stringValue的形式也...

    剑行者
  • JAVA-聊聊JVM的年轻代

    jmap -histo:live pid | less 可以观察heap中所有对象的情况(heap中所有生存的对象的情况)

    用户2825413

扫码关注云+社区

领取腾讯云代金券