专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
程序员的那些事  ·  一个国外小老头,用被淘汰的编程工具,开发了一 ... ·  3 天前  
OSC开源社区  ·  35岁草根程序员下桌,去另一个赛道写“Hel ... ·  2 天前  
OSC开源社区  ·  重逢动感时光,开源中国「动弹」焕新归来 ·  5 天前  
程序猿  ·  Elasticsearch开源仓库404,7 ... ·  6 天前  
程序猿  ·  特殊的岗位招聘 ·  1 周前  
51好读  ›  专栏  ›  OSC开源社区

JFina 3.0 “重新定义的模板引擎”与 Beetl 的功能对比

OSC开源社区  · 公众号  · 程序员  · 2017-01-24 08:36

正文


摘要: 本文比较了JFina3.0新的模板引擎功能与Beetl的功能


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年就有的功能了,如

 user可以为null,也可以不存在,安全调用也可以用在循环里

如果userList 不存在,或者为null,则进入elsefor

消灭插值指令?


这个观点觉得比较奇怪,大部分模板语言都具备定界符和占位符里的表达式一致,不知道为啥会把这个特性单独拿到Jfinal里说,如上面的例子,在Beetl占位符里,也是一样的

消灭 macro 指令?


任何语言,都得考虑到如何重用,对于模板语言,重用模板非常重要,macro 只是重用的一种方式,无论你用何种技术,都是重用的马甲而已,看看Beetl如何重用的,

类似macro,比如标签,beetl支持俩种标签,标签函数和html标签,比如类似下面的模板片段

这是一个类似html的重用,很适合模板渲染,以及CMS里自定义标签。而其实现方式非常简单,创建一个位于htmltag/my/output.tag 实现就可以了,实质也是个模板片段

再比如模板变量

上面代码定义了一个变量,值为模板的输出,因此,你可以在任何调用这个变量来计算,渲染从而达到重用。此特性用于复杂的布局方式,如继承布局

JFinal 的独创特性


JFinal 手册里还提供一些独创特性,在我看来,Beetl至少早就有了,比如Jfinal里提到能修改语法树节点的实现(其目的是能用在sql片段里输出的是sql占位符号?),这个Beetl2011年就有,并且,Beetl的在线体验就是这样,其在线体验网站运行已经多达90万次。比如,当你输入如下代码

实际上,只运行了5次循环就退出了,并给与警告,这是因为Beetl引擎修改了While的语法执行实现,发现循环超过5次就退出了。 BeetlSql也利用了Beetl的引擎这个特点,在sql输出的时候,不是输出内容,而是输出?,如下beetlsql片段

实际上,beetl模板渲染后,输出的是

这也是因为beetl引擎能修改语法节点的实现,这个技术从2012年就有的,我一直认为在Jfinal3出来之前,Beetl才是真正的独创并引领这个潮流

总结


总的来说,我看来JFinal Template 并没有给模板引擎带来多少新的东西,这点不如Beetl,比如Beetl很多功能,我看目前JFinal Template并不具备

  1.  html标签重用,类似

  2. 带绑定变量的标签,这个freemaker有,beetl也有,用在cms很多

  3. 自定义占位符号和定界符,很多人喜欢beetl这一特性

  4. 本地调用安全管理,beetl在线体验也具备这个功能,不知道jfinal是否也具备?如果不具备,那用户如果输入@System.exit(),系统就得宕机了

  5. 语法节点实现修改,如上所述,这也是beetlsql实现基础

  6. 虚拟属性实现

  7. 自定义函数和格式化函数

  8. MVC 分层开发实现,前端开发者可以专注于前端开发

  9. 流行框架的集成

  10. 更多的语法特性,如for in ,for(exp;exp;exp),while,适应各种应用场景

  11. 国内外多个性能评测前茅

还有更多的特性没有一一列举,Beetl在国内早已经很流行,无论是大型互联网公司,还是大型传统企业应用,还是小型创业网站和应用,都广泛的使用Beetl&BeetlSql。本文并非想借此推广Beetl,只是觉得同样作为开源使用者,在确定使用某个开源产品之前,需要分析一下,而不是仅仅看宣传语。俗话说的好,不看广告看疗效,希望借此给犹豫不决的模板使用者一个客观参考。




推荐阅读

免费个人博客搭建教程详解:Hexo+OSChina

程序员排行榜:测测你的码力值,2016年击败了全国多少工程师?

羽毛也疯狂,盘点 Apache 最新毕业的11个顶级项目

2016 年度开源中国新增开源软件排行榜 TOP 100

2016 年度最受欢迎中国开源软件 TOP 20

点击“阅读原文”查看更多精彩内容