1. 程式人生 > 程式設計 >Ognl 語法基礎教程

Ognl 語法基礎教程

本文將力求用最簡單的語言和例項,介紹一下 OGNL 的語法規則,文章主要內容參考自官方檔案commons.apache.org/proper/comm…

  • 本篇主要是語法介紹篇,實戰放在一下篇
  • 因為本篇文章將是後 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,3}[2]
複製程式碼

Arrays

陣列,可以結合 new 來使用

new int[] {1,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,3,4,5,6}.{? #this % 2 == 0}

// 遍歷集合,獲取第一個滿足條件的元素
{1,6}.{^ #this % 2 == 0}

// 遍歷集合,獲取最後一個滿足條件的元素
{1,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. 一灰灰 Blogliuyueyi.github.io/hexblog

一灰灰的個人部落格,記錄所有學習和工作中的博文,歡迎大家前去逛逛

2. 宣告

盡信書則不如,已上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現 bug 或者有更好的建議,歡迎批評指正,不吝感激

3. 掃描關注

一灰灰 blog

QrCode

知識星球

goals