Solon v3.3.0

SnEL 表达式语法和能力说明

</> markdown

1、SnEL 接口说明

接口描述
SnEL.parse(...)解析求值表达式
SnEL.eval(...)评估求值表达式
SnEL.parseTmpl(...)解析模板表达式
SnEL.evalTmpl(...)评估模板表达式

2、语法与能力说明

能力示例备注
支持常量获取1, 'name', true, [1,2,3]数字、字符串、布尔、数组
支持变量获取name
支持字典获取map['name']
支持集合获取list[0]
支持对象属性或字段获取user.name, user['name']支持.[]
支持对象方法获取order.getUser(), list[0].getUser().getName()支持多级嵌套
支持对象静态方法获取Math.add(1, 2), Math.add(a, b)支持多级嵌套
支持优先级小括号(, )
支持算数操作符+, -, *, /, %加,减,乘,除,模
支持比较操作符<, <=, >, >=, ==, !=结果为布尔
支持like操作符LIKE, NOT LIKE(在相当于包含)结果为布尔
支持in操作符IN, NOT IN结果为布尔
支持三元逻辑操作符conditionExpr ? trueExpr: falseExpr
支持二元逻辑操作符AND, OR与,或(兼容 &&||
支持一元逻辑操作符NOT非(兼容 !

虚拟变量(root)说明:

当使用 StandardContext 上下文时,支持 root 虚拟变量(SnEL.eval("root == true", new StandardContext(true))

关键字须使用全大写(未来还可能会增多):

LIKE, NOT LIKE, IN, NOT IN ,AND, OR ,NOT

数据类型与符号说明:

1.1F(单精度)、1.1D(双精度)、1L(长整型)。1.1(双精度)、1(整型)

预留特殊符号:

#{ }, ${ }

3、表达式示例

  • 常量与算数表达式
System.out.println(SnEL.eval("1"));
System.out.println(SnEL.eval("-1"));
System.out.println(SnEL.eval("1 + 1"));
System.out.println(SnEL.eval("1 * (1 + 2)"));
System.out.println(SnEL.eval("'solon'"));
System.out.println(SnEL.eval("true"));
System.out.println(SnEL.eval("[1,2,3,-4]"));
  • 变量,字典,集合获取
Map<String, String> map = new HashMap<>();
map.put("code", "world");

List<Integer> list = new ArrayList<>();
list.add(1);

Map<String, Object> context = new HashMap<>();
context.put("name", "solon");
context.put("list", list);
context.put("map", map);

System.out.println(SnEL.eval("name.length()", context)); //顺便调用个函数
System.out.println(SnEL.eval("name.length() > 2 OR true", context)); 
System.out.println(SnEL.eval("name.length() > 2 ? 'A' : 'B'", context)); 
System.out.println(SnEL.eval("map['code']", context));
System.out.println(SnEL.eval("list[0]", context));
System.out.println(SnEL.eval("list[0] == 1", context));
  • 带优先级的复杂逻辑表达式
Map<String, Object> context = new HashMap<>();
context.put("age", 25);
context.put("salary", 4000);
context.put("isMarried", false);
context.put("label", "aa");
context.put("title", "ee");
context.put("vip", "l3");

String expression = "(((age > 18 AND salary < 5000) OR (NOT isMarried)) AND label IN ['aa','bb'] AND title NOT IN ['cc','dd']) OR vip=='l3'";
System.out.println(SnEL.eval(expression, context));
  • 静态函数调用表达式
Map<String, Object> context = new HashMap<>();
context.put("Math", Math.class);
System.out.println(SnEL.eval("Math.abs(-5) > 4 ? 'A' : 'B'", context));

4、嵌入对象(仅为示例)

Map<String, Object> context = new HashMap<>();
context.put("Solon", Solon.class);
context.put("_sysProps", Solon.cfg()); //顺便别的对象(供参考)
context.put("_sysEnv", System.getenv());

//顺便用三元表达式,模拟下 if 语法
String expr = "Solon.cfg().getInt('demo.type', 0) > _sysProps.getInt('') ? Solon.context().getBean('logService').log(1) : 0";
System.out.println(SnEL.eval(expr, context));

5、模板表达式

占位符说明

接口描述
#{...}求值表达式占位符
${..}${...:def}属性表达式占位符

应用示例

Map<String, Object> data = new HashMap<>();
data.put("a", 1);
data.put("b", 1);

StandardContext context = new StandardContext(data);
context.properties(Solon.cfg()); //绑定应用属性,支持 ${表过式}

SnEL.evalTmpl("sum val is #{a + b},  c prop is ${demo.c:c}");