设为首页 收藏本站
查看: 725|回复: 0

[经验分享] 表达式语言引擎:Apache Commons JEXL 2.1 发布

[复制链接]

尚未签到

发表于 2017-1-10 06:34:56 | 显示全部楼层 |阅读模式
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可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:
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<String,Object> 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);  
}  
}  
调用方式:
Map<String,Object> map=new HashMap<String,Object>();  
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是个不错的选择
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<String, Object> person=new HashMap<String, Object>();
person.put("skinColor", "red");  // 皮肤为红色
person.put("age", 23);   // 年龄23
person.put("cash", 60.8);      // 身上有60.8元现金
// 左腿定义
Map<String, Object> leg1=new HashMap<String, Object>();
leg1.put("leftOrRight", "left");  // 左腿
leg1.put("length", 20.3);  // 腿长多少
leg1.put("hair", 3000);  //有多少腿毛
// 右腿定义
Map<String, Object> leg2=new HashMap<String, Object>();
leg2.put("leftOrRight", "right");  // 右腿
leg2.put("length", 20.3);  // 腿长多少
leg2.put("hair", 3050);  //有多少腿毛
// 给他两条腿
List<Map<String, Object> > legs=new ArrayList<Map<String, Object> >();
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
上面的例子,如果不知道哪条是左腿呢,这样的表达式该如何写? leg[leftOrRight='left'].hair>2500 ?
这个写法不会报错,但结果不正确,不知如何实现,求答复

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-326144-1-1.html 上篇帖子: 使用apache重写,一个空间上放多个应用 下篇帖子: Apache CXF实战之七 使用Web Service传输文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表