#2020云栖大会#阿里云海量offer来啦!投简历、赢阿里云限量礼品及阿里云ACA认证免费考试资格!>>>
![34cd15e89a7b2ed97ac722e86469710daf2.gif](https://i-blog.csdnimg.cn/blog_migrate/91c993cdf68c3965ac45395f68be12e8.gif)
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中存取(需要#号)
在根元素中存取(不需要#)
使用对象方法和静态方法
在页面中使用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)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。