锁定老帖子 主题:比Velocity快10倍的模板引擎
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-09-15
哥哥你的测试靠谱吗?
|
|
返回顶楼 | |
发表时间:2011-09-15
javamonkey 写道 如果去掉这些html“注释”(实际上是beetl语句,但欺骗了IE和HTML Parser)
内容就是正常的HTML 注释语法很多模板语言都用的,成,以前CommonTemplate也支持,只是个人觉得HTML属性更简洁。 |
|
返回顶楼 | |
发表时间:2011-09-15
cnrainbing 写道 哥哥你的测试靠谱吗?
测试代码是公开的,你可以看一下,如果发现有问题,也可以改。 |
|
返回顶楼 | |
发表时间:2011-09-15
httl 和 html 混合在一起,一开始感觉很有趣,但仔细看猴就发现问题了,我感觉最大的问题是阅读比较困难。
比如,<table if="user.role == 'admin'">,我要找到这个if结束的地方就很难找到,而且,这个 if 有开头,可以没有结束的标志,我很担心代码复杂的时候,会不会产生歧义。 还有,代码:<table elseif="user"> 是什么意思呢? user 不是一个对象吗?怎么变成 布尔型啦? |
|
返回顶楼 | |
发表时间:2011-09-15
javatar 写道 javamonkey 写道 如果去掉这些html“注释”(实际上是beetl语句,但欺骗了IE和HTML Parser)
内容就是正常的HTML 注释语法很多模板语言都用的,成,以前CommonTemplate也支持,只是个人觉得HTML属性更简洁。 能说一下哪些模板语言在用注释语法么? Beetl只是说能指定控制语句占位符,所以刚好可以用注释+别的符号,既可以当注释,又可以区别于真正的注释 使用HTML 属性,Thymeleaf里也是这么使用的。个人不觉得很简洁。而且,指令还是能被IE,HMTL Parser看到,以及被UI,尤其是js开发人员看到的。会有一定影响的 |
|
返回顶楼 | |
发表时间:2011-09-15
现在正在使用freemarker,多向楼主学习
|
|
返回顶楼 | |
发表时间: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")); 试试这段代码,呵呵。 |
|
返回顶楼 | |
发表时间:2011-09-15
bao231 写道 System.identityHashCode(user.role),这个hashcode根据对象的地址的算的,你这样搞,会有问题的
嗯,知道identityHashCode是对象的地址,所以如果是字符串会先intern(),另外,因为条件上的"admin"和"member"是字面值,没有new String(),还有一个就是因为是实时编译,所以地址是相等的。 |
|
返回顶楼 | |
发表时间:2011-09-15
javatar 写道 bao231 写道 System.identityHashCode(user.role),这个hashcode根据对象的地址的算的,你这样搞,会有问题的
嗯,知道identityHashCode是对象的地址,所以如果是字符串会先intern(),另外,因为条件上的"admin"和"member"是字面值,没有new String(),还有一个就是因为是实时编译,所以地址是相等的。 如果是其他integer的呢?这个包装类型都不是不一样的。 还有就是有人自定义类型冲在了equle和hashcode的方法,你能保证他们的identityHashCode一样吗? |
|
返回顶楼 | |
发表时间: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>,看得眼睛会有点花。 |
|
返回顶楼 | |