191129-Ognl 语法基础教程

文章目录
  1. 1. 前言
  2. 2. 对象定位
  3. 3. 方法调用
  4. 4. 成员访问
  5. 5. 集合
  6. 6. 表达式语句
  • II. 其他
    1. 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
    2. 2. 声明
    3. 3. 扫描关注
  • 本文将力求用最简单的语言是和示例,介绍一下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
    2
    3
    4
    5
    6
    7
    8
    // 字符串的长度
    "name".length()

    // 数字计算
    1+2

    // boolean
    true

    3. 方法调用

    执行目标对象的某个方法,规则如下

    1
    2
    3
    4
    5
    6
    7
    8
    // 非基本对象的方法访问,#开头,对象与方法之间用.连接
    #obj.method( 参数 )

    // 静态对象的方法访问,@开头,对象与方法之间用@连接
    @xxx@method( 参数 )

    // 基本对象的方法访问,和非基本对象方法方式一致
    "name".length()

    4. 成员访问

    访问目标对象的成员,规则如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 非基本对象的成员访问,#开头,对象与成员之间用.连接
    #obj.field

    // 静态对象的成员访问,@开头,对象与成员之间用@连接
    @xxx@field

    // 基本对象的成员访问,和非基本对象成员方式一致
    "name".hash
    `

    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
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // in 语句,判断列表中是否包含
    "name" in {"name", "hello"}

    // 遍历集合,获取所有的偶数
    {1,2,3,4,5,6}.{? #this % 2 == 0}

    // 遍历集合,获取第一个满足条件的元素
    {1,2,3,4,5,6}.{^ #this % 2 == 0}

    // 遍历集合,获取最后一个满足条件的元素
    {1,2,3,4,5,6}.{$ #this % 2 == 0}

    对象创建

    可以直接通过new来创建一个对象,当我们需要执行的目标方法的参数为非基本类型时,可能会非常好用

    1
    2
    // new + 完整的类名
    new java.lang.String("hello world")

    链式语句

    什么是链式语句呢?

    有点类似设计模式中的Builder模式,我要执行一串的操作,最后获取目标

    定义规则如下,圆括号包裹起来,中间用逗号分隔,依次执行,最后一个为需要返回的目标

    1
    (step1, step2,..., result)

    结合上面的对象创建,可以实现非常强大的功能

    1
    2
    3
    4
    5
    package git.hui;
    class User {
    public String name;
    public Integer age;
    }

    直接创建一个可用的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. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

    一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

    2. 声明

    尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

    3. 扫描关注

    一灰灰blog

    QrCode

    知识星球

    goals

    评论

    Your browser is out-of-date!

    Update your browser to view this website correctly. Update my browser now

    ×