java jexl_表达式语言引擎:Apache Commons JEXL 2.1 发布

http://www.linuxde.net/2011/12/4348.html

Commons JEXL 2.1 发布了,该版本和 2.0.1 是二进制兼容的,但源码不兼容,因为新增了两个接口:

org.apache.commons.jexl2.Script

org.apache.commons.jexl2.JexlInfo

JEXL 2.1 改进内容:

A more thorough arithmetic (JexlArithmetic) that allows fine control over decimals (scale and precision), a new syntax for numeric literals (OGNL inspired Big and Huge notations) and a better type handling keeping the most appropriate representation in casual operations.

The introduction of script variables and parameters that reduce context dependencies and methods; this allows to perform checks after script creation (light static checking hints). Plus the ability to call script from scripts.

A sandoxing feature to restrict and rename what JEXL can access from the environment allowing tighter control over security.

Extensions to UnifiedJEXL that allow the creation of templates.

完整记录请看:http://commons.apache.org/jexl/changes-report.html#a2.1

JAVA Expression Language (JEXL) 是一个表达式语言引擎,可以用来在应用或者框架中使用。JEXL 受Velocity 和 JSP 标签库 1.1 (JSTL) 的影响而产生的。需要注意的是, JEXL 并不时 JSTL 中的表达式语言的实现。

下载地址:http://commons.apache.org/jexl/download_jexl.cgi

java实现字符串转换成可执行代码

1. http://wiselyman.iteye.com/blog/1677444

2. http://blog.5ibc.net/p/51238.html

使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:

Java代码  bf018c12a8a8e0709a1f6ea2f8e6ea0d.png

import java.util.Map;

import org.apache.commons.jexl2.Expression;

import org.apache.commons.jexl2.JexlContext;

import org.apache.commons.jexl2.JexlEngine;

import org.apache.commons.jexl2.MapContext;

/**

* 动态加载方法

* @author wangyfc

*

*/

public class DyMethodUtil {

public static Object invokeMethod(String jexlExp,Map map){

JexlEngine jexl=new JexlEngine();

Expression e = jexl.createExpression(jexlExp);

JexlContext jc = new MapContext();

for(String key:map.keySet()){

jc.set(key, map.get(key));

}

if(null==e.evaluate(jc)){

return "";

}

return e.evaluate(jc);

}

}

调用方式:

Java代码  bf018c12a8a8e0709a1f6ea2f8e6ea0d.png

Map map=new HashMap();

map.put("testService",testService);

map.put("person",person);

String expression="testService.save(person)";

DyMethodUtil.invokeMethod(expression,map);

java 中使用jexl进行表达式判断http://hi.baidu.com/leezuu/item/2c98397843284a3c6e29f653

使用el在jsp中很方便,那么在java程序中如何实现表达式判断呢,jexl是个不错的选择

Java代码  bf018c12a8a8e0709a1f6ea2f8e6ea0d.png

package jexl.test;

import java.util.List;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

import org.apache.commons.jexl2.JexlContext;

import org.apache.commons.jexl2.JexlEngine;

import org.apache.commons.jexl2.MapContext;

public class Tester {

/**

* @param args

*/

public static void main(String[] args) {

// 描述一个人,他有两条腿

Map person=new HashMap();

person.put("skinColor", "red");  // 皮肤为红色

person.put("age", 23);   // 年龄23

person.put("cash", 60.8);      // 身上有60.8元现金

// 左腿定义

Map leg1=new HashMap();

leg1.put("leftOrRight", "left");  // 左腿

leg1.put("length", 20.3);  // 腿长多少

leg1.put("hair", 3000);  //有多少腿毛

// 右腿定义

Map leg2=new HashMap();

leg2.put("leftOrRight", "right");  // 右腿

leg2.put("length", 20.3);  // 腿长多少

leg2.put("hair", 3050);  //有多少腿毛

// 给他两条腿

List > legs=new ArrayList >();

legs.add(leg1);

legs.add(leg2);

person.put("leg",legs);

// 让这个人变成一个Context,以便Jexl认识他

JexlContext context = new MapContext(person);

JexlEngine engine=new JexlEngine(); // 定义引擎, 1.1与2.1的用法不同,1.1使用的是工厂

// 看看这个人是否年龄在30岁以上,并且身上有超过100元现金

boolean yes=(Boolean)engine.createExpression( "age>30 && cash>100" ).evaluate(context);

System.out.println("年龄在30岁以上,并且身上有超过100元现金?  "+yes);  // 他没有

// 看看这个人是否左腿上有超过2500根汗毛

yes=(Boolean)engine.createExpression( "leg[0].hair>2500" ).evaluate(context);

System.out.println("左腿上有超过2500根汗毛?  "+yes);   // 是的,他有

}

}

结果打印如下

年龄在30岁以上,并且身上有超过100元现金?  false

左腿上有超过2500根汗毛?  true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值