一、名词解释
1.JexlExpression与JexlScript的区别
1)JexlExpression 这些是JexlEngine表达式的最基本形式,只允许执行单个命令并返回其结果。如果您尝试使用多个命令,它会忽略第一个分号后的所有内容,只返回第一个命令的结果。
另请注意,表达式不是语句(这是脚本的组成部分),并且不允许使用流控制(if,while,for),变量或lambdas语法元素。
2)JexlScript 这些允许您使用多个语句,您可以使用变量赋值,循环,计算等。或多或少可以在Shell或JavaScript的基本级别实现。从脚本返回最后一个命令的结果。
2.简单示例
在最简单的形式中,JEXL 在评估表达式时将a JexlExpression 与a 合并 JexlContext。使用JexlEngine.createExpression(java.lang.String)传递包含有效JEXL语法的String 创建表达式 。可以使用MapContext实例创建简单的JexlContext ; 可以通过其构造函数选择提供内部包装的变量映射。以下示例采用名为“car”的变量,并在属性“engine”上调用checkStatus()方法 //创建一个JexlEngine(可以重用一个)
JexlEngine jexl = new JexlBuilder().create();
// Create an expression object equivalent to 'car.getEngine().checkStatus()':
String jexlExp = "car.engine.checkStatus()";
Expression e = jexl.createExpression( jexlExp );
// The car we have to handle coming as an argument...
Car car = theCarThatWeHandle;
// Create a context and add data
JexlContext jc = new MapContext();
jc.set("car", car );
// Now evaluate the expression, getting the result
Object o = e.evaluate(jc);
二、jexl工具类
public class JexlUtil {
private static JexlEngineengine;
private JexlUtil() {
}
private static JexlEngine getJexlEngine() {
if (engine ==null) {
synchronized (JexlUtil.class) {
if (engine ==null) {
engine =new JexlBuilder().create();
}
}
}
return engine;
}
public static Object execute(String expression, JexlContext context) {
JexlEngine jexlEngine =getJexlEngine();
JexlScript script = jexlEngine.createScript(expression);
return script.execute(context);
}
}