1. ognl是什么
ognl,全称Object Graphic Navigation Language(对象图导航语言),根据约定的一些简单的规则,组装一个利于阅读、可执行的表达式语句
2. ognl表达式官方指南:
https://commons.apache.org/proper/commons-ognl/language-guide.html
3. root和context
root
root可以理解为是一个java对象,表达式所规定的所有操作都是通过root来指定其对哪个对象进行操作。
context
context可以理解为对象运行的上下文环境,context以map的结构,利用键值对关系来描述对象中的属性以及值。
4. 对象定位
java是面向对象的开发语言,所以ognl表达式有3种方式获取对象
4.1 访问静态对象的「属性」和「方法」
- 语法
//@开头// 访问静态属性@类名@属性名// 调用静态方法@类名@方法名(参数)
- demo
@Testpublic void getPropertyValueFromStaticObj() throws Exception { // 获取静态属性 // 格式:@类名@属性名 Object value = Ognl.getValue("@java.lang.Long@MAX_VALUE", null); Assertions.assertEquals(Long.MAX_VALUE, value);}@Testpublic void callStaticMethod() throws Exception { // 调用静态方法 // 格式:@类名@方法名 Object value = Ognl.getValue("@java.lang.String@valueOf('时间有限IT')", null); Assertions.assertEquals("时间有限IT", value);}
4.2 访问对象属性(从root/context中访问)
- 语法
// 「#」开头,「.」作为连接符#对象.属性名#对象.方法名()// root对象可以省略,直接访问属性"属性名"
- demo
@Testpublic void getPropertyValueFromRootObj() throws Exception { // init ognl context User rootUser = new User("时间有限IT", 18); Map context = Maps.newHashMap(); context.put("jack", new User("jack", 19)); context.put("rose", new User("rose", 20)); OgnlContext oc = new OgnlContext(); oc.setRoot(rootUser); oc.setValues(context); // 如果直接填写「属性」,默认就是root中获取 Object nameFromRoot = Ognl.getValue("name", oc, oc.getRoot()); Assertions.assertEquals("时间有限IT", nameFromRoot); // root对象默认的属性名:root // # : 访问对象 // #root : 访问属性名为root的对象 Object nameFromRootV2 = Ognl.getValue("#root.name", oc, oc.getRoot()); Assertions.assertEquals("时间有限IT", nameFromRootV2); // 调用方法 Object sayReturn = Ognl.getValue("#root.say()", oc, oc.getRoot()); Assertions.assertEquals("时间有限IT say hello", sayReturn); // 调用context方法 Object jackSayReturn = Ognl.getValue("#jack.say()", oc, oc.getRoot()); Assertions.assertEquals("jack say hello", jackSayReturn);}@Data@AllArgsConstructorpublic class User { private String name; private int age; public String say() { return name + " say hello"; }}