比Velocity快10倍的模板引擎
在07年的时候,写过一个模板引擎,当时叫CommonTemplate,以前JavaEye有个开源系列介绍:http://www.iteye.com/news/3381,后来功能越来越多,性能却越来越差,在金大为发给我性能对比结果后,看到惨不忍睹的差距,就打算抛弃原设计进行重写,但因工作忙,就搁置了,最近看温少发了几个EL和JSON的解析器,有点手痒,就抽了个周未,拿出来再改了改,主要将模板改成了字节码编译,并简化了语法及缩小使用范围,只针对HTML场景使用,并将名称改成了HTTL,名字含义是把HTML中的M(Marker)改成了T(Template),放在GoogleCode上:http://code.google.com/p/httl,性能和Java硬编码输出模板内容差不多,比Velocity/FreeMarker等快10倍左右。
语法方面的区别:
发现基于文本指令的,基于HTML标签的,基于HTML注释的,都有不少模板引擎实现,
为了标新立异以及使用的直观性,HTTL采用基于HTML属性的指令,如:
<table if="user.role == 'admin'"> <tr foreach="book in books"> <td>${book.title}</td> </tr></table>
Object user = context.get("user"); // 无法确定user是Map还是POJO// 反射获取属性的值,而且要运行期判断是user.getName(),还是user.name字段Object name = ReflectUtil.get(user, "name"); // 接下来name也要反射
User user = (User)context.get("user"); // 通过in="User user"声明类型String name = user.getName(); // 编译期通过User的字段类型推演name的类型,并在编译期决定使用getName()
writer.write("<table><tr><td>");writer.write(user.getName());
private static byte[] final _B1_ = new byte[] {60, 116, 97, 98, 108, 101, 62, 60, 116, 114, 62, 60, 116, 100, 62};output.write(_B1_);output.write(user.getName().getBytes());
if (user.role == "admin") { // ...} else if (user.role == "member") { // ...} else { // ...}
int id = System.identityHashCode(user.role);switch (id) { case 3452345: // 编译时计算"admin"的identityHashCode // ... case 2342452: // 编译时计算"member"的identityHashCode // ... default: // ...}
int price = price * discount / 100;
context.put("price", price);