OGNL与值栈

#2020云栖大会#阿里云海量offer来啦!投简历、赢阿里云限量礼品及阿里云ACA认证免费考试资格!>>> hot3.png

好的时光


34cd15e89a7b2ed97ac722e86469710daf2.gif


  1. OGNL

  • 什么是OGNL

  • OGNL功能

  • OGNL简单使用

值栈

  • 什么是值栈

  • 值栈结构




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中存取(需要#号)


2a24f23c51db3fcfec43558861f2f6fcd05.png


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


900540e027866e26832df64333aa819bd2b.png


使用对象方法和静态方法


140707fc9855762ed83749bb51d8ffb1a4f.jpg


在页面中使用ognl


导入标签库

a671911b883f5d6ba4c0612c4267e124124.png


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

a8dcbfb12d7d5b2c14e2e8181f95f95e5b3.png

e051837fd0e216b805f632cab39bf13c246.png

f2a27803b916f2d2f59753f1fb986c1b48c.png




值栈



什么是值栈?

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


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


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


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

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


ValueStac


值栈的内部结构

a406e289ce0e0de5e504b7ffe17a1d23a74.png


当请求过来的时候,执行

StrutsPrepareAndExecuteFilter过滤器当中的doFilter方法

在这个方法当中创建ActionContext

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

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


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

35ffde21faae6b5539d465dc7ffb8d479f3.jpg

8cc166e5195ad2e384de14e6c40407ee3b4.jpg



值栈存数据


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


553a08f331d2ddc06cd3005c808b90563bc.png

5f68951d3fce1094f5166e3e02278cae457.png


获取值栈

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>


e79b0ffc00b49a92efcc0ea5d2c0547ba11.png

1d544cf2caacac4427a181b683df0675953.png

fd5e56b51b8c7366c6315df103c940f0433.png

点开debug就是当前值栈信息

4138086ac95af94fbff94fd2e4cfe7b6ede.jpg

d06de36de6d0b4e8ffe8c832f3d84101d1d.jpg



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


405080a8e5f9d64eaeb341c7dd31a04fd74.png

602b6c8f93951f3eb13b26f68316a7a5902.jpg


成功获取到根区的name

949aa06bfdfef0e9d56685877b5d1bf7074.png


非根区取数据


891103d5bd04680d506a33c57ae2986fe1f.png

73b6accd7686172d55f0f63d801c3614c97.png

ad20af737f6b211eba50525a44f8972af4b.jpg


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

04555f3f861ca932187f9ad3c632cbd188b.png





本文分享自微信公众号 - IT那个小笔记(qq1839646816)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值