beetl模板引擎的好玩的地方

Beetl2.x即将发布,性能,功能上已经很是卓越了,这里介绍一下beetl的好玩的地方,使用者能够定制beetl不少特性 html

1 自定义控制语句定界符: java

开发者能够根据本身喜好定义<% %>做为控制语句定界符号,也能够定义<?  ?> 或者<!--#  -->等等,取决于你的喜爱,有些开发者甚至定义出@ +回车的定界符号,以下: express


@ for(user in userList){
<span> ${user.name}
........
@}



2 安全输出


模板常碰到变量为空或者变量不存在的状况,beetl能够加入!轻易解决这种问题 安全


${user.name!}
${user.age!"未知"}



固然,若是你以为加整个模板处处充满了!(其余有安全输出的模板引擎)都很麻烦,能够用beetl的指令



<%
  directive safe_output_open;
%>
${user.name}
${user.name}
${user.name}${user.name}${user.name}${user.name}



3 动态修改代码


beetl2.0引入了相似java字节码修改器的概念,提供简单易懂的方法能让你修改beetl“字节码”,所以能完成不少有趣功能,好比 xss


  • demo版本每一个页面尾部自动输出公司版权信息
  • 模板页面统计功能
  • 模板片断分析统计
  • 动态修改模板脚本

好比一个常见需求,为了防止xss攻击,须要把字符串输出的作一下过滤,而其余输出不须要过滤,通常状况,采用beetl或者使用其余模板引擎,均可以加入一个格式化函数,如: ide


${user.name,xss}



(xss是一个格式化函数)


可是,实际上也能够动态修改PlaceholderST来为全部字符串输出的语句自动加上一个过滤,代码以下: 函数


public MyTemplateProbe extends BasicProgramOptProbe{

protected void addMore(StatementParser parser)
{
   parser.addListener(PlaceholderST.class,new PlaceholderSTChange())
}
}



parser.addListener 指示模板探针在分析语法树的时候,碰到PlaceholderSt.class,通知PlaceholderStChange ,这个类能够负责用新的实现来代替模板引擎默认的实现


以下代码片断: 性能


public class PlaceholderStChange implements Listener{

@Override
	public Object onEvent(Event e)
	{
		Stack stack = (Stack) e.getEventTaget();
		PlaceholderSt o = (PlaceholderSt)stack.peek();
              if(o.expression.type==String.class) o.format = xssFormat;
        }
}



statck保存了从root到此节点全部通过的节点,所以stack.peek 能够取出当前节点,你能够修改此节点,也能够返回一个全新的节点。这个例子,咱们修改了PlaceHolderSt , 若是他的输出类型为String,咱们将加上xss检测



4 不须要申明类型的强类型模板引擎 测试

beetl是个强类型模板引擎,从而保证了性能最大化,IDE的重构支持,属性提示等,但他又是不须要像其余模板引擎那样必须申明类型。beetl假设用户老是像模板引擎里传入同一类型的对象,如: spa

<%
 var na = user.name;
%>



当用户渲染模板的时候,传入template.bind("user",new User());
beetl就能认为user类型是User.class, 而na则是getName的类型。


beetl不用显示指定类型,从而在提升性能的时候简化了模板开发。固然,你也能够指定类型,好比:


<%
/*
*@type User me,List<User> list
*/

for(user in List){

%>



尽管不须要@type申明类型,但申明类型仍是有好处的,好比更加容易维护,若是ide支持,还能够属性提示,重构支持。


5 beetl是脚本加标签的混合
基本上,beetl开创了脚本式的模板引擎,但有趣的地方,他实际上支持标签,好比:

<%
var salary = getAll();
%>

<#selection values = "${salary}" id="id" value="name" #/>


对于标签控来讲,这再合适不过了,对于CMS系统,这也很是好


6 独特的语法

尽管beetl避免生僻的,非人类直观的语法,但仍是引入了少许新语法,创造新语法这不值得beetl开发者骄傲,但这些新语法有时候对开发有好处。如for-elsefor

<%
for(user in userList){
  println(user.name);
}elsefor{
  println("no data");
}
%>



7 功能和性能。

  尽管功能和性能不能算beetl好玩的地方,但光好玩,不实用也不行。以下是基准的性能测试,可让有兴趣的朋友更加确信beetl是个好的的选择:

相关文章
相关标签/搜索