上一篇帖子:[url]http://www.iteye.com/topic/1114669[/url],本来只是想试验模板引擎性能优化,没想到骂声最多的是HTML属性语法,所以在0.2.0版本加上了HTML注释语法,指令仿Velocity,如:
上面的HTTL模板等价于Velocity模板:
[b]与Velocity的区别:[/b]
(1) HTTL指令必需加注释外壳“<!-- -->”,只支持<!--#if()-->,不支持#if(),确保不干扰HTML本身的有效源码。
(2) HTTL指令中的变量不加$符,只支持(book in books),不支持($book in $books),因为指令中没有加引号的字符串就是变量,和常规语言的语法一样,加$有点废话。
(3) HTTL占位符必需加大括号“{ }”,只支持${aaa},不支持$aaa,因为$在JavaScript中也是合法变量名符号,而${}不是,减少混淆,也防止多人开发时,有人加大括号,有人不加,干脆没得选,都加,保持一致。
(4) HTTL与Velocity指令对比:
[table]
| HTTL | Velocity | 异同 | 功能 |
| ${xxx.yyy} | ${xxx.yyy} | 相同 | 输出占位符 |
| <!--## ... --> | #* ... *# | 相似 | 不显示注释块 |
| <![CDATA[## ... ]]> | #[[ ... ]]# | 相似 | 不解析文本块 |
| <!--#var(Xxx xxx)--> | 不支持 | 不同 | 定义输入参数类型 |
| <!--#set(xxx = yyy)--> | #set($xxx = $yyy) | 相同 | 给变量赋值 |
| <!--#if(xxx == yyy)--> | #if($xxx == $yyy) | 相同 | 条件判断 |
| <!--#elseif(xxx == yyy)--> | #elseif($xxx == $yyy) | 相同 | 否则条件判断 |
| <!--#else--> | #else | 相同 | 否则判断 |
| <!--#end--> | #end | 相同 | 结束指令 |
| <!--#foreach(item in list)--> | #foreach($item in $list) | 相同 | 列表循环 |
| <!--#breakif(xxx == yyy)--> | #if($xxx == $yyy) #break #end | 相似 | 中断循环 |
| <!--#block(xxx)--> | #define($xxx) | 相似 | 捕获块输出到变量中 |
| <!--#macro(xxx)--> | #macro($xxx) | 相似 | 宏替换,模板片断 |
| ${read("xxx.txt")} | #include("xxx.txt") | 相似 | 读取文本文件内容 |
| ${include("xxx.httl")} | #parse("xxx.vm") | 相似 | 包含另一模板输出 |
| ${evaluate("1 + 2")} | #evaluate("1 + 2") | 相似 | 表达式求值 |
| 不支持 | #stop | 不同 | 停止模板解析 |
[/table]
HTTL保持最小指令集,以后也不会增加指令,所有功能均从表达式上扩展。
[b]语法解析器配置:[/b]
(1) 配置使用注释语法:
[code]
parser=com.googlecode.httl.support.parsers.CommentParser
[/code]
语法示例:
(2) 如果想使用属性语法,请在httl.properties中配置:
[code]
parser=com.googlecode.httl.support.parsers.AttributeParser
[/code]
语法示例:
(3) 如果想使用原CommonTemplate语法,请在httl.properties中配置:
[code]
parser=com.googlecode.httl.support.parsers.CommonTemplateParser
[/code]
语法示例:
(4) 如果想同时使用多种语法,请在httl.properties中配置:
[code]
parser=com.googlecode.httl.support.parsers.MultiParser
parsers=com.googlecode.httl.support.parsers.AttributeParser,com.googlecode.httl.support.parsers.CommentParser
[/code]
语法示例:
[b]下载地址:[/b]
[url]http://code.google.com/p/httl/downloads/list[/url]
[b]HTTL0.2.0版本变更记录:[/b]
1. 增加注释语法并设为缺省,如:<!--#if(...)-->
2. 支持热加载,当文件变更时,自动重新加载,配置:reloadable=true
3. 支持启动时预编译,配置:precompiled=true
4. 异常信息显示出错位置周边内容,更容易排错
5. 支持注释块,不解释块,特殊符转义,如:\#, \$
6. 支持include,read,evaluate函数(可自行扩展),如:${include("xxx.httl")]
7. 支持集合泛型参数,如:#define(List<Book> books)
8. 自动空指针检测,比如:${user.role},当user为null时不会空指针
9. 自动条件补全,比如:#if(books)等价于#if(books != null && books.size > 0)
10. 支持foreach状态栈,多层foreach时,可通过${foreach.parent.index}获取上层foreach状态
11. 允许设置foreach状态变量名
12. 支持方括号数组,如:#foreach(c in [a, b, c])
13. 支持双点号序列,如:#foreach(c in a..c)或#foreach(i in 1..2)或#foreach(day in "Monday".."Sunday")
14. 支持集合或运算,选择不为空的集合,如:#foreach(book in books1 | books2)
15. 支持Date类型比较,如:#if(date1 > date2)
16. 支持new操作,如:${new Date()}
17. 支持强制转型,如:#set(user = (User) param)
18. 增加HttlServlet,支持将请求经过MVC框架处理并填充request属性后forward到HttlServlet进行页面渲染
19. 兼容JDK1.5,需配置:compiler=com.googlecode.httl.support.compilers.JavassistCompiler
<!--#var(User user, Book[] books)-->
<!--#if(user.role == "admin")-->
<table>
<!--#foreach(book in books)-->
<tr>
<td>${book.title}</td>
</tr>
<!--#end-->
</table>
<!--#end-->
上面的HTTL模板等价于Velocity模板:
#if($user.role == "admin")
<table>
#foreach($book in $books)
<tr>
<td>${book.title}</td>
</tr>
#end
</table>
#end
[b]与Velocity的区别:[/b]
(1) HTTL指令必需加注释外壳“<!-- -->”,只支持<!--#if()-->,不支持#if(),确保不干扰HTML本身的有效源码。
(2) HTTL指令中的变量不加$符,只支持(book in books),不支持($book in $books),因为指令中没有加引号的字符串就是变量,和常规语言的语法一样,加$有点废话。
(3) HTTL占位符必需加大括号“{ }”,只支持${aaa},不支持$aaa,因为$在JavaScript中也是合法变量名符号,而${}不是,减少混淆,也防止多人开发时,有人加大括号,有人不加,干脆没得选,都加,保持一致。
(4) HTTL与Velocity指令对比:
[table]
| HTTL | Velocity | 异同 | 功能 |
| ${xxx.yyy} | ${xxx.yyy} | 相同 | 输出占位符 |
| <!--## ... --> | #* ... *# | 相似 | 不显示注释块 |
| <![CDATA[## ... ]]> | #[[ ... ]]# | 相似 | 不解析文本块 |
| <!--#var(Xxx xxx)--> | 不支持 | 不同 | 定义输入参数类型 |
| <!--#set(xxx = yyy)--> | #set($xxx = $yyy) | 相同 | 给变量赋值 |
| <!--#if(xxx == yyy)--> | #if($xxx == $yyy) | 相同 | 条件判断 |
| <!--#elseif(xxx == yyy)--> | #elseif($xxx == $yyy) | 相同 | 否则条件判断 |
| <!--#else--> | #else | 相同 | 否则判断 |
| <!--#end--> | #end | 相同 | 结束指令 |
| <!--#foreach(item in list)--> | #foreach($item in $list) | 相同 | 列表循环 |
| <!--#breakif(xxx == yyy)--> | #if($xxx == $yyy) #break #end | 相似 | 中断循环 |
| <!--#block(xxx)--> | #define($xxx) | 相似 | 捕获块输出到变量中 |
| <!--#macro(xxx)--> | #macro($xxx) | 相似 | 宏替换,模板片断 |
| ${read("xxx.txt")} | #include("xxx.txt") | 相似 | 读取文本文件内容 |
| ${include("xxx.httl")} | #parse("xxx.vm") | 相似 | 包含另一模板输出 |
| ${evaluate("1 + 2")} | #evaluate("1 + 2") | 相似 | 表达式求值 |
| 不支持 | #stop | 不同 | 停止模板解析 |
[/table]
HTTL保持最小指令集,以后也不会增加指令,所有功能均从表达式上扩展。
[b]语法解析器配置:[/b]
(1) 配置使用注释语法:
[code]
parser=com.googlecode.httl.support.parsers.CommentParser
[/code]
语法示例:
<!--#if(user.role == "admin")-->
<!--#end-->
(2) 如果想使用属性语法,请在httl.properties中配置:
[code]
parser=com.googlecode.httl.support.parsers.AttributeParser
[/code]
语法示例:
<table if="user.role == 'admin'">
</table>
(3) 如果想使用原CommonTemplate语法,请在httl.properties中配置:
[code]
parser=com.googlecode.httl.support.parsers.CommonTemplateParser
[/code]
语法示例:
$if{user.role == "admin"}
$end
(4) 如果想同时使用多种语法,请在httl.properties中配置:
[code]
parser=com.googlecode.httl.support.parsers.MultiParser
parsers=com.googlecode.httl.support.parsers.AttributeParser,com.googlecode.httl.support.parsers.CommentParser
[/code]
语法示例:
<!--#if(user.role == "admin")-->
<table if="user.role == 'admin'">
</table>
<!--#end-->
[b]下载地址:[/b]
[url]http://code.google.com/p/httl/downloads/list[/url]
[b]HTTL0.2.0版本变更记录:[/b]
1. 增加注释语法并设为缺省,如:<!--#if(...)-->
2. 支持热加载,当文件变更时,自动重新加载,配置:reloadable=true
3. 支持启动时预编译,配置:precompiled=true
4. 异常信息显示出错位置周边内容,更容易排错
5. 支持注释块,不解释块,特殊符转义,如:\#, \$
6. 支持include,read,evaluate函数(可自行扩展),如:${include("xxx.httl")]
7. 支持集合泛型参数,如:#define(List<Book> books)
8. 自动空指针检测,比如:${user.role},当user为null时不会空指针
9. 自动条件补全,比如:#if(books)等价于#if(books != null && books.size > 0)
10. 支持foreach状态栈,多层foreach时,可通过${foreach.parent.index}获取上层foreach状态
11. 允许设置foreach状态变量名
12. 支持方括号数组,如:#foreach(c in [a, b, c])
13. 支持双点号序列,如:#foreach(c in a..c)或#foreach(i in 1..2)或#foreach(day in "Monday".."Sunday")
14. 支持集合或运算,选择不为空的集合,如:#foreach(book in books1 | books2)
15. 支持Date类型比较,如:#if(date1 > date2)
16. 支持new操作,如:${new Date()}
17. 支持强制转型,如:#set(user = (User) param)
18. 增加HttlServlet,支持将请求经过MVC框架处理并填充request属性后forward到HttlServlet进行页面渲染
19. 兼容JDK1.5,需配置:compiler=com.googlecode.httl.support.compilers.JavassistCompiler