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