Java 表達式語言 (JEXL)
JEXL 是一個庫,旨在促進動态和腳本功能的實作 用 Java 編寫的應用程式和架構。
做項目遇到需求:
取資料的值做條件判斷,例:if(a>b) ,
但是數和判斷條件全都要從資料庫中取,就變成了這樣
if(a>b){}
if(model.getA() model.getCompare() model.getB()){}
也就是a,b,判斷條件 全都是動态變化的,按上面直接取出來if無法判斷,是以需要jexl
需求:
- a,b,判斷條件全是資料庫的值,實作動态判斷
官方文檔:https://commons.apache.org/proper/commons-jexl/index.html
@Test
void testJexl() {
// 建立或檢索引擎
JexlEngine jexl = new JexlBuilder().create();
// 建立表達式
// 條件判斷耦合寫法
String jexlExp = "a < b";
JexlExpression e = jexl.createExpression( jexlExp );
// 建立上下文并添加資料
JexlContext jc = new MapContext();
jc.set("a", 100);
jc.set("b", 200);
jc.set("<", ">");
// 現在求表達式的值,得到結果
Object o = e.evaluate(jc);
System.out.println(o);
}
按規則 會變成 100 > 200 結果為false,但實際結果為:true
證明a,b可以動态設定,判斷條件無法動态設定,是以改為用String.format格式化表達式
@Test
void testJexl() {
// 建立或檢索引擎
JexlEngine jexl = new JexlBuilder().create();
// 建立表達式
// 條件判斷耦合寫法
// String jexlExp = "a < b";
// 解耦寫法
String jexlExp = String.format("a %s b", "<");
JexlExpression e = jexl.createExpression( jexlExp );
// 建立上下文并添加資料
JexlContext jc = new MapContext();
jc.set("a", 100);
jc.set("b", 200);
// 現在求表達式的值,得到結果
Object o = e.evaluate(jc);
System.out.println(o);
}