天天看點

jexl簡單使用

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);
}