Java Expression Language (JEXL) 是一个表达式语言引擎,可以用来在应用或者框架中使用。虽然Jexl受JSP标签库(JSTL)的影响产生的,但不是JSTL中表达式语言的实现。
Jexl表达式引擎可以应用在许多场景下,比如:校验数据,解析模板等
1.表达式为列表(数组)时`
public static void main(String args[]){
JexlEngine engine = new JexlEngine();//创建表达式引擎对象
JexlContext context = new MapContext();//创建Context设值对象
String expressionStr = "array.size()";//表达式,表达式可以是数组的属性,元素等
List<Object> array = new ArrayList<Object> ();//创建一个列表
array.add("this is an array");
array.add(new Integer(2));
context.set("array",array);//使用context对象将表达式中用到的值设置进去,必须是所有用到的值
Expression expression = engine.createExpression(expressionStr)://使用引擎创建表达式对象
Object o = expression.evaluate(context);//使用表达式对象开始计算
System.out.println(o);//输出:2
}
2.表达式为语句块时
JexlEngine engine = new JexlEngine();//创建表达式引擎对象
JexlContext context = new MapContext();//创建Context设值对象
String expressionStr = "if(a>b){c=a;}else{c=b};";//表达式,表达式为逻辑语句
context.set("a", 1);
context.set("b", 2);
Expression expression = engine.createExpression(expressionStr);//使用引擎创建表达式对象
Object o = expression.evaluate(context);//使用表达式对象开始计算
System.out.println(o);//输出:2
expressionStr = "while(a<b){a=a+b;}";
expression = engine.createExpression(expressionStr);//使用引擎创建表达式对象
o = expression.evaluate(context);//使用表达式对象开始计算
System.out.println(o);//输出:3
如上,当表达式为语句块时,经常用在数据校验,当然表达式比现在例子复杂的多。
3.当表达式为调用方法时
JexlEngine engine = new JexlEngine();//创建表达式引擎对象
JexlContext context = new MapContext();//创建Context设值对象
String expressionStr = "person.getInfo()";//表达式,表达式为对象调用方法,当然也可以是类调用方法
Person person = new Person("hliu","M");
context.set("person", person);
Expression expression = engine.createExpression(expressionStr);//使用引擎创建表达式对象
Object o = expression.evaluate(context);//使用表达式对象开始计算
//输出:hliu+M
expressionStr = "System.out.println("123123");";//表达式为类调用方法
expression = engine.createExpression(expressionStr);//使用引擎创建表达式对象
o = expression.evaluate(context);//使用表达式对象开始计算
//输出:123123
Person类
public class Person{
private String name;
private String sex;
public Person(String name,String sex){
this.name=name;
this.sex = sex;
}
public String getInfo(){
return this.name+"+"+this.sex;
}
}
如果类不声明为Public(公开),引擎会找不到该类。
- 使用Jexl准备工作
1.common-jexl2_1.jar
2.如果使用Maven使用如下依赖
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-jexl3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jexl3</artifactId>
<version>3.0</version>
</dependency>
今天只是介绍的jexl少数但是比较常用的几种用法,我会在之后的文章中陆续介绍jexl的其他用法以及应用实现。`