博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
beetl模板引擎的好玩的地方
阅读量:6704 次
发布时间:2019-06-25

本文共 2279 字,大约阅读时间需要 7 分钟。

  hot3.png

Beetl2.x即将发布,性能,功能上已经非常卓越了,这里介绍一下beetl的好玩的地方,使用者可以定制beetl很多特性

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

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

@ for(user in userList){ ${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“字节码”,因此能完成很多有趣功能,比如

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

比如一个常见需求,为了防止xss攻击,需要把字符串输出的做一下过滤,而其他输出不需要过滤,一般情况,采用beetl或者使用其他模板引擎,都可以加入一个格式化函数,如:

${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假设用户总是像模板引擎里传入同一类型的对象,如:

<% var na = user.name;%>

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

beetl不用显示指定类型,从而在提高性能的时候简化了模板开发。当然,你也可以指定类型,比如:

<%/**@type User me,List
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是个好的的选择:

转载于:https://my.oschina.net/xiandafu/blog/199822

你可能感兴趣的文章
visual studio 2013使用技巧
查看>>
requirejs-define jquery 快速初学实例(一)
查看>>
JSP网站开发基础总结《九》
查看>>
Sublime Text 相关
查看>>
深入理解css优先级
查看>>
Android MediaPlayer状态机
查看>>
Material Design Animation
查看>>
ASP.NET MVC搭建项目后台UI框架—3、面板折叠和展开
查看>>
(C语言)memcpy函数原型的实现
查看>>
Theano2.1.1-基础知识之准备工作
查看>>
FreeBSd ports 安装软件
查看>>
DevExpress.Build
查看>>
ACCESS-如何多数据库查询(跨库查询)
查看>>
iOS:转载sqlite3
查看>>
努力学习 HTML5 (3)—— 改造传统的 HTML 页面
查看>>
java并发编程学习:用 Semaphore (信号量)控制并发资源
查看>>
HDU 2070 Fibbonacci Number
查看>>
Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-级别选择ScrollView
查看>>
Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?
查看>>
怎么把控制台输入命令之后显示的东西保存到一个记事本中
查看>>