JFinal3.0出来模板引擎功能,看了一下介绍和下载demo看了一下,发现体积增加了不少,貌似为了一个模板引擎,jfinal已经体积增长到800K,这与Jfinal早期宣称的200k大小差别已经很大了,为了一个模板引擎,投入这么大体积,是否值的的呢,我作为Beetl和BeetlSql的作者看来,这是必然的。模板引擎实际上是一门语言,是一个基础技术,可以作为视图渲染,规则解释,Sql模板片段等很多地方。以Beetl为例,曾用在baidu金融网站页面渲染,58某系统的的邮件模板,京东的某系统功能规则解释,也是BeetlSql的基础。Jfina如果想要把Sql像BeetlSql那样放到文件里管理,必然要用到模板技术。回头看看Mybatis,由于用了xml解析和OGNL表达式,没有使用模板引擎,导致XML管理各种问题,我在文章比较Hibernate,MyBatis,BeetlSql做曾对此做过说明
言归正传,对于JFinal宣称重新定义了模板引擎,我并不认同其文章说明的观点,觉得有很多地方说的不正确
对于Antlr否定: Antlr 是一个语法解析工具,已经用在很多开源产品里,比如hiberante,Google系列多款开源,还有Beetl实现。Antlr作者是美国大学教授,Terence Parr,其实现Antlr用了前后30年时间,也许Antlr初学者觉得其体积稍微大了,但毫无疑问,其功能是可靠稳定的,性能也非常好,同时,Antlr还能生成各种目标语言,比如Java,Python,GO,JS等,毫不夸张的说,只要我有愿意,Beetl&BeetSql 可以不仅仅依托于Java本生
JFinal3.0 宣称Antlr不可靠,无法调试,我很不理解,不着他们在使用过程中出了什么问题,国内有个Antlr群,以前我曾经是群版主,经常回答一些antlr入门知识,未见到有人如此反馈过问题
所谓的独创词法分析算法: 语言解析技术已经至少50年了,这方面已经非常成熟,我没想到目前还有独创空间,我觉得能否衡量此成果,还得看是否能应用到多个场景里,如果仅仅是极简版词法分析,那就没有意义了,另外,可以请 王垠这样的大神来评估一下,王垠无疑是这方面权威,而且见多识广,善于批判
在看看提到的一些功能特性,我觉得并非如此,比如
独创空合安全取值调用操作符?:这个功能很多模板引擎都有,Beetl也有,这个从2011年就有的功能了,如
var a = user.name!"default";
var b = user.name!""
user可以为null,也可以不存在,安全调用也可以用在循环里
for(user in userList!){
var index = userLP.index;
....
}elsefor{
}
如果userList 不存在,或者为null,则进入elsefor
消灭插值指令?:这个观点觉得比较奇怪,大部分模板语言都具备定界符和占位符里的表达式一致,不知道为啥会把这个特性单独拿到Jfinal里说,如上面的例子,在Beetl占位符里,也是一样的
${user.name!"default"}
${user.name!""}
消灭 macro 指令?, 任何语言,都得考虑到如何重用,对于模板语言,重用模板非常重要,macro 只是重用的一种方式,无论你用何种技术,都是重用的马甲而已,看看Beetl如何重用的,
类似macro,比如标签,beetl支持俩种标签,标签函数和html标签,比如类似下面的模板片段
<my:output attr="name" content="${list.content}"/>
这是一个类似html的重用,很适合模板渲染,以及CMS里自定义标签。而其实现方式非常简单,创建一个位于htmltag/my/output.tag 实现就可以了,实质也是个模板片段
再比如模板变量
@var template = {
<div>${a}</div>
@}
上面代码定义了一个变量,值为模板的输出,因此,你可以在任何调用这个变量来计算,渲染从而达到重用。此特性用于复杂的布局方式,如继承布局
JFinal手册里还提供一些独创特性,在我看来,Beetl至少早就有了,比如Jfinal里提到能修改语法树节点的实现(其目的是能用在sql片段里输出的是sql占位符号?),这个Beetl2011年就有,并且,Beetl的在线体验就是这样,其在线体验网站运行已经多达90万次。比如,当你输入如下代码
while(true){
print("搞死在线体验");
}
实际上,只运行了5次循环就退出了,并给与警告,这是因为Beetl引擎修改了While的语法执行实现,发现循环超过5次就退出了。 BeetlSql也利用了Beetl的引擎这个特点,在sql输出的时候,不是输出内容,而是输出?,如下beetlsql片段
select * from user where id=#id#
实际上,beetl模板渲染后,输出的是
select * from user where id=?
这也是因为beetl引擎能修改语法节点的实现,这个技术从2012年就有的,我一直认为在Jfinal3出来之前,Beetl才是真正的独创并引领这个潮流
总的来说,我看来JFinal Template 并没有给模板引擎带来多少新的东西,这点不如Beetl,比如Beetl很多功能,我看目前JFinal Template并不具备
- html标签重用,类似<my:tag ...>
- 带绑定变量的标签,这个freemaker有,beetl也有,用在cms很多
- 自定义占位符号和定界符,很多人喜欢beetl这一特性
- 本地调用安全管理,beetl在线体验也具备这个功能,不知道jfinal是否也具备?如果不具备,那用户如果输入@System.exit(),系统就得宕机了
- 语法节点实现修改,如上所述,这也是beetlsql实现基础
- 虚拟属性实现
- 自定义函数和格式化函数
- MVC 分层开发实现,前端开发者可以专注于前端开发
- 流行框架的集成
- 更多的语法特性,如for in ,for(exp;exp;exp),while,适应各种应用场景
- 国内外多个性能评测前茅
还有更多的特性没有一一列举,Beetl在国内早已经很流行,无论是大型互联网公司,还是大型传统企业应用,还是小型创业网站和应用,都广泛的使用Beetl&BeetlSql。本文并非想借此推广Beetl,只是觉得同样作为开源使用者,在确定使用某个开源产品之前,需要分析一下,而不是仅仅看宣传语。俗话说的好,不看广告看疗效,希望借此给犹豫不决的模板使用者一个客观参考