论坛首页 Java企业应用论坛

比Velocity快10倍的模板引擎

浏览 55934 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-09-15  
哥哥你的测试靠谱吗?
0 请登录后投票
   发表时间:2011-09-15  
javamonkey 写道
如果去掉这些html“注释”(实际上是beetl语句,但欺骗了IE和HTML Parser)
内容就是正常的HTML

注释语法很多模板语言都用的,成,以前CommonTemplate也支持,只是个人觉得HTML属性更简洁。
0 请登录后投票
   发表时间:2011-09-15  
cnrainbing 写道
哥哥你的测试靠谱吗?

测试代码是公开的,你可以看一下,如果发现有问题,也可以改。
0 请登录后投票
   发表时间:2011-09-15  
httl 和 html 混合在一起,一开始感觉很有趣,但仔细看猴就发现问题了,我感觉最大的问题是阅读比较困难。

比如,<table if="user.role == 'admin'">,我要找到这个if结束的地方就很难找到,而且,这个 if 有开头,可以没有结束的标志,我很担心代码复杂的时候,会不会产生歧义。

还有,代码:<table elseif="user"> 是什么意思呢? user 不是一个对象吗?怎么变成 布尔型啦?
0 请登录后投票
   发表时间:2011-09-15  
javatar 写道
javamonkey 写道
如果去掉这些html“注释”(实际上是beetl语句,但欺骗了IE和HTML Parser)
内容就是正常的HTML

注释语法很多模板语言都用的,成,以前CommonTemplate也支持,只是个人觉得HTML属性更简洁。


能说一下哪些模板语言在用注释语法么?
Beetl只是说能指定控制语句占位符,所以刚好可以用注释+别的符号,既可以当注释,又可以区别于真正的注释

使用HTML 属性,Thymeleaf里也是这么使用的。个人不觉得很简洁。而且,指令还是能被IE,HMTL Parser看到,以及被UI,尤其是js开发人员看到的。会有一定影响的
0 请登录后投票
   发表时间:2011-09-15  
现在正在使用freemarker,多向楼主学习
0 请登录后投票
   发表时间:2011-09-15  
javatar 写道

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: 
    // ...
}





System.identityHashCode(user.role),这个hashcode根据对象的地址的算的,你这样搞,会有问题的

 System.out.println(System.identityHashCode(new String("aaaa")));
	  System.out.println(System.identityHashCode(new String("aaaa")));
	  System.out.println(System.identityHashCode(new String("aaaa")));
	  System.out.println(System.identityHashCode(new String("aaaa")));
	  System.out.println(System.identityHashCode("aaaa"));
	  System.out.println(System.identityHashCode("aaaa"));


试试这段代码,呵呵。
0 请登录后投票
   发表时间:2011-09-15  
bao231 写道
System.identityHashCode(user.role),这个hashcode根据对象的地址的算的,你这样搞,会有问题的


嗯,知道identityHashCode是对象的地址,所以如果是字符串会先intern(),另外,因为条件上的"admin"和"member"是字面值,没有new String(),还有一个就是因为是实时编译,所以地址是相等的。
0 请登录后投票
   发表时间:2011-09-15  
javatar 写道
bao231 写道
System.identityHashCode(user.role),这个hashcode根据对象的地址的算的,你这样搞,会有问题的


嗯,知道identityHashCode是对象的地址,所以如果是字符串会先intern(),另外,因为条件上的"admin"和"member"是字面值,没有new String(),还有一个就是因为是实时编译,所以地址是相等的。



如果是其他integer的呢?这个包装类型都不是不一样的。

还有就是有人自定义类型冲在了equle和hashcode的方法,你能保证他们的identityHashCode一样吗?
0 请登录后投票
   发表时间:2011-09-15   最后修改:2011-09-16
javamonkey 写道
能说一下哪些模板语言在用注释语法么?

比如CommonTemplate:
http://code.google.com/p/commontemplate
commontemplate.properties
textFilters[1]=org.commontemplate.standard.coat.CommentSyntaxCoatFilter()
textFilters[1].begin=<!--
textFilters[1].end=-->

比如Smarty4j:
http://code.google.com/p/ordinary
smarty.properties:
left.delimiter=<!--
right.delimiter=-->


本来只是为了研究如何提速模板性能的,HTTL后续会多加几个语法Parser,同时解析:
文本语法:
#if()
#end

注释语法:
<!--#if()-->
<!--#end-->

标签语法:
<if test="">
</if>

属性语法:
<table if="">
</table>

任君选择。

其实,属性语法的解析是最困难的,需要识别html标签的闭合,而且有些HTML标签可能忘记闭合也要容错。
而其它几种语法,完全把HTML当文本,不用去识别HTML,用状态机只管识别指令符号就行了。

属性语法,采用html原生的标签闭合区间,减少了结束指令的声明,
而如果有很多<if>,还得一个个对应</if>,看得眼睛会有点花。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics