一种表达式语言的解析引擎JEXL简单使用
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简单使用的更多相关文章
- Struts2的OGNL表达式语言
		一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ... 
- Spring讲解-----------表达式语言
		转自:https://blog.csdn.net/u011225629/article/details/47143083 5.1 概述5.1.1 概述 Spring表达式语言全称为“S ... 
- Spring表达式语言 之 5.1 概述 5.2 SpEL基础(拾叁)
		5.1 概述 5.1.1 概述 Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts ... 
- 表达式语言之ongl表达式
		OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方 ... 
- 开涛spring3(5.1&5.2) - Spring表达式语言 之 5.1 概述 5.2 SpEL基础
		5.1 概述 5.1.1 概述 Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行 ... 
- JavaWeb框架SSH_Struts2_(四)----->表达式语言OGNL
		1. 表达式语言OGNL OGNL简介 OGNL基本语法 常量 操作符 OGNL表达式 OGNL基础 OGNL上下文 OGNL值栈 OGNL的访问 2. 具体内容 2.1 OGNL简介 OGNL(Ob ... 
- 【JSP】EL表达式语言
		EL简介 EL语言原本是JSTL1.0中的技术(所以EL和JSTL配合如此亲密和默契也就是自然的了),但是从JSP2.0开始(JSTL1.1)就分离出来纳入了JSP的标准了.因此EL不需要任何jar包 ... 
- Spring3的表达式语言
		Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言, 能在运行时构建复杂表达式.存取对象图属性. ... 
- JavaWeb框架_Struts2_(四)----->表达式语言OGNL
		2. 表达式语言OGNL 2.1 OGNL简介 OGNL(Object-Graph Navigation Language)对象图导航语言的缩写,OGNL是一种表达式语言(Expression L ... 
随机推荐
- yum -y 与yum有何区别(转载)
			在linux中,经常使用yum来进行软件的安装,更新与卸载,那我们会发现,在使用yum的时候,通常有下面两种指令模式: ①yum install xxx ②yum -y install ... 
- usrp-B210
			sudo add-apt-repository ppa:ettusresearch/uhd sudo apt-get update sudo apt-get install libuhd-dev li ... 
- 初始Ajax
			一.Ajax准备知识:json 说起json,我们大家都了解,就是python中的json模块,那么json模块具体是什么呢?那我们现在详细的来说明一下 1.json(Javascript Obie ... 
- 【python】安装hyperscan-python
			环境centos6.2 1. 先安装hyperscan 主要参考http://blog.csdn.net/cheng_fangang/article/details/51143412 注意:里面2.8 ... 
- 51nod1158 最大子矩形 单调栈应用
			#include<iostream> #include<cstring> #include<cstdio> using namespace std; ][6],m, ... 
- Selenium CSS定位语法
			大部分人在使用selenium定位元素时,用的是xpath定位,因为xpath基本能解决定位的需求.css定位往往被忽略掉了,其实css定位也有它的价值,css定位更快,语法更简洁.这一篇css的定位 ... 
- jQuery中的extend()方法
			通常我们使用jquery的extend时,大都是为了实现默认字段的覆盖,即若传入某个字段的值,则使用传入值,否则使用默认值.如下面的代码: function getOpt(option){ var _ ... 
- C#学习-索引器
			当一个类包含数组成员时,索引器的使用将大大地简化对类中数组成员的访问. 索引器的定义类似于属性,也具有get访问器和set访问器,以下是 [修饰符] 数据类型 this [索引类型index] { g ... 
- curl请求https请求
			function curl_https($url,$data){ $ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, $url ); curl_se ... 
- select2插件 多选框动态初始化值
			转自https://blog.csdn.net/yiyiwyf/article/details/53521980 上一篇讲了select2的多选和大标题设置. 这周做到了修改的功能,需要将旧数据的选项 ... 
