当前位置: 首页 > 工具软件 > Commons EL > 使用案例 >

java中使用 commons-jexl3 和 jsel 的实例

田丰
2023-12-01

标题中提到的这两个都是表达式引擎。
据我个人的感觉和理解差不多是同样的东西,但究竟谁好谁差,好在哪差在哪我也不清楚。
不过我都亲测成功了,基本的还是可用的。
这样的库,可以用来实现一些规则非常复杂的功能。

好比公司里有很多的销售,销售每个月要卖出各种课程内容,有的全价售出,有的打了折扣,有的退费了,有的部分退费了,有的顺利开课,有的费了很大成本才完成了一单,有的利润高,有的利润低,有的用了优惠券,有的没有……
最终,每个月要根据多种指标计算销售的业绩。
如:可能同时生效的有这些规则:

  • 月销售额在2W以下的,只有基本工资;2-3W的,2W以上部分1.5倍提成;3W以上的,2倍提成。
  • 当月退费的,业绩扣减;下月或以后退费的,在退费的月份里扣减业绩
  • 使用了优惠券的订单,计算业绩的数值为 未使用优惠券的金额 + 优惠券的金额的一半
  • 9折以上售出的课程,满额计算业绩;9折以下的课程,计算业绩的数值为折后金额
  • ……

总之,因业务而不同,规则可能非常复杂且多变,多种组合,甚至自己需要配置多种表达式。
类似 var monthlyMoney = a + 0.8 * b + 0.65 c + ....... //其中有很复杂的业务和变量
这时候使用表达式引擎就非常合适了。


以下是我自己的一个小demo,亲测有效,是一个简单的maven控制台项目。
上一部分关键代码。

maven依赖

<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.4.3</version>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-jexl3</artifactId>
        <version>3.1</version>
    </dependency>

    <dependency>
        <groupId>org.xidea</groupId>
        <artifactId>jsel</artifactId>
        <version>0.1.0</version>
    </dependency>
</dependencies>

代码:
Main方法

package com.codejam.el.console;

import com.codejam.el.console.jexl.JexlTest;
import com.codejam.el.console.jsel.JselTest;

public class ElStarter {

    public static void main(String[] args) {

        System.out.println("El console start up done.");

        //JselTest.Test1();

        JexlTest.Test1();


        System.out.println("El console start up done.==============");
    }
}


Jexl3 库
即依赖:

 <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-jexl3</artifactId>
    <version>3.1</version>
</dependency>
package com.codejam.el.console.jexl;

import org.apache.commons.jexl3.JexlBuilder;
import org.apache.commons.jexl3.JexlContext;
import org.apache.commons.jexl3.JexlExpression;
import org.apache.commons.jexl3.MapContext;

public class JexlTest {

    public static void Test1() {
        JexlContext jexlContext = new MapContext();

        jexlContext.set("var1", 1);
        jexlContext.set("var2", 2);

        JexlBuilder builder = new JexlBuilder();
        JexlExpression expression = builder.create().createExpression("var1 + 2 * var2");

        Object evaluate = expression.evaluate(jexlContext);


        System.out.println("evaluate  " + evaluate.toString());

    }
}

Jsel 库
即依赖:

 <dependency>
     <groupId>org.xidea</groupId>
     <artifactId>jsel</artifactId>
     <version>0.1.0</version>
 </dependency>
package com.codejam.el.console.jsel;

import org.xidea.el.Expression;
import org.xidea.el.impl.ExpressionImpl;

import java.util.HashMap;

public class JselTest {

    public static void Test1(){

        Expression el = new ExpressionImpl("var1 + 2 * var2");
        HashMap context = new HashMap();

        context.put("var1",111);
        context.put("var2",2);

        Object evaluate = el.evaluate(context);

        System.out.println("evaluate = " + evaluate.toString());

        System.out.println("var1 = " + context.get("var1"));
        System.out.println("var2 = " + context.get("var2"));


        context.put("var2",3);

        System.out.println("var1 = " + context.get("var1"));
        System.out.println("var2 = " + context.get("var2"));

        System.out.println("evaluate2 = " + el.evaluate(context).toString());
    }
}

最后,上demo地址,亲测成功@2021年3月16日00点00分。

https://gitee.com/festone/java-el-demo

 类似资料: