Beetl与Freemarker 比较
一章一章的看了Freemarker官方网站的使用说明,觉得Beetl功能与Freemarker功能应该是差不多的。打算在Beetl正式发布前,也按照Freemarker文档的组织结构,写一个对应的详细使用说明
Beetl的优势在于
使用更简单
: 类似javascript语法,不用额外的学习成本
更小
:大小不到350K
更具有扩展性
:支持自定义函数,文本处理函数(标签),格式化函数
MVC限制
:即允许严格的MVC限制,也允许使用标准MVC限制 , 也允许打开后门,直接调用java类,支持这三种MVC限制
对原文件无侵入性
:众所周知,文件一旦变成模板,就不在是文件,只能被模板引擎识别,Beetl模板对原文件侵入性很低
更好性能 :可以在运行时优化成java代码,具有最高效的使用
编译成class后的错误处理很赞
大多数web容器对JSP运行的错误处理不好,虽然打印出错误栈,但很难让开发者找到错误行。对于Beetl来说,默认的错误处理不仅打出错误栈,而且还显示出模板文件所在行数已经上下3行的内容:如下
一个简单的模板如下
<%
var a= 3;
var b = 2/0;
%>
$b$
运行后会打印出如下信息
ERROR 位于3行
1|<%
2|var a= 3;
3|var b = 2/0;
4|%>
5|$b$
java.lang.ArithmeticException: / by zero
at test.first_html.service(first_html.java:15)
at org.bee.tl.core.PreCompiledClass.service(PreCompiledClass.java:170)
at org.bee.tl.core.CompiledBeeTemplate.runAsPreCompiledClass(CompiledBeeTemplate.java:86)
at org.bee.tl.core.CompiledBeeTemplate.getText(CompiledBeeTemplate.java:52)
at org.bee.tl.core.AbstractTemplate.getTextAsString(AbstractTemplate.java:91)
at org.bee.tl.core.GroupTemplate.main(GroupTemplate.java:429)
Beetl switch 例子
<%
var str = "beetl";
var a = 0;
switch(str){
case "velocity":{
a = 0;
break;
}
case "freemarker":{
a = 1;
break;
}
case "beetl":{
a = 3;
break;
}
}
%>
$a$
将会编译成如下代码
public void service(Writer writer,Context ctx) throws IOException,BeeException{
ctx.set("____group",group);
ctx.set("____this",template);
BeetlWriter out = new BeetlWriter(writer,this);
String str="beetl";
int a=0;
List _caseList15_0 = new
ArrayList();_caseList15_0.add("velocity");_caseList15_0.add("freemarker");_caseList15_0.add("beetl");
switch(_caseList15_0.indexOf(str)){
case 0:{
a=0;
break;
}
case 1:{
a=1;
break;
}
case 2:{
a=3;
break;
}
}
out.write(a);
out.write(__VCR);
}
/* 原模板中的所有字符串定义到这儿*/
private static char[] __VCR = "\r\n".toCharArray();
/* 原模板Cached标示*/
public long getVersion(){
return 1321085218968l;
}
Missing Value
可以在变量后面加 !字符串 指示Beetl 如果变量为空,则显示!后面的字符串,如下例子
$user.wife.bir!'N/A',dateformat$ ;
如果user为空,或者user.wife为空,则显示"N/A",可以看看编译后的代买片段
if(user!=null&&user.getWife()!=null){
out.write(user.getWife().getBir(),"dateformat");
}else{
out.write("N/A");
}