论坛首页 Java企业应用论坛

(更新)Beetl 0.61beta 发布,性能和功能与freemarker持平,易用性和扩展性远远超越

浏览 6172 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (6) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-08-28   最后修改:2011-09-04

Beetl模板语言使用指南

什么是Beetl

BeetlBee Template languageBee译为忙碌的人,意指忙碌中国的开发人员。目前版本0.6beta,大小约320K

Beetl是国人提供的一款开源免费得模板语言,作者有10余年Java开发经验,曾在国内外著名大公司工作过,根据自己实际使用模板语言的心得体会而编写的一款模板语言,它具有如下特性:

1 非常简单:它的语法是javascript一个子集,只有少量的大家熟悉的符号。任何了解java,或者javascript的人,都能快速学会。如果从未用过任何模板语言,用Beetl是非常很合适的

2 同时支持较为松散的MVC和严格的MVC,如果在模板语言里嵌入计算表达式,复杂条件表达式,以及函数调用有干涉业务逻辑嫌疑,你可以禁止使用这些语法。关于这一点,可以参考strictly enforces model-view separation

3 提供一系列其他模板语言没有提供的功能,如自定义占位符号,控制语句符号,虚拟属性,自定义函数,文本处理函数等,它们并不复杂,但有可能解决你在使用别的模板语言时候遇到的一些不便捷的问题

下载

 

 

Beetl能为你做些什么

作为模板语言,你可以用于任何适合在MVC的地方。如代码生成,或者web界面

因为Beetl是基于antlr实现语法解析的,因此如果你仅仅对antlr感兴趣,beetl仍然可以作为你的一个重要参考

关于Beetl性能:

目前实现了runtime版本,适合代码生成。暂时不适合作为web界面。它本生的是以易读的方式实现,并未经过优化。然而,即将推出预编译版本,可以保证有很好的性能

Beetl目前渲染一个7K文件,内含少量控制语句和占位符,所需要时间是1毫秒,这是在我一个四年前的老机器上跑得,作为代码生成,你完全无需担心性能。

 

beetl(runtime,0.52)

Beetl(runtime,0.6)

Freemarker(2.3.1.8)

Beetl(compiled)

Velocity

7K1000次)

4000毫秒

950毫秒

900毫秒

 估计约400毫秒

 

 

展望Beetl预编译实现出来后,性能将至少提高2-3倍以上,因此未来能超越Freemaker

 

关于功能:

http://freemarker.sourceforge.net/fmVsVel.html  是一篇freemakervelocity功能比较的文章,很幸运Beetl能以简单易学,更易扩展的方式支持所有功能

下表是以此文章为基础做的比较

功能点

Beetl

Freemarker

velocity

Number and date support

yes

yes

no

Internationalization:

Yes,但不支持中文变量名

yes

no

Loop handling:

Yesbetter

yes

no

Array handling on the template language level

yes

yes

no

Macros

Yes

Yes

no

Name-spaces:

No

yes

no

Java-independent string, list, and map manipulations with built-in functions/operators:

yes

yes

no

Expose typos and other mistakes in template

Yesbetter

yes

no

Advanced rendering control:

yes

yes

no

Literals:

yes

yes

no

Advanced white-space removal

No ,不明白为啥有此需求

yes

no

Integration with other technologies:

yes

yes

yes

Powerful XML transformation capabilities:

no

yes

no

Advanced template metaprogramming:

No,不明白为啥有此需求

yes

no

function

No,觉得模板不需要

yes

No

自定义控制语句

yes

no

no

自定义占位符号

yes

no

no

严格MVC控制

yes

no

no

虚拟属性

yes

no

no

文本处理函数

yes

no

no

自定以错误处理Hanlder

yes

no

no

 

基本用法

 

Hello Beetl

package org.bee.tl.samples;

import java.io.IOException;

import org.bee.tl.core.BeeTemplate;

public class HelloBeetl {

 

   public static void main(String[] args)throws IOException {

      Template template =new BeeTemplate("Hello,$name$");// 1

      template.set("name","Beetl");//2

      String result = template.getTextAsString();//3

      System.out.println(result);

   }

}

 

1用于BeeTemplate创建一个模板,此时使用的是一个字符串输入,输入也可以是java.io.File或者java.io.reader.对于beetl来说,如果输入是文件,那将会缓存中间的解析结果而大幅度提升性能

2定义变量,set方法允许字符串,对象作为参数,如果需要引用对象的属性,则用小数点,如$user.name$,如果属性是个List集合,可以用[索引],$user.friends[0]$,如果属性是Map集合,

 使用[key],key为任何对象,如$books[thinking in java].author$

3调用template.getTextAsString() 或者template.getText(OutputStream os)都可以获得模板渲染的结果

 

控制语句和占位符号

Beetl默认情况下,采用#:作为控制语句开始,回车作为控制语句结束

#:for(user in userList){

hello,$user.name$

#:}

默认情况下,占位符号使用$作为开始和结尾占位符号

$users[index]$

然而,Beetl支持自定义控制语句和占位符号,以适应不同类型模板文件

public static void main(String[] args) {

  String input = ”…..

      BeeTemplate template =new BeeTemplate(input);

      template.setStatementStart("<%");

      template.setStatementEnd("%>");

      template.setPlaceholderStart("~");

      template.setPlaceholderStart("~");

      template.getTextAsString();

}

 

更多参考http://beetl.sourceforge.net/  或者我的博客 http://javamonkey.iteye.com/blog/1159927 。在论坛里发不了更多内容

   发表时间:2011-08-30  
发现一个bug以修复,如下例子
<%var a=1;
for(user in userList){
%>      <---多个空格在这儿
.....................

如果<% 和 %>之间多行,且最好一个%>后有空格,会导致错误提示显示不正确的行数。现在已经修复
0 请登录后投票
   发表时间:2011-08-30   最后修改:2011-08-30
--- 连废物空白移除都不知道为啥要这个??my god ...我对你nnn年的大公司工作经验深表怀疑。。


反而是加上去的那些东西看不出是啥东西。
0 请登录后投票
   发表时间:2011-08-30  
ray_linn 写道
--- 连废物空白移除都不知道为啥要这个??my god ...我对你nnn年的大公司工作经验深表怀疑。。


反而是加上去的那些东西看不出是啥东西。

说一下,是干什么用的,看看beetl能不能实现
0 请登录后投票
   发表时间:2011-08-30   最后修改:2011-08-30
javamonkey 写道
ray_linn 写道
--- 连废物空白移除都不知道为啥要这个??my god ...我对你nnn年的大公司工作经验深表怀疑。。


反而是加上去的那些东西看不出是啥东西。

说一下,是干什么用的,看看beetl能不能实现

我看了一下,我觉得废物空白移除这个功能很有问题,这是由于freemarker本身技术导致的,是它产生的“废物空白”。因此他又增加一个移除功能。这不值得freemarker炫耀

这个在Beetl中完全是不需要的。没有此功能很正常

另外,我加上去的东西,如果看不出来啥东西,说明文档写的不详细,可以发邮件问我吧。我就在这里给你解释一个“文本处理函数”,如下我模拟了废物空白移除功能的beetl实现(假如Beetl真产生了这“废物空白”)
#:removeAnyChar(" ","/t","/n"){
 
    hello, text process function 。
#:}

removeAnyChar是一个简单的文本处理函数接收{ }之间的内容,进行删除废物操作后输出

因此结果是
hello, text process function 。



如果你还不理解,请回贴留下你的qq或者邮件,我会再给你解释一遍

0 请登录后投票
   发表时间:2011-08-30  
iteye上的那些大牛们真是two到不行。
0 请登录后投票
   发表时间:2011-08-30  
不知道你唠唠叨叨在说什么,空白移除是基于:一个模板语言默认不应该对标记结束之后的文本多加处理,除非用户显示说明,因此输入 这样一个模板标记:

<#list users as user>[BR]
  <#if !user.hidden>[BR]
  <li>${user.name}[BR]
  </#if>[BR]
</#list>[BR]


会多余许多空白:

<p>List of users:[BR]
[BR]
<ul>[BR]
[BR]
  [BR]
  <li>Joe[BR]
  [BR]
[BR]
  [BR]
[BR]
  [BR] 
  <li>Julia[BR]
  [BR]
[BR]
</ul>[BR]
<p>That's all.

废物空白移除就是让用户显式地来抑制这些空白。 --了解了么?
0 请登录后投票
   发表时间:2011-08-30  
用freemarker怎么会有这么多废物空白呢?

我再说一遍,beetl是不会生成废物空白的,所以也没有必要有这个功能。

这明显是freemarker的一个缺点嘛,在你这到说成了一个新功能。
0 请登录后投票
   发表时间:2011-08-30  
这怎么是freemarker的缺点呢,你在编程的过程中有时为了增强代码的可读性,或者使用了格式化会造成很多空白和回车的,而输出到客户端时这些空白和回车显然是多余的,不去除怎么行啊??????

再问一句,你用模板语言生成过JSON吗?? 如果你做过这类事情,就知道去除多余空白的重要性了,否则浏览器在解析含有大量回车等的JSON时视会报错的。

另外,不要随意地就称自己的东西比人家的好,个人觉得你的东西离freemarker还有很遥远的距离哦。

javamonkey 写道
用freemarker怎么会有这么多废物空白呢?

我再说一遍,beetl是不会生成废物空白的,所以也没有必要有这个功能。

这明显是freemarker的一个缺点嘛,在你这到说成了一个新功能。

0 请登录后投票
   发表时间:2011-08-30  
zuiyanwangyue 写道
这怎么是freemarker的缺点呢,你在编程的过程中有时为了增强代码的可读性,或者使用了格式化会造成很多空白和回车的,而输出到客户端时这些空白和回车显然是多余的,不去除怎么行啊??????

再问一句,你用模板语言生成过JSON吗?? 如果你做过这类事情,就知道去除多余空白的重要性了,否则浏览器在解析含有大量回车等的JSON时视会报错的。

另外,不要随意地就称自己的东西比人家的好,个人觉得你的东西离freemarker还有很遥远的距离哦。

javamonkey 写道
用freemarker怎么会有这么多废物空白呢?

我再说一遍,beetl是不会生成废物空白的,所以也没有必要有这个功能。

这明显是freemarker的一个缺点嘛,在你这到说成了一个新功能。


1 ray_linn 的例子应该不是为了争强可读性,而是freemarker自己生成的多余空白吧。

我也用过freemarker,它有时候会生成多余的空白或者换行符,而且上下行对不齐。这点JSP也是有的。Beetl目前还没有此问题,我为解决这些问题,花掉了我1/4的精力。

2 针对你说的json 去除空白,我想我再把我刚才的例子贴出
#:removeAnyChar(" ","/t","/n"){
需要去除空白的内容
#:}

这说明了beetl有极好的扩展性,你的问题我能一下子就解决了,我会吧去除空白或者压缩文本处理函数加入到我的core function里。


3 最后,我的比较是,是易用性和扩展性好,功能和性能持平。请看清楚了
0 请登录后投票
论坛首页 Java企业应用版

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