论坛首页 Java企业应用论坛

表达式引擎JSEL介绍

浏览 18699 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (7)
作者 正文
   发表时间:2010-08-08   最后修改:2010-08-09
表达式引擎的定义这里我就不说了,先假设大家都知道^_^


JSEL之前也出现过不少其他类似产品,包括老牌的Ognl(老到网站都找不到了),新来的MVEL,还有我们国产的Aviator,IKExpression

居然有了这么多可用的实现,那么JSEL的亮点又在那里呢?

基于ECMA262标准的子集
JSEL是一个兼容 JavaScript 运算规则的简单的表达式解释引擎。
支持ECMA标准的运算符、函数库并内置了JSON支持。
基本语法是JavaScript的一个子集,基本语法有良好群众基础。

一个可以完全自定义的表达式系统
全新运算符支持,运算符别名,优先级控制,内置对象设置,等等,一切皆有可能。你完全可以在JSEL基础上DIY一套适合你自己的表达式系统。
详情可参考:http://code.google.com/p/lite/wiki/JSELExtension

执行效率远高于同类
其实,本人在开发过程中,并没有太注重效率,甚至为保持与JavaScript的兼容性,我不得不采用影响性能的设计。
然而,发布出来后,一做性能测试,反成了意外的惊喜。
我将另外撰文列出性能对比的详细数据,精彩稍后继续,不要离开^_^

内置功能强大的JSON解释支持
因为JSEL本身是基于JavaScript规则的,JSON本身就是JavaScript功能的子集,那么JSEL自然也就是一个天然的JSON工具,此外,表达式的编译,本身就继承了JSON解析的功能,而且,我们也吧JSON支持的功能提出为独立的模块,相比官方的JSON解析,JSEL的JSON功能更简单,更有独到的优点【稍后继续补充】

这里也有少许介绍:http://code.google.com/p/lite/wiki/JSON
补充:常见表达式引擎执行性能比较:http://www.iteye.com/topic/732354


不仅是一个表达式
此外JSEL还提供了一些常用的工具支持,如命令行解析器,这是一个在表达式基础上建立起来的功能强大的命令行分析程序,如果你想编写一些基于命令行的工具程序,那么JSEL绝对是您最棒的助手。

该工具的基本用法简介:http://code.google.com/p/lite/wiki/CPEL

背后是一个空前强大的模板系统
JSEL并不是一个为了表达式而编写的表达式引擎,他本来只是Lite模板的一个基本功能,目前Lite模板系统正在做全面重构。这里就先留个悬念吧。以后你会知道的^_^


------------------------------
JSEL基于LGPL开源协议发布,(LiteRT-yyMMdd.jar,与Lite模板运行环境一起打包发布,不足100k),你可以从如下地址下载,并将其功能集成到你的系统中。
http://code.google.com/p/lite/downloads/list
   发表时间:2010-08-09  
关心一下你是如何实现类型转换的。

举例来说,我在页面上有个值,是日期形式表示:2010-08-05,我如何在Java端获取到一个Date对象?能写段Sample程序解释一下嘛?
0 请登录后投票
   发表时间:2010-08-09  
downpour 写道
关心一下你是如何实现类型转换的。

举例来说,我在页面上有个值,是日期形式表示:2010-08-05,我如何在Java端获取到一个Date对象?能写段Sample程序解释一下嘛?



日期类型还没有特别的支持,现在只能当普通JavaBean处理。
因为JSON标准中,并没有日期的定义,所以,这个确实是个麻烦事,特别是序列化的时候,不知道该如何实现,才能既不违反标准,又能相对合理。


java.util.Date实例:
public class JSONDateTest {
	private Date utilDate = new Date(System.currentTimeMillis());
	public Date getUtilDate() {
		return utilDate;
	}
	public void setUtilDate(Date utilDate) {
		this.utilDate = utilDate;
	}
	@Test
	public void test(){
		JSONDecoder decoder = new JSONDecoder(true);
		String result = JSONEncoder.encode(this);
		System.out.println(result);
		JSONDateTest object = decoder.decode(result, this.getClass());
		System.out.println(JSONEncoder.encode(object));
	}

}


{"utilDate":{"date":9,"day":1,"hours":11,"minutes":33,"month":7,"seconds":48,"time":1281324828943,"timezoneOffset":-480,"year":110}}
{"utilDate":{"date":9,"day":1,"hours":11,"minutes":33,"month":7,"seconds":48,"time":1281324828943,"timezoneOffset":-480,"year":110}}

如果是java.sql.Date.因为他的getHours方法,会抛出异常,导致编码的时候会丢失信息,而解码的时候,因为没有默认构造器,所以,也无法正确解码。

这确实是一非常值得改进的地方,下一个版本改进吧,多谢提醒:)
0 请登录后投票
   发表时间:2010-08-09  
downpour 写道
关心一下你是如何实现类型转换的。

举例来说,我在页面上有个值,是日期形式表示:2010-08-05,我如何在Java端获取到一个Date对象?能写段Sample程序解释一下嘛?


下个周末吧日期支持加上去,这确实是我的疏忽。

目前的想法是,遇到Date对象,就按ISO的日期规范( YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)
)直接系列化成字符串,解码的时候,如果遇到目标类型是日期,也先尝试用ISO规范解析。
大家如果有什么想法,欢迎讨论^_^
0 请登录后投票
   发表时间:2010-08-09  
其实我所关心的是,你的这个表达式引擎是否能像OGNL一样做到双向的转化关系,并且包含了类型转换。这个双向的转化关系包括:

1. 字符串 + 表达式 =》Java对象(其中包含了从字符串到Java类型的转换)

2. Java对象 + 表达式 =》字符串表现(其中包含了从Java类型到字符串不同表现形式的转换)

OGNL在这两点上做的很好,只是目前OGNL存在的问题主要在于效率和API的灵活性。

我希望能够看到一个效率远远大于OGNL,但是又不丧失OGNL功能的表达式引擎,最好在API级别,又比较友好,不像OGNL那样有如此多的全局设置。

0 请登录后投票
   发表时间:2010-08-09  
downpour 写道
其实我所关心的是,你的这个表达式引擎是否能像OGNL一样做到双向的转化关系,并且包含了类型转换。这个双向的转化关系包括:

1. 字符串 + 表达式 =》Java对象(其中包含了从字符串到Java类型的转换)

2. Java对象 + 表达式 =》字符串表现(其中包含了从Java类型到字符串不同表现形式的转换)

OGNL在这两点上做的很好,只是目前OGNL存在的问题主要在于效率和API的灵活性。

我希望能够看到一个效率远远大于OGNL,但是又不丧失OGNL功能的表达式引擎,最好在API级别,又比较友好,不像OGNL那样有如此多的全局设置。



OGNL确实很强大,不过API的设计也确实糟糕透了。
JSEL的目标并不是为了复制OGNL的功能,有些功能是否应该添加还是要慎重考虑的。
做的太多了,没准就会接近OGNL的复杂了。

仍外,我们也可以考虑在JSEL基础上衍生出一些子项目,用来满足更独立的功能。
这样,JSEL的设计就可以多考虑一些可扩展性,不必内置太多的功能,以免过于复杂。

关于这里说的双向转换。
1. 字符串 + 表达式 =》Java对象(其中包含了从字符串到Java类型的转换)
这点,JSEL做的是:
变量表+表达式=》Java对象。当能,这里也内置了部分JSON字面量=》Java对象的功能。
2. Java对象 + 表达式 =》字符串表现(其中包含了从Java类型到字符串不同表现形式的转换)
这里,JSEL并没有提供类似OGNL的getAsText的方法,不过JSEL可以自定义对象的成员方法,包括toString,从架构上是可以扩展的,但是,这些功能并没有内置到系统中,如果要实现,还是应该自行封装的。

0 请登录后投票
   发表时间:2010-08-09  
jindw 写道
downpour 写道
其实我所关心的是,你的这个表达式引擎是否能像OGNL一样做到双向的转化关系,并且包含了类型转换。这个双向的转化关系包括:

1. 字符串 + 表达式 =》Java对象(其中包含了从字符串到Java类型的转换)

2. Java对象 + 表达式 =》字符串表现(其中包含了从Java类型到字符串不同表现形式的转换)

OGNL在这两点上做的很好,只是目前OGNL存在的问题主要在于效率和API的灵活性。

我希望能够看到一个效率远远大于OGNL,但是又不丧失OGNL功能的表达式引擎,最好在API级别,又比较友好,不像OGNL那样有如此多的全局设置。



OGNL确实很强大,不过API的设计也确实糟糕透了。
JSEL的目标并不是为了复制OGNL的功能,有些功能是否应该添加还是要慎重考虑的。
做的太多了,没准就会接近OGNL的复杂了。

仍外,我们也可以考虑在JSEL基础上衍生出一些子项目,用来满足更独立的功能。
这样,JSEL的设计就可以多考虑一些可扩展性,不必内置太多的功能,以免过于复杂。

关于这里说的双向转换。
1. 字符串 + 表达式 =》Java对象(其中包含了从字符串到Java类型的转换)
这点,JSEL做的是:
变量表+表达式=》Java对象。当能,这里也内置了部分JSON字面量=》Java对象的功能。
2. Java对象 + 表达式 =》字符串表现(其中包含了从Java类型到字符串不同表现形式的转换)
这里,JSEL并没有提供类似OGNL的getAsText的方法,不过JSEL可以自定义对象的成员方法,包括toString,从架构上是可以扩展的,但是,这些功能并没有内置到系统中,如果要实现,还是应该自行封装的。



如果你的表达式引擎的效率高,并且能满足我上面说的2点,我倒是很乐意把Struts2的OGNL依赖替换掉,使用你的引擎。

待我有时间的时候好好研究一下你的这个表达式引擎再过来讨论。
0 请登录后投票
   发表时间:2010-08-09  
downpour 写道
jindw 写道
downpour 写道
其实我所关心的是,你的这个表达式引擎是否能像OGNL一样做到双向的转化关系,并且包含了类型转换。这个双向的转化关系包括:

1. 字符串 + 表达式 =》Java对象(其中包含了从字符串到Java类型的转换)

2. Java对象 + 表达式 =》字符串表现(其中包含了从Java类型到字符串不同表现形式的转换)

OGNL在这两点上做的很好,只是目前OGNL存在的问题主要在于效率和API的灵活性。

我希望能够看到一个效率远远大于OGNL,但是又不丧失OGNL功能的表达式引擎,最好在API级别,又比较友好,不像OGNL那样有如此多的全局设置。



OGNL确实很强大,不过API的设计也确实糟糕透了。
JSEL的目标并不是为了复制OGNL的功能,有些功能是否应该添加还是要慎重考虑的。
做的太多了,没准就会接近OGNL的复杂了。

仍外,我们也可以考虑在JSEL基础上衍生出一些子项目,用来满足更独立的功能。
这样,JSEL的设计就可以多考虑一些可扩展性,不必内置太多的功能,以免过于复杂。

关于这里说的双向转换。
1. 字符串 + 表达式 =》Java对象(其中包含了从字符串到Java类型的转换)
这点,JSEL做的是:
变量表+表达式=》Java对象。当能,这里也内置了部分JSON字面量=》Java对象的功能。
2. Java对象 + 表达式 =》字符串表现(其中包含了从Java类型到字符串不同表现形式的转换)
这里,JSEL并没有提供类似OGNL的getAsText的方法,不过JSEL可以自定义对象的成员方法,包括toString,从架构上是可以扩展的,但是,这些功能并没有内置到系统中,如果要实现,还是应该自行封装的。



如果你的表达式引擎的效率高,并且能满足我上面说的2点,我倒是很乐意把Struts2的OGNL依赖替换掉,使用你的引擎。

待我有时间的时候好好研究一下你的这个表达式引擎再过来讨论。

JSEL带有设值功能,我也用它来做国类似webwork的servlet 参数=》JavaBean属性的自动转换,如果用它来代替Struts2的OGNL应该也是可行的,只是我工作中不涉及到这块,所以目前还没有尝试。

如果你有兴趣试试的化,欢迎随时交流。
0 请登录后投票
   发表时间:2010-08-09  
强大... 强势关注
0 请登录后投票
   发表时间:2010-08-14   最后修改:2010-08-14
周未用了下
JSEL
发现JSEL对 纯 数学运算 在同类产品中,效率是最高的,
但是在 对象运算中如,  'A' == 'A' || 'B' == 'B' && 'ABCD' == ABCD &&  'A' == 'A' 或其他自定义对象中,效率要比JEXL要低,
希望能改进这方面的算法
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics