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

知识星球

Ognl 语法基础教程的更多相关文章
- html快速入门(基础教程+资源推荐)
1.html究竟是什么? 从字面上理解,html是超文本标记语言hyper text mark-up language的首字母缩写,指的是一种通用web页面描述语言,是用来描述我们打开浏览器就能看到的 ...
- CSS基础教程 -- 媒体查询屏幕适配
响应式布局 Media Query 的使用方法 在上例中, 我们使用Media Queries来根据3种不同尺寸的窗口使用3种不同的样式.通过不同的媒体类型和条件定义样式表规则,媒体查询让CSS可以更 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- css3基础教程:CSS3弹性盒模型
今天给大家分享一篇关于CSS3基础教程 文章,主要是讲CSS3弹性盒模型.弹性布局的主要思想是让容器有能力来改变项目的宽度和高度,以填满可用空间(主要是为了容纳所有类型的显示设备和屏幕尺寸)的能力. ...
- Verilog语法基础讲解之参数化设计
Verilog语法基础讲解之参数化设计 在Verilog语法中,可以实现参数化设计.所谓参数化设计,就是在一个功能模块中,对于一个常量,其值在不同的应用场合需要设置为不同的置,则将此值在设计时使用 ...
- NSIS安装制作基础教程[初级篇], 献给对NSIS有兴趣的初学者
NSIS安装制作基础教程[初级篇], 献给对NSIS有兴趣的初学者 作者: raindy 来源:http://bbs.hanzify.org/index.php?showtopic=30029 时间: ...
- python基础教程笔记—即时标记(详解)
最近一直在学习python,语法部分差不多看完了,想写一写python基础教程后面的第一个项目.因为我在网上看到的别人的博客讲解都并不是特别详细,仅仅是贴一下代码,书上内容照搬一下,对于当时刚学习py ...
- HTML入门基础教程相关知识
HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...
- 电脑小白自学软件编程-.Net语法基础之循环语句,纯技巧干货
写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用视频. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是不在话下. 本教程是基础教程,适合任何有志于学习软件开发的 ...
随机推荐
- 微服务架构 ------ Dockerfile定制镜像
Docker容器不仅仅是运行原生的容器,而是把我们的具体的项目能够布置到容器上面去,这就是Docker定制镜像需要做的事情. Docker容器 = new Docker镜像 镜像相当于类,容器相当 ...
- Loadsh 常用方法总结以及在vue中使用Loadsh
Loadsh 常用方法总结以及在vue中使用Loadsh Lodash 是一个一致性.模块化.高性能的 JavaScript 实用工具库.处理复杂数组,对比等可以直接采用该库,也方便快捷. 官方网站 ...
- EHLIB 安装方法
Ehlib安装方法 路人甲 2010-05-05 23:01:37 安装文件自带的Readme.txt中的安装过程如下: 1. Delphi 5.x - 7.x, Delphi 9.X Win32, ...
- 详解Vue中的虚拟DOM
摘要: 什么是虚拟DOM? 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 Vue.js 2.0引入Virtual DOM,比Vue.js 1.0的初始渲染速度提升了2-4倍,并 ...
- 尝试在Mac/iOS上使用tcmalloc库
概述 TCMalloc 是 Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配.它具有现代化内存分配器的基本特征:对抗内存碎片. ...
- 项目中 直接跳后台 不用输入/newadmin
- python3 内建函数filter
Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是 ...
- ECharts学习指南
1.了解ECharts ECharts简单说就是互联网开发程序过程中,后台数据库用以实现数据到图形的映射的一个插件. 具体来说一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在PC和 ...
- Kubernetes概念之RC
感觉自己浪费了一年的时间,种一棵树最好的时间是十年前,还有就是现在,虽然这颗树种了又种,种了又种,这次真的要种了...... 本文通过<Kubernetes权威指南>的概念部分学习总结 ...
- eclipse 离线安装activiti
1. 下载activiti离线安装包, activiti-designer-1.8.zip 2. 将上图4个jar包放在eclipse的features文件夹中 3. 打开eclipse-->H ...