Struts2值栈

三、OGNL

1.OGNL概述

①OGNL是Apache Commons下的一个子项目,同在Commons下的子项目还有我们用过的FileUpload、IO、BeanUtils、DbUtils、Logging等。

 

②OGNL并不依赖Struts2存在,创建一个Java工程就能够对OGNL进行测试,此时需要导入两个JAR包

javassist-3.11.0.GA.jar

ognl-3.0.6.jar

[这两个JAR包可以在Struts2提供的blank例子工程的lib目录下找到]

2.OGNL:对象图导航语言

①对象图:Java对象可连续访问的级联属性形成的图形结构

例如:department.getEmpList().get(3).getAddress().getCity();

当对象嵌套层次较深时,按照对象自身的属性进行访问往往过于冗长。

②导航语言:以表达式的形式快速定位到对象图中的某个属性

类似:jQuery选择器、xPath表达式等

③OGNL表达式语法

[1]Ognl.getValue()方法未指定上下文对象:从根对象中读取数据

(1)读取普通对象的属性:"对象.属性名"或"对象[属性名]"

(2)读取List/数组对象的元素:"List/数组对象[下标]"

(3)读取Map对象中键对应的值:"Map对象['键']"或"Map对象.键"

[2]Ognl.getValue()方法指定了上下文对象

(1)OGNL表达式中没有使用#号,表示在根对象中查找数据

(2)OGNL表达式中以#key的形式表示在上下文对象中以key为键查找对应的值

④其他语法

[1]调用对象非静态方法

"对象.方法名()"或"对象.方法名('字符串或基本数据类型参数')"

[2]调用对象静态方法:

"@全类名@方法名()"或"@全类名@方法名('字符或基本数据串类型参数')"

[3]访问对象静态属性:"@全类名@属性名"

 

3.ValueStack中的OGNL

①对应关系

[1]CompoundRoot对象对应OGNL中的根对象

[2]context对象对应OGNL中的上下文环境对象

源码:com.opensymphony.xwork2.ognl.OgnlUtil.getValue(String, Map<String, Object>, Object)

②重要区别

在OGNL语法中,访问List或数组类型的根对象时必须使用“[]”指定下标,但如果根对象是CompoundRoot对象,则可以省略下标。

如果省略了下标,仅指定了对象的属性名时,将从栈顶元素向下开始查找包含这个属性名的对象,直到为止。

即使指定了下标,也不是仅从下标指向的对象开始查找,而是从指向的对象开始向下查找直到找到为止。

③访问静态资源

默认情况下Struts2不允许通过OGNL表达式访问静态资源,必须加入如下设置

<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

④通过ValueStack对象调用public abstract Object findValue(String expr);方法即可执行OGNL表达式

 

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。