Ognl
OGNL 是 Object-Graph Navigation Language
的缩写,它是一种功能强大的表达式语言(Expression Language,简称为 EL
),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能
OGNL
Language Guide
Maven 依赖
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>3.1.24</version>
</dependency>
Root
Object Ognl.getValue(String expression, Object root)
setValue(String expression, Object root, Object value)
表达式 |
描述 |
|
"person.name" = "#root.person.name" |
获取对象属性值 |
|
"username + ',' + sex" |
同时获取多个值并用 逗号分割 |
|
Ognl.getValue("length()", "12345") |
访问对象方法 |
|
Ognl.getValue(Ognl.parseExpression("length()"), "12345") |
访问对象方法 |
|
Ognl.getValue("substring(0,1)", "12345") |
访问对象方法 |
|
Context
Object Ognl.getValue(String expression, Map context, Object root)
setValue(String expression, Map context, Object root, Object value)
访问 Context 表达式前面需要加上 #
,root 也属于 Context,使用 #root
访问,也可以省略
Map<String, Person> context = new HashMap<String, Person>();
context.put("p1", p1);
context.put("p2", p2);
表达式 |
描述 |
|
Ognl.getValue("#p1.name", context, new Object()) |
获取 Context 中的对象属性 |
|
赋值
表达式 |
描述 |
|
"#u.username = '暗之幻影'" |
|
|
"#u.username = '风',#p.name = '云'" |
|
|
静态方法
表达式 |
描述 |
|
"@System@out.println(#this)" |
打印对象本身 |
|
TODO |
|
|
#this 引用
表达式 |
描述 |
|
Ognl.getValue("#this.username", user) |
#this 指代 root 对象本身 |
|
Ognl.getValue("username", user) |
同上 |
|
Ognl.getValue("username.(#this.toLowerCase())", user) |
这里的 #this 指代 username |
|
Ognl.getValue("username.toLowerCase()", user) |
同上 |
|
Ognl.getValue("#this.size.(#this > 2 ? \"大于2\" : '不大于2')", Arrays.asList(1, 2, 3)) |
第一个 #this 是 List,第二个 #this size |
|
Ognl.getValue("size.(#this > 2 ? \"大于2\" : '不大于2')", Arrays.asList(1, 2, 3)) |
同上 |
|
Ognl.getValue("size().(#this > 2 ? \"大于2\" : '不大于2')", Arrays.asList(1, 2, 3)) |
同上 |
|
创建对象
表达式 |
描述 |
|
(List) Ognl.getValue("{'item1', 'item2', 'item3'}", new Object()) |
创建列表 |
|
(int[]) Ognl.getValue("new int[]{23,45,67}", root) |
创建数组 |
|
(Map) Ognl.getValue("#{'key1':'value1','key2':'value1'}", root) |
创建 Map |
|
注意事项
MemberAccess implementation must be provided!
ognl:ognl:3.2.x
后,以下代码会报错,MemberAccess
的实现需要手动设置
Ognl.getValue("length()", "12345")
MemberAccess implementation must be provided! –Ognl3.2.6的异常解决方案
Read More