一種表達式語言的解析引擎JEXL簡單使用


 Jexl 是一個 Expression Language 的解析引擎, 是為了方便嵌入你的系統或者程序框架的開發中, 他算是實現了 JSTL 中 EL 的延伸版本. 不過也采用了一些 Velocity 的概念. 下面是一個使用Jexl的例子,有詳細注釋,

 


import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.jexl.Expression;
import org.apache.commons.jexl.ExpressionFactory;
import org.apache.commons.jexl.JexlContext;
import org.apache.commons.jexl.JexlHelper;

......

/*
* 初始化一個Cat對象
*/
Cat cat = new Cat() {
{
this.setAge(2);
this.setName("Tom");
this.setOwner(new People() {
{
this.setAge(24);
this.setName("yang");
}
});
}
};

/*
* 初始化一個List對象,列表里存入兩個元素
* 第一個元素是一個字符串
* 第二個元素是一個整數
*/
List list = new ArrayList();
list.add("Hello world !");
list.add(11);

Map map = new HashMap();
map.put("cat", cat);
map.put("people",cat.getOwner());

/*
* 初始化一個JexlContext對象,它代表一個執行JEXL表達式的上下文環境
*/
JexlContext context = JexlHelper.createContext();

/*
* 向執行JEXL表達式的上下文環境的變量字典中存入兩個變量
* 鍵值 "tom" 對應變量 cat
* 鍵值 "array" 對應變量 list
*/
context.getVars().put("tom", cat);
context.getVars().put("array", list);
context.getVars().put("map", map);
/*
* 定義要被求值的所有表達式
*/
String[] expressions = new String[]{
//嵌套屬性
"tom.owner",
//嵌套屬性
"tom.owner.name",
//嵌套屬性的方法調用,表達式求值結果為方法返回值
"tom.owner.name.length()",
"array[0].toUpperCase()",
//內置通用方法size(),返回String,Map和List的長度
"size(tom.owner.name)",
//返回列表中第一個元素
"array[0]",
//+ 操作符 可用於字符串的連接
"array[0].toUpperCase()+array[0]",
//內置通用方法empty(),如果為空返回true,否則返回false
"empty(array[0])",
"empty(array[2])",
//通過鍵值 'cat' 獲取字典中相應的值
"map['cat']",
//嵌套屬性
"map['people'].name.length()"
};

//對 expressions 中所有的表達式求值
for(String expression : expressions){
//用ExpressionFactory類的靜態方法createExpression創建一個Expression對象
Expression e = ExpressionFactory.createExpression(expression);
//對這個Expression對象求值,傳入執行JEXL表達式的上下文環境對象
Object obj = e.evaluate(context);
//輸出表達式求值結果
System.out.println(e.getExpression()+" = "+obj);
}
運行結果如下:

 

 

    tom.owner = testJexl.Test_1$1$1@1ffbd68

    tom.owner.name = yang

    tom.owner.name.length() = 4

    array[0].toUpperCase() = HELLO WORLD !

    size(tom.owner.name) = 4

    array[0] = Hello world !

    array[0].toUpperCase()+array[0] = HELLO WORLD !Hello world !

    empty(array[0]) = false

    empty(array[2]) = true

    map['cat'] = testJexl.Test_1$1@179c285

    map['people'].name.length() = 4


---------------------
作者:Towan
來源:CSDN
原文:https://blog.csdn.net/htw2012/article/details/17715587
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM