论坛首页 Java企业应用论坛

beetl功能与Freemarker功能比较

浏览 4088 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-07-01   最后修改:2012-07-01

beetl(http://beetl.sourceforge.net/)好不好,先比一下功能,拿目前最流行的Freemarker来做比较


完全参考了
Freemarker 官方文档( 2.3.19 第一列是freemarker官方文档目录,第二列是表示 beetl 中是否具有同样的功能

通过下列表格,可以看出绝大部分功能, beetl 都是支持的


 

功能

是否支持

备注

1.1 简介

支持

 

1.2 模板 + 数据模型 = 输出

支持

 

1.3 数据模型一览

支持

 

1.4.1 简介

支持

 

1.4.2 (.1--.4) 指令示例

支持

Beetl 中,采用includeFileTemplate 标签来include 一个文件。Beetl 中还支持switch/case

1.4.2.5 处理不存在的变量

支持

不支持询问变量是否存在, 但可以通过扩展函数来支持

2.1 基本内容

支持

 

2.2.1 类型 简介

大部分支持

很少使用的节点类型 不支持

2.2.2 标量

支持

 

2.2.3 容器

支持

 

2.2.4 方法和函数

支持

可以通过扩展函数来间接支持

2.2.5 其它(节点类型)

不支持

 

3.1 总体结构

支持

 

3.2 指令

支持

 

3.3 表达式

支持

集合操作不支持,但可以通过扩展函数来实现集合操作。

截取字符串也不是内置的,但可以通过扩展函数来实现,如str.subString

3.3.3.1 字符串

支持

 

3.3.3.2 数字

支持

 

3.3.3.3 布尔值

支持

 

3.3.3.4 序列

支持

采用js 语法的json 格式支持。但不包括支持 start ..end 这样的方式

3.3.3.5 哈希表

支持

 

3.3.4 检索变量

支持

 

3.3.5 字符串操作

不支持

此语法很奇怪,只能说freemaker 复杂了语法

3.3.5.2 获取一个字符

支持

通过扩展函数支持

3.3.6.1 序列操作 连接

支持

通过扩展函数支持

3.3.6.2 序列切分

支持

通过扩展函数支持

3.3.7 哈希表操作 连接

支持

 

3.3.8 算数运算

支持

 

3.3.9 比较运算

支持

 

3.3.10 逻辑操作

支持

 

3.3.11 内建函数

支持

 

3.3.13 处理不存在的值

支持

通过扩展函数支持

3.3.13.1 默认值

部分支持

 

3.3.13.2 检测不存在的值

支持

 

3.3.14 括号

支持

 

3.3.15 表达式中的空格

支持

 

3.3.16 操作符的优先级

支持

数字范围 这个概念

3.4 插值

支持

 

4.1 自定义指令 (宏)

支持

间接通过标签等支持

4.1.4 嵌套内容

支持

Beetl 中主要用在layout 标签里

4.1.5 宏和循环变量

支持

 

4.2 在模板中定义变量

支持

 

4.3 命名空间

部分支持

通过扩展函数支持,

4.4 空白处理

支持

Beetl 中不需要此额外功能

4.5 替换(方括号)语法

支持

 

 

东西好不好,再比一下性能,那被公认为性能良好的Freemarker做比较

性能比较

单线程:

 

还是以常用模板为准(大小6K ),循环渲染50000 次,需要时间(毫秒为单位)如下

 

Beetl1.2M1 解释执行方式(普通模式),运行三次,分别 1356,1365,1348
Beetl1.2M1
编译执行方式(普通模式),运行三次,分别 913,922,905
Freemarker
分别是 1155,1130,1122
Beetl1.2M1
允许字节流优化,解释方式执行三次,分别是 587,605,610
Beetl1.2M1
允许字节流优化,编译方式执行三次,分别是 385,355,370

简而言之,对beetl 做运行时编译,byte 输出设定后,渲染5 万次6K 的模板,性能如下

Freemarker

Beetl

1140 毫秒

370 毫秒

 


及时不对beetl 做任何优化,性能也与Freemarker 持平


最后,向给位有志从事开源开发的朋友号召,无论你是工作10+年的老手,还是在学习就读的学生,如果愿意从事beetl开发和维护,我非常欢迎。我用了很多业余的精力去一个人搞一个开源的方方面面的工作,感到非常费神。我希望找一个能力突出,愿意去维护beetl开源的人。有想法可以留言

   发表时间:2012-07-01  
看了一下,明显的比较“现代”,用anltr实现的此词法、语法分析。随手翻开一个类Jdk16Javac.java。。我居然看到了ex.printTrack(),然后我决定不再看。
0 请登录后投票
   发表时间:2012-07-02  
fireflyc 写道
看了一下,明显的比较“现代”,用anltr实现的此词法、语法分析。随手翻开一个类Jdk16Javac.java。。我居然看到了ex.printTrack(),然后我决定不再看。


你能看一下代码,还是不错的,很多人都评价过我写的代码,其中一个最有意义的评价就是重构CommonTreeNode,针对每个Node类型实现俩个方法,用于运行时,和编译时俩种模式。这会极大提高维护性,这也是我重构计划一部分。

你不再看理由无非是你觉得beetl实现比较简单,这很好,能让人看得懂也是写代码的一个要求。 但你看的
Jdk16Javac.java 是一个边缘类,如果我没有猜错,你应该只看了你能看的懂的,那么你认为什么情况下回抛出Exception,我应该怎么做?我想你不会回避论坛里的讨论
0 请登录后投票
   发表时间:2012-07-02  
我觉得应该往外抛,作为一个framework自己把异常吃掉。。会可怕的。包一下抛出去。

我看得出这个类是一个边缘的,随手翻到而已。这个不能成为否定一个东西的理由,但是却足够让我不再感兴趣。
0 请登录后投票
   发表时间:2012-07-02  
Beetl双引擎,(兼顾代码生成和高并发web)。如果编译class过程中出现任何错误,都转为解释执行,这也是不抛给用户的原因

还有,此处catch的异常是编译源代码可能出现的异常,这通常是环境问题,如classpath里没有包含jdk的编译类。这在第一次运行的时候就能检测出来,不会在线上环境出现。这也是我不想处理的原因
0 请登录后投票
   发表时间:2012-07-02  
哦,看来我理解错了。我没有仔细看,当时的直觉是这个是纯解释性的,而这个类存在的意义或许是为了运行模板引擎嵌入的java代码。
0 请登录后投票
论坛首页 Java企业应用版

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