1. 什么是Ognl

OGNL 代表 Object-Graph Navigation Language;它是一种表达式语言,用于获取和设置 Java 对象的属性,以及其他附加功能,例如列表投影和选择以及 lambda 表达式。您可以使用相同的表达式来获取和设置属性的值。Ognl 类包含评估 OGNL 表达式的便捷方法。您可以分两个阶段执行此操作,将表达式解析为内部形式,然后使用该内部形式设置或获取属性的值;或者您可以在一个阶段完成,并直接使用表达式的字符串形式获取或设置属性。OGNL 最初是作为一种使用属性名称在 UI 组件和控制器之间建立关联的方法。随着对更复杂关联的渴望不断增长,Drew Davidson 在 Luke Blanshard 的怂恿下创建了他所谓的 KVCL,即键值编码语言。然后,Luke 使用 ANTLR 重新实现了该语言,提出了新名称,并在 Drew 的怂恿下将其填充到当前状态。后来 Luke 再次使用 JavaCC 重新实现了该语言。 Drew 对所有代码进行了进一步的维护(在 Luke 的精神指导下)。我们将 OGNL 发音为一个单词,就像“正交”的醉酒发音的最后一个音节。

2.Ognl语法

基本的 OGNL 表达式非常简单。 该语言的功能已经变得相当丰富,但您通常不必担心该语言中更复杂的部分:简单的情况仍然如此。 例如,要获取对象的名称属性,OGNL 表达式就是名称。 要获取headline 属性返回的对象的text 属性,OGNL 表达式是headline.text。

什么是property? 粗略地说,OGNL 属性与 bean 属性相同,这意味着一对 get/set 方法,或者一个字段,定义了一个属性

OGNL 表达式的基本单元是导航链,通常简称为“链”。 最简单的链由以下部分组成:

表达式元素部分 例子
属性名称 like the name and headline.text examples above
方法调用 hashCode() to return the current object’s hash code(返回对象的hashcode)
数组索引 listeners[0] to return the first of the current object’s list of listeners (返回第一个)
  • 所有 OGNL 表达式都在当前对象的上下文中进行评估,并且链只是将链中前一个链接的结果用作下一个链接的当前对象。 您可以随意延长链条。 例如,这个链:
name.toCharArray()[0].numericValue.toString()