本文将力求用最简单的语言是和示例,介绍一下OGNL的语法规则,文章主要内容参考自官方文档http://commons.apache.org/proper/commons-ognl/language-guide.html
- 本篇主要是语法介绍篇,实战放在一下篇
1. 前言
ognl,全称Object Graphic Navigation Language(对象图导航语言),根据约定的一些简单的规则,组装一个利于阅读、可执行的表达式语句
如下面是一个典型的表达式
1 | "name".toCharArray()[0].numericValue.toString() |
即便完全不懂ognl,单纯的以java的基础知识就可以看懂,而这就是ognl的魅力所在 (学习一点点东西,就可以马上入手)
2. 对象定位
说明,这一小节的内容为我个人为了方便理解而分类的,并不官方
我们知道在java中,一切都是对象,所以我们的ognl表达式必然是着手于某一个对象的,通常在ognl中,可以将待执行目标对象划分为三类
- 简单对象:(如基本数据类型,String)
- 非简单对象:(非简单对象,实例访问)
- 静态对象:(静态类)
在gonl的语法中,上面三种case,根据不同的开头来标记
静态对象
简单来说就是我想访问静态类的某个方法(或者静态类的成员)
1 | @java.lang.Math |
语法规则为根据@
开始,后面接上完整的类名
一个实例case如下,相当于java代码中直接调用Math.max(10, 20)
1 | @java.lang.Math@max(10, 20) |
非简单对象
访问一个普通对象的成员or方法
1 | #demo |
语法规则为根据#
开头,后面为对象名(说明,这个对象需要在Ognl的上下文中,且可以根据对象名可以唯一定位)
简单对象
即基本类型的对象访问,不加任何前缀,直接使用即可,如下
1 | // 字符串的长度 |
3. 方法调用
执行目标对象的某个方法,规则如下
1 | // 非基本对象的方法访问,#开头,对象与方法之间用.连接 |
4. 成员访问
访问目标对象的成员,规则如下
1 | // 非基本对象的成员访问,#开头,对象与成员之间用.连接 |
5. 集合
ognl 针对常用的集合进行了特殊的支持
List
通过{}创建列表,通过[]来访问对象下标的元素
下面表示创建一个列表,有三个元素: 1,2,3; 获取列表中下标为2的元素
1 | {1, 2, 3}[2] |
Arrays
数组,可以结合new来使用
1 | new int[] {1,2,3} |
Map
#{k:v, k:v} 方式来创建map
下面的语句,表示创建一个map,并获取其中key为name的元素
1 | #{ "name" : "一灰灰Blog", "age" : 18}["name"] |
6. 表达式语句
前面是一些简单的,基本的成员访问,方法调用,除此之外还存在更牛逼的用法,支持表达式的执行
成员赋值
1 | #demo.name = "一灰灰blog" |
表达式计算
1 | 500 + 20 - 30 * 3 |
三目运算符
1 | "name".length() % 2 == 0 ? "偶数长度" : "奇数长度" |
集合支持
针对集合做了一些简化,方便调用
1 | // in 语句,判断列表中是否包含 |
对象创建
可以直接通过new来创建一个对象,当我们需要执行的目标方法的参数为非基本类型时,可能会非常好用
1 | // new + 完整的类名 |
链式语句
什么是链式语句呢?
有点类似设计模式中的Builder模式,我要执行一串的操作,最后获取目标
定义规则如下,圆括号包裹起来,中间用逗号分隔,依次执行,最后一个为需要返回的目标
1 | (step1, step2,..., result) |
结合上面的对象创建,可以实现非常强大的功能
1 | package git.hui; |
直接创建一个可用的User对象,下面执行完毕之后,直接获取一个属性被初始化后的User对象
1 | (#user=new git.hui.User(), #user.name="一灰灰Blog", #user.age=18, #user) |
lambda表达式
这个有点高端了,首先是定义lambda表达式,然后借助前面的链式方式调用,下面是一个阶乘的case
1 | #fact = :[#this<=1? 1 : #this*#fact(#this-1)], #fact(3) |
II. 其他
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 扫描关注
一灰灰blog
知识星球