论坛首页 Java企业应用论坛

Beetl 模板语言介绍

浏览 6520 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-06-20   最后修改:2011-08-21

地址:http://beetl.sourceforge.net/ 当前状态:预览版 类似于velocity,jsp,stringtemplate,freemarker,codesmith .等等,

它语法实际上是一个JAVASCRIPT 子集,所以使用起来很简单。除此之外,并提供一些有趣独特的功能

 

 

Beetl 模板语言5分钟使用说明

 

1.  最无聊的一个例子:Hello world

BeeTemplate t = new BeeTemplate("hello,world!$name$.");

t.set("name","joel li")

String result = t.getTextAsString() ;

System.out.println(result);

 

输出“hello,world!joel li.

 

2.  还是很无聊的一个例子,for if

BeeTemplate t = new BeeTemplate(getFile());

List list = new ArrayList();

list.add(new User(“joel”,33));

list.add(new User(“lucy”,18));

t.set(“users”,list);

String result = t.getTextAsString() ;

System.out.println(result);

 

   模板内容  

#:for(u in users){

         hello this is $u.name$.

         #:if(u.age>18){

                   Click here

         #:}else{

        Too yong,go away

#:}

#:}

 

 

Beetl语法同javascript相似,是其中的一个子集。

如在模板中定义临时变量

#:var price = oldPrice*0.2,cac = true;

如在模板中调用方法

$casef(score,1,’Good’,2,’Bad’,’Defualt’)$

 

以下是有趣的,不同于其他模板语言的内容

 

3.  自定义控制语句分隔符

不像jsp,velocity,freemark等模板语言,控制语句是在特定的符号内,如JSP,

<% %> .  Beetl允许自定义控制语句分割符,如可以在HTML模板中定义分割符号为

<!--:  控制语句   --> (看着象注释吧,哈哈)

Shell模板脚本中定义控制语句以#:开头

   如下例子定义了一个类似JSP的控制符

BeeTemplate t = new BeeTemplate("<%var email='javamonkey';%>");

t.setStatementStart("<%");        

t.setStatementEnd("%>");

 

默认控制分割符号是# 回车

4.  自定义占位符

同样可以定位位符号

BeeTemplate t = new BeeTemplate("~userName~");

t.setPlaceholderStart("~");

t.setPlaceholderEnd("~");

 

默认是占位符是$

 

5.  自定义函数

可以为beetl增加内置函数

必须实现

public interface  Function {

    public Object call(Object... paras) ;

   

}

如模仿oralce NVL函数

 

public class NVLFunction implements Function {

    public Object call(Object... paras){

       if(paras.length!=2){

           throw new RuntimeException("参数错误,期望Object,Object");

       }

       if(paras[0]==null){

           return paras[1];

       }else{

           return paras[0];

       }

          

    }

}

 

使用例子如下

BeeTemplate t = new BeeTemplate("$nvl(name,'N/A')$");

t.registerFunction("nvl", new NVLFunction());

 

6.  虚拟属性支持:

由于MVC架构中,M往往并不能完全满足V的需要,尤其M代表的是数据库模型,因为可以在BeetlM增加虚拟属性来满足要求

 

如为java.util.Date类增加一个displayDate用于显示yyyy-MM-dd风格

BeeTemplate t = new BeeTemplate("$date.displayDate$");

t.registerVirtualAttributeEval(Date.class, "displayDate", new DateDisplayEval());

t.set("date", new Date());

 

 

如果在循环中,对象还具有__index,__count俩个虚拟属性以表示当前索引以及以及所属集合大小

 

7 文本处理函数:

  并不是所有模板都适合用站位符号,有时候需要根据位置去替换,如数据库配置文件,我见到spring 使用占位符就是一个糟糕的想法。Beetl提供了根据位置替换的函数,并且开发者可以自由增加这些函数

 

#:var ip= "192.168.1.1",port=7001;replaceProperties(ip,port){
ip=127.0.0.1
port=8002
#:}

 

 

 

8 占位符格式化

$date, fm=’yyyy-MM-dd’$

 

甚至可以像Pipeline那样处理

 

$date, nvl=”N/A”,fm=’yyyy-MM-dd’$

 

  

9 严格MVC支持

有些架构师不喜欢模板语言有太多的功能,尤其是函数调用,算数表达式和复杂的条件表达式

如果你认同strictly enforces model-view separation 观点,可以设置BeeTemplate. makeStrict(true);

 

 

BeeTemplate t = new BeeTemplate("#:if(!isGirl){var c=1;}");

t.makeStrict(true);     

t.set("isGirl", false);

t.getTextAsString() ;

 

如上代码会导致编译错误

STRICK_MVC 位于1行,符号 var

1|#:if(!isGirl){var c=1;}

 

 

 

 

以上部分是Beetl有趣的地方,其他特性就不一一列出来了,可以参考详细使用说明

 

当前版本:0.5.01

下载

浏览代码

  

更新历史

2011-8-21 增加了严格MVC限制,如果你认同strictly enforces model-view separation 观点,可以设置BeeTemplate. makeStrict(true);    

2011-8-16 家里漏水,正好修改了不少功能,如下:

ü  增加includeFTincludeST 函数,类似jsp include指令,如$inlcude(‘/child/subTemplate.txt’)$

ü  增加缓存RuntimeTemplate功能,使得第二次使用,性能提升40倍,这是因为减少了parser时间

ü  修复了回车换行的某些问题,回车换行应该不再困扰我了

ü  增加GroupTemplateContextBeeTemplate一些方法和修改了一些实现

2011-8-13修复回车换行的Bug,重构Transformor,此类将来还需要再优化。

2011-8-10 无任何更新,太忙了。写一行,证明我还在关注自己的Beetl。但计划修复一个大bug,以及增强虚拟属性特性,可能新增语法“虚拟视图类”

2011-7-20 增加Template作为模板引擎接口,并增加CompiledBeeTemplate 为预编译做准备

2011-7-9 重构虚拟属性__index __size

2011-7-5 增加回车换行符作为控制语句结束的标示。修改虚拟属性必须以~开头增加单元测试

2011-6-22 修改了语法错时候不能正确显示原文bug

2011-6-20 更新Transform代码,自定义分隔符,占位符,以及增加Escape支持

2011-6-1 初始化一个版本

2011-5-12 开始开发模板语言,并最终命名为beetl

2011-4-1  提出创建一个更为灵活,实用的模板语言想法

 

   发表时间:2011-08-16  
稳定版已经出来

开源首页:http://beetl.sourceforge.net/

下载:http://sourceforge.net/projects/beetl/files/beetl-src-0.51-all.zip/download

补充一下更新历史:
2011-8-16 家里漏水,正好修改了不少功能,如下:

  增加includeFT,includeST 函数,类似jsp include指令,如$inlcude(‘/child/subTemplate.txt’)$

  增加缓存RuntimeTemplate功能,使得第二次使用,性能提升40倍,这是因为减少了parser时间

  修复了回车换行的某些问题,回车换行应该不再困扰我了

  增加GroupTemplate,Context,BeeTemplate一些方法和修改了一些实现

2011-8-13修复回车换行的Bug,重构Transformor,此类将来还需要再优化。

2011-8-10 无任何更新,太忙了。写一行,证明我还在关注自己的Beetl。但计划修复一个大bug,以及增强虚拟属性特性,可能新增语法“虚拟视图类”

2011-7-20 增加Template作为模板引擎接口,并增加CompiledBeeTemplate 为预编译做准备

2011-7-9 重构虚拟属性__index 和 __size

2011-7-5 增加回车换行符作为控制语句结束的标示。修改虚拟属性必须以~开头增加单元测试

2011-6-22 修改了语法错时候不能正确显示原文bug

2011-6-20 更新Transform代码,自定义分隔符,占位符,以及增加Escape支持

2011-6-1 初始化一个版本

2011-5-12 开始开发模板语言,并最终命名为beetl

2011-4-1  提出创建一个更为灵活,实用的模板语言想法
0 请登录后投票
   发表时间:2011-08-16  
有意思,
效率怎么样
0 请登录后投票
   发表时间:2011-08-17  
kimmking 写道
有意思,
效率怎么样


runtime版本 也就是解释执行,现在以一个1K的文件做模板,内含少量控制语句和站位符做测试,大概需要4毫秒。
随着模板文件增长,应该是线性增长的。

预编译版本,就是编译成java class,目前还没有做,但接口是一致的,切换只要设置GroupTemplate.isProudct = true


runtime版本用于web 界面估计还不行,但用于代码生成是可以的,它已经被使用验证过了
0 请登录后投票
   发表时间:2011-08-17  
补充一下:

我只在我一个5年前买的笔记本上做的简单性能测试
头一次使用需要170毫秒,再次使用 大概4-10毫秒。主要是缓存了解析的中间结果,提高了性能
0 请登录后投票
   发表时间:2011-08-17  
#:for(u in users){
         hello this is $u.name$.
         #:if(u.age>18){
                   Click here
         #:}else{
        Too yong,go away
#:}
#:}


这个#:咋就这么别扭呢,我看你支持控制语句分隔符,自定义占位符。那对应的语法解析部分是你自己写的?没有javacc,yacc
0 请登录后投票
   发表时间:2011-08-18   最后修改:2011-08-18
#是shell脚本里的注释,所以把控制语句隐藏在注释里而不影响原来的文件。
譬如html模板,可以用<!--(代码开始):   -->作为控制语句开始和结束符号,这样,这个模板既能被IE识别还能被beetl识别

如果你喜欢,可以设置成jsp风格
group.setStartStatemetn("<%")
group.setStartStatemetn("%>")

语法解析用的是antlr,我看你研究过javac,有兴趣可以加入聊天群 61765717。应该是国内唯一的研究antlr的聚结地,我是第二任群主,呵呵

0 请登录后投票
   发表时间:2011-08-18  
重复制造轮子?
0 请登录后投票
   发表时间:2011-08-18  
gaobusi 写道
重复制造轮子?


哪重复了?
0 请登录后投票
   发表时间:2011-08-21  
在跟朋友激烈讨论后,增加一个新功能,严格MVC支持,

有些架构师不喜欢模板语言有太多的功能,尤其是函数调用,算数表达式和复杂的条件表达式等各种属于业务逻辑的部分。
如果你认同此观点,以及论文strictly enforces model-view separation(http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf) 观点,可以设置BeeTemplate.makeStrict(true);
如下代码:
BeeTemplate t = new BeeTemplate("#:if(!isGirl){var c=1;}");
t.makeStrict(true);
t.set("isGirl", false);
t.getTextAsString() ;

会导致编译错误
STRICK_MVC 位于1行,符号 var
1|#:if(!isGirl){var c=1;}
0 请登录后投票
论坛首页 Java企业应用版

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