Jexl 是一个 Expression Language 的解析引擎, 是为了方便嵌入你的系统或者程序框架的开发中, 他算是实现了 JSTL 中 EL 的延伸版本. 不过也采用了一些 Velocity 的概念. 下面是一个使用Jexl的例子,有详细注释,

import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.jexl.Expression;
import org.apache.commons.jexl.ExpressionFactory;
import org.apache.commons.jexl.JexlContext;
import org.apache.commons.jexl.JexlHelper;

......

/*
* 初始化一个Cat对象
*/
Cat cat = new Cat() {
{
this.setAge(2);
this.setName("Tom");
this.setOwner(new People() {
{
this.setAge(24);
this.setName("yang");
}
});
}
};

/*
* 初始化一个List对象,列表里存入两个元素
* 第一个元素是一个字符串
* 第二个元素是一个整数
*/
List list = new ArrayList();
list.add("Hello world !");
list.add(11);

Map map = new HashMap();
map.put("cat", cat);
map.put("people",cat.getOwner());

/*
* 初始化一个JexlContext对象,它代表一个执行JEXL表达式的上下文环境
*/
JexlContext context = JexlHelper.createContext();

/*
* 向执行JEXL表达式的上下文环境的变量字典中存入两个变量
* 键值 "tom" 对应变量 cat
* 键值 "array" 对应变量 list
*/
context.getVars().put("tom", cat);
context.getVars().put("array", list);
context.getVars().put("map", map);
/*
* 定义要被求值的所有表达式
*/
String[] expressions = new String[]{
//嵌套属性
"tom.owner",
//嵌套属性
"tom.owner.name",
//嵌套属性的方法调用,表达式求值结果为方法返回值
"tom.owner.name.length()",
"array[0].toUpperCase()",
//内置通用方法size(),返回String,Map和List的长度
"size(tom.owner.name)",
//返回列表中第一个元素
"array[0]",
//+ 操作符 可用于字符串的连接
"array[0].toUpperCase()+array[0]",
//内置通用方法empty(),如果为空返回true,否则返回false
"empty(array[0])",
"empty(array[2])",
//通过键值 'cat' 获取字典中相应的值
"map['cat']",
//嵌套属性
"map['people'].name.length()"
};

//对 expressions 中所有的表达式求值
for(String expression : expressions){
//用ExpressionFactory类的静态方法createExpression创建一个Expression对象
Expression e = ExpressionFactory.createExpression(expression);
//对这个Expression对象求值,传入执行JEXL表达式的上下文环境对象
Object obj = e.evaluate(context);
//输出表达式求值结果
System.out.println(e.getExpression()+" = "+obj);
}
运行结果如下:

tom.owner = testJexl.Test_1$1$1@1ffbd68

tom.owner.name = yang

tom.owner.name.length() = 4

array[0].toUpperCase() = HELLO WORLD !

size(tom.owner.name) = 4

array[0] = Hello world !

array[0].toUpperCase()+array[0] = HELLO WORLD !Hello world !

empty(array[0]) = false

empty(array[2]) = true

map['cat'] = testJexl.Test_1$1@179c285

map['people'].name.length() = 4

---------------------
作者:Towan
来源:CSDN
原文:https://blog.csdn.net/htw2012/article/details/17715587
版权声明:本文为博主原创文章,转载请附上博文链接!

一种表达式语言的解析引擎JEXL简单使用的更多相关文章

  1. Struts2的OGNL表达式语言

    一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...

  2. Spring讲解-----------表达式语言

    转自:https://blog.csdn.net/u011225629/article/details/47143083 5.1  概述5.1.1  概述       Spring表达式语言全称为“S ...

  3. Spring表达式语言 之 5.1 概述 5.2 SpEL基础(拾叁)

    5.1  概述 5.1.1  概述 Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts ...

  4. 表达式语言之ongl表达式

    OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方 ...

  5. 开涛spring3(5.1&5.2) - Spring表达式语言 之 5.1 概述 5.2 SpEL基础

    5.1  概述 5.1.1  概述 Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行 ...

  6. JavaWeb框架SSH_Struts2_(四)----->表达式语言OGNL

    1. 表达式语言OGNL OGNL简介 OGNL基本语法 常量 操作符 OGNL表达式 OGNL基础 OGNL上下文 OGNL值栈 OGNL的访问 2. 具体内容 2.1 OGNL简介 OGNL(Ob ...

  7. 【JSP】EL表达式语言

    EL简介 EL语言原本是JSTL1.0中的技术(所以EL和JSTL配合如此亲密和默契也就是自然的了),但是从JSP2.0开始(JSTL1.1)就分离出来纳入了JSP的标准了.因此EL不需要任何jar包 ...

  8. Spring3的表达式语言

    Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言, 能在运行时构建复杂表达式.存取对象图属性. ...

  9. JavaWeb框架_Struts2_(四)----->表达式语言OGNL

      2. 表达式语言OGNL 2.1 OGNL简介 OGNL(Object-Graph Navigation Language)对象图导航语言的缩写,OGNL是一种表达式语言(Expression L ...

随机推荐

  1. 纯css使用线性渐变实现滚动进度条(来自于微信前端早读课)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. nginx代理跨域(mac)

    首先找到nginx.conf文件,修改并添加如下配置 html 文件 <!DOCTYPE html> <html lang="en"> <head&g ...

  3. Redis持久化概念

    redis持久化概念 Author:SimpleWu GitHub-redis 什么是持久化? 概念:把内存的数据保存在磁盘的过程. Redis的持久化? redis是内存数据库,它把数据存储在内存中 ...

  4. MYSQL之 error while loading shared libraries: libtinfo.so.5: cannot open shared objectfile: No such f

    环境:ubuntu18 登陆MYSQL时遇到错误:mysql: error while loading shared libraries: libtinfo.so.5: cannot open sha ...

  5. ubuntu 安装Mysql8.0

    1. 去官网下载安装包 下载链接:点击打开链接 https://dev.mysql.com/downloads/mysql/ 如果你的系统是32位选择第一个,64位选择第二个 也可以用wget 下载 ...

  6. mysql中有多种存储引擎,每种引擎都有自己的特色

    mysql中有多种存储引擎,每种引擎都有自己的特色. 用途: MyISAM:快读, Memory:内存数据, InnoDB:完整的事务支持 锁: MyISAM:全表锁定, Memory:全表锁定, I ...

  7. java----AOP框架理解

    面向切面编程: 通过动态代理+加配置文件 目的解耦 给主逻辑添加一些修饰功能,但是不在主逻辑代码中进行修改,有点类似python中的装饰器,调用方法还是是通过接口的那个类来调用: import jav ...

  8. SPY

    问题 : SPY 时间限制: 1 Sec  内存限制: 128 MB 题目描述 The National Intelligence Council of X Nation receives a pie ...

  9. beego获取用户请求参数的方法

    我们经常需要获取用户传递的数据,包括 Get.POST 等方式的请求,beego 里面会自动解析这些数据,你可以通过如下方式获取数据: GetString(key string) string Get ...

  10. AI-URL注册器

    官方文档地址:https://www.django-rest-framework.org/tutorial/quickstart/#serializers #url生成器生成四个url,就可以访问关于 ...