1、Mvel简介
MVEL(MVFLEX Expression Language)是一种简单、轻量级的表达式语言,主要用于Java环境。它类似于JSP的EL(Expression Language)和OGNL(Object-Graph Navigation Language),但具有更小的体积和更简单的语法。
MVEL的主要特点包括:
1.轻量级:MVEL的体积小,可以快速集成到项目中。
2.易于使用:其语法直观,易于学习和使用。
3.强大的功能:支持多种类型的表达式,包括算术、逻辑、字符串操作等。
4.集成性:可以与Java环境无缝集成,轻松访问Java对象和方法。
5.性能:MVEL在表达式评估方面通常具有较高的性能。
MVEL常用于以下场景:
- 在应用程序中动态地计算表达式值。
- 在规则引擎中定义和执行业务规则。
- 在模板引擎中动态渲染内容。
使用MVEL时,你可以编写表达式,并使用MVEL引擎来解析和执行这些表达式。例如,你可以编写一个字符串表达式,并将其传递给MVEL引擎进行评估,然后获取结果。
文档:http://mvel.documentnode.com/
2、Mvel使用
2.1、引入maven依赖
1 2 3 4 5
| <dependency> <groupId>org.mvel</groupId> <artifactId>mvel2</artifactId> <version>2.4.14.Final</version> </dependency>
|
2.2、执行表达式
1 2 3 4 5 6 7
| public class MvelTest { public static void main(String[] args) { String expression = "2 + 3 * 4"; Object result = MVEL.eval(expression); System.out.println("Result: " + result); } }
|
2.3、使用变量
1 2 3 4 5 6 7 8 9 10
| public class MvelTest { public static void main(String[] args) { String expression = "x + y"; Map<String, Integer> variables = new HashMap<>(4); variables.put("x", 2); variables.put("y", 3); Object result = MVEL.eval(expression, variables); System.out.println("Result: " + result); } }
|
2.4、使用if-else语句
1 2 3 4 5 6 7 8 9 10
| public class MvelTest { public static void main(String[] args) { String expression = "if (x > y) { x } else { y }"; Map<String, Object> variables = new HashMap<>(4); variables.put("x", 2); variables.put("y", 3); Object result = MVEL.eval(expression, variables); System.out.println("Result: " + result); } }
|
2.5、使用foreach语句
1 2 3 4 5 6 7 8 9
| public class MvelTest { public static void main(String[] args) { String expression = "foreach (item : list) { System.out.print(item) }"; Map<String, Object> variables = new HashMap<>(2); variables.put("list", Arrays.asList(1, 2, 3, 4, 5)); Object result = MVEL.eval(expression, variables); System.out.println("Result: " + result); } }
|
2.6、使用对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public class MvelTest { public static void main(String[] args) { String expression = "person.name + ' ' + person.age"; Map<String, Object> variables = new HashMap<>(2); variables.put("person", new Person("John", 30)); Object result = MVEL.eval(expression, variables); System.out.println("Result: " + result); }
private static class Person {
private String name; private int age;
public Person(String name, int age) { this.name = name; this.age = age; }
public String getName() { return name; }
public int getAge() { return age; } } }
|
2.7、使用集合
1 2 3 4 5 6 7 8 9 10 11 12
| public class MvelTest { public static void main(String[] args) { String expression = "list.size()"; Map<String, Object> variables = new HashMap<>(2); List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); variables.put("list", list); Object result = MVEL.eval(expression, variables); System.out.println("Result: " + result); } }
|
2.8、使用函数
1 2 3 4 5 6 7 8 9 10 11
| public class MvelTest { public static void main(String[] args) { String expression = "Math.pow(x, y)"; Map<String, Object> variables = new HashMap<>(); variables.put("x", 2); variables.put("y", 3); Object result = MVEL.eval(expression, variables); System.out.println("Result: " + result); } }
|
2.9、使用自定义函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class MvelTest { public static void main(String[] args) { String expression = "myFunction(x, y)"; Map<String, Object> variables = new HashMap<>(); variables.put("x", 2); variables.put("y", 3); variables.put("myFunction", new MyFunction()); Object result = MVEL.eval(expression, variables); }
private static class MyFunction { public double myFunction(double x, double y) { return Math.pow(x, y); } } }
|
2.10、使用自定义类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class MvelTest { public static void main(String[] args) { String expression = "cn.river.base.mvel.StringUtils.reverse(s)"; Map<String, Object> variables = new HashMap<>(); variables.put("s", "Hello, World!"); Object result = MVEL.eval(expression, variables); System.out.println("Result: " + result); } }
public class StringUtils { public static String reverse(String s) { return new StringBuilder(s).reverse().toString(); } }
|
2.11、编译表达式
1 2 3 4 5 6 7 8 9 10 11
| public class MvelTest { public static void main(String[] args) { String expression = "x + y"; Map<String, Object> variables = new HashMap<>(4); variables.put("x", 2); variables.put("y", 3); Serializable serializable = MVEL.compileExpression(expression); Object result = MVEL.executeExpression(serializable, variables); System.out.println("Result: " + result); } }
|
MVEL.compileExpression(string)是将表达式编译成mvel可执行的内容,然后通过MVEL.executeExpression(expression)执行。
编译后的表达式可以缓存起来,下次直接执行,减少编译时间,提升性能。