文档章节

Beetl3.0 功能预览

闲大赋
 闲大赋
发布于 04/15 12:05
字数 1200
阅读 970
收藏 5

Beetl是一款全功能,性能优秀的国产模板引擎,可以广泛用于动态页面生成,静态页面生成,代码生成,文本转换,脚本和规则引擎等,从2011年来,一直维护,并得到国内用户的肯定。

1 性能篇

Beetl3.0 现在进展到M1版本,单元测试都通过,俩个模板类的性能测试也跑了一下,结果如下

国内Keb同学提供的性能测试来看 (https://gitee.com/xiandafu/teb)

老外提供的性能测试来看(https://github.com/mbosecke/template-benchmark)

注:Freemaker,Velocity,Thymleaf 都更新到最新版本了,Rocker是编译成class来执行模板

综合来说,整体性能仍然很优秀,这是Beetl一贯风格

2 功能篇

2.1 定界符增强

Beetl3 允许再定义一对“站位符和定界符”,比如定义了模板的定界符<%%>,站位符${},你可以定义一对,比如<!--: --> 和 #{} 如下是一段模板

select * from user_#{seq} where user_id=${userId}

如上SQL模板,可以对#{},和 ${}提供俩个解释,前者文本输出,后者输出"?"

再比如

<span>${seq}:#{text}</span>

可以对#{}自定义解释,增加XSS功能

2.2 片段渲染 增强

Beetl支持模板局部渲染,只要标记AJAX片段,Beetl可以只渲染这一部分,而忽略整体,这是和AJAX调用,取代了传统模板必须使用include来支持重用 3.0 增强了AJAX语法,是的AJAX标记的片段在使用的时候可以是一个独立模板,涉及的变量成为全局变量

@  var data=[1,3];
.......
@ #ajax sayHello:{
hello ${data[0]}
@}

渲染整体模板的时候,输出是hello,1,也可以专门渲染sayHello部分

Template t = gt.getAjaxTemplate("/ajax/ajax_template.html","sayHello");
t.binding("data",new int[]{1,3});
String str = t.render();

2.3 HTML 标签 增强

Beetl3.0 可以支持html标签,且支持绑定变量,比如

<cms:topic type="${xxx}" var="content,index">
${index}:${content}
</cms:topic>

topic 是一个自定义标签,java实现会导出俩个变量content,index供渲染标签体内用,新的3.0 支持导出的变量范围扩大到整个模板,使用export关键字比如

<cms:define export="contents"/>
//其他地方可以用conents
<cms:foreach list="${contents}" var="c">
<span>${c.title}</span>
</cms:foreach>

2.4 HTML 标签父子关系

这个JSP Tag 支持,Beetl2.X需要做些扩展,现在直接作为内置功能,因此,你可以用Beet的 html tag做出各种复杂的html扩展标签

2.5 语法糖

新增了 +=,-= 这种语法糖,比如

a+=3;
user.age+=1; 

2.6 提供语法树节点修改

2.X版本如果要修改语法树,写的代码较多,3.0能轻易的修改语法树,实现自己特有逻辑,比如在线内容管理系统要求编辑输入的循环不能循环超过1万次,

@ while(true){

@}

3.0能轻易修改while节点实现,通过GrammarCreator,替换自己的实现,从而限制while循环限制次数,Beetl的所有语法节点都可以被替换,以实现扩展需求,譬如 #{} 的实现需要xxs

	
	@Override
	public PlaceholderST createTextOutputSt2(Expression exp, FormatExpression format) {
		check("TextOutputSt2");
		return new YourXXSPlaceholderST(exp, format, null);
	}

YourXXSPlaceholderST 内部可以参考PlaceholderST.java实现,但增加了XSS校验

2.7 提升了脚本API

Beetl实质是脚本语言,因此GroupTemplate核心类新增script相关功能,提供了若干方便的API,你可以轻易使用Beetl实现规则引擎,脚本引擎,并能在性能上取得运算有势

	
Map ret = groupTemplate.runScript("return 2*利率;",paras);
Double d = ret.get("return");

2.8 采用ASM

Beetl2.x是用手写的字节码增强,当时Maven并不流行,所有的jar,都是以小为美,现在看来,已经没有必要了,所以Beetl3.x从新用ASM实现字节码增强,如一个User对象,会在运行时期生成一个辅助类

	
public class UserAccess extends AttributeAccess{
	public Object get(Object obj,String name){
		User user = (User)obj;
		int code = name.hashCode();
		switch(code)
		case 97:return user.getA();
		.....
	}
}

字节码增强 功能是可选的,默认还是采用反射方式实现属性调用

3 其他

Beetl3.X还有许多待完成的功能,比如编写分布式的模板加载器,可以用RedisResourceLoader或者MongoDBResourceLoader,会一直改进,敬请期待,也欢迎提出自己的想法。3.X让我有机会修复了1.x,2.x中的一些难以完善的功能,3.0修复的最早一个功能是在2015年提出来的,终于在3.0有机会改正了

© 著作权归作者所有

闲大赋

闲大赋

粉丝 1209
博文 97
码字总数 89382
作品 10
西城
架构师
私信 提问
加载中

评论(3)

阳光下的豚2011
阳光下的豚2011
m ra k
风云决
风云决
qinerg
qinerg
更好的性能;
内置多语言的支持;
提供去空格、空行(压缩页面)的功能;
支持分段缓存?
友好的错误提示、空值容错等;
智能媒体管理产品“文档标准型”使用介绍

一、导语 智能媒体管理 (Intelligent Media Management, IMM) 是阿里云的云服务它通过 文档标准型 实例提供了 Cloud Native 架构的文档转换/预览功能本文介绍功能使用、计费相关的配置。 二、...

luoqingchao
2018/09/27
0
0
文档预览功能使用技巧(3)---文字水印

感谢@磊知、@春长、@拜刀同学的支撑! 一、导语 智能媒体管理 提供了文档预览功能,通过 快速搭建 文章的介绍,详细描述了使用 “文档转换 + JS 前端渲染引擎” 实现文档预览的过程,本文将介...

luoqingchao
2018/07/12
0
0
文档预览功能使用技巧(1)---文字拷贝

感谢@磊知、@光春、@拜刀同学的支撑 一、导语 智能媒体管理 提供了文档预览功能,通过 快速搭建 文章的介绍,详细描述了使用 “文档转换 + JS 前端渲染引擎” 实现文档预览的过程,本文将介绍...

luoqingchao
2018/07/11
0
0
Mac的神功能:快速预览功能你真的会用吗?

关注微信公众号(扫码关注)第一时间获取技术贴更新! 问:什么是快速预览功能? 答:快速预览就是苹果Mac系统下原生的一个快速查看文件内容的功能,英文叫Quick Look或者Quick Preview。不需要...

九天学者
2018/09/12
0
0
文档预览功能使用技巧(2)---打印控制

感谢@磊知、@光春、@拜刀同学的支撑 一、导语 智能媒体管理 提供了文档预览功能,通过 快速搭建 文章的介绍,详细描述了使用 “文档转换 + JS 前端渲染引擎” 实现文档预览的过程,本文将介绍...

luoqingchao
2018/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 吾不好梦中插人

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @鱼豆腐233 :#今日歌曲分享# 分享My Chemical Romance的单曲《I Don't Love You》: 《I Don't Love You》- My Chemical Romance 手机党少年们...

小小编辑
今天
91
7
ss5 vpn 安装(linux版本)

1. 创建一个文件夹 /ss5 你也可以自定义,不过后续的地方需要注意自己的地址 2. 下载ss5文件(如果你的服务器没有安装wget请使用 yum -y install wget 命令安装 如果连yum都没安装自己查去)(下...

太黑_thj
今天
2
0
八、RabbitMQ的集群原理

集群架构 写在前面 RabbitMQ集群是按照低延迟环境设计的,千万不要跨越WAN或者互联网来搭建RabbitMQ集群。如果一定要在高延迟环境下使用RabbitMQ集群,可以参考使用Shovel和Federation工具。...

XuePeng77
今天
5
0
mac系统下,brew 安装mysql,用终端可以连接,navicat却连接不上?

问题: 1.报错? 2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found 2.自己通过设置,已经把密......

写bug的攻城狮
昨天
3
0
老生常谈,HashMap的死循环

问题 最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。 由于HashMap...

群星纪元
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部