§和 Velocity 的比较
jetbrick-template 的指令和老牌的模板引擎 Velocity 是非常相似的。
§1. 语法差异
- jetbrick-template 指令中的变量不加
$符,只支持#if(x == y),不支持#if($x == $y),因为指令中没有加引号的字符串就是变量,和 Java 语法一样,没有加$的必要。 - jetbrick-template 占位符必需加大括号,只支持
${foo},不支持$foo,因为$在 JavaScript 中也是合法变量名符号,而${}不是,避免混淆。 - jetbrick-template 占位符当变量为
null时输出空白串,而不像 Velocity 那样原样输出指令原文,即${foo},等价于 Velocity 的$!{foo},以免表达式源码泄漏。 - jetbrick-template 支持在所有使用变量的地方,进行表达式计算,也就是你不需要像 Velocity 那样,先
#set($j = $i + 1)到一个临时变量,再输出临时变量${j},jetbrick-template 可以直接输出${i + 1},其它指令也一样,比如:#if(i + 1 == n)。 - jetbrick-template 采用扩展 Class 原生方法的方式,如:
${"str".toChar()},而不像 Velocity 的 Tool 工具方法那样:$(StringTool.toChar("a")),这样的调用方式更直观,更符合代码书写习惯。 - jetbrick-template 支持属性和方法的安全调用 (
safecall=true)。如${user.name},${user.hasRole("vip")}。如果user对象为null,那么返回结果就是null,不会出现烦人的NullPointerException。 - jetbrick-template 还支持静态字段/方法调用,函数扩展,自定义标签等等。
§2. 指令差异
| velocity | jetbrick-template | 异同 | 功能 | 变化 |
|---|---|---|---|---|
| ${foo.bar} $foo.bar |
${foo.bar} | 相同 | 输出占位符 | jetbrick-template 大括号必需 |
| $!{foo.bar} $!foo.bar |
$!{foo.bar} | 不同 | 空值不显示源码 | velocity 为空值不显示源码 jetbrick-template 改为HTML过滤输出 |
| ## ... #* ... *# |
## ... #// ... #-- ... --# |
相似 | 注释 | 块注释格式不一样 |
| #[[ ... ]]# | #[[ ... ]]# | 相同 | 不解析文本块 | |
| \# \$ \\ | \# \$ \\ | 相同 | 特殊字符转义 | |
| n/a | #define(Type foo = bar) | 新增 | 给变量声明类型 | |
| #set($foo = $bar) | #set([Type] foo = bar) | 相同 | 给变量赋值 | 可带类型声明 |
| n/a | #return ( obj ) | 新增 | 返回子模板变量给父模板 | |
| #if($foo == $bar) | #if(foo == bar) | 相同 | 条件判断 | |
| #elseif($foo == $bar) | #elseif(foo == bar) | 相同 | 否定条件判断 | |
| #else | #else | 相同 | 否定判断 | |
| #end | #end | 相同 | 结束指令 | |
| #foreach($item in $list) | #for(item : list) #for(Type item : list) |
相似 | 循环指令 | 改为Java格式,可以带类型声明 |
| #break | #break #break(foo == bar) |
相同 | 中断循环 | 可以直接带条件 |
| n/a | #continue #continue(foo == bar) |
新增 | 继续下一个循环 | 可以直接带条件 |
| #stop | #stop #stop(foo == bar) |
相同 | 停止模板解析 | 可以直接带条件 |
| #macro($foo) | #macro foo(...) | 相似 | 可复用模板片段宏 | |
| #macro_name($) | #call macro_name(...) | 相似 | 调用模板片段宏 | 采用 #call, 更清晰 |
| n/a | #tag foo(...) | 新增 | 自定义标签 | jetbrick-template 允许自定义标签 |
| #include("foo.txt") | fileGet("foo.txt") | 不同 | 读取文本文件内容 | jetbrick-template 用扩展函数实现 |
| #parse("foo.vm") | #include("foo.jetx") #include("foo.jetx", args) |
相似 | 调用子模板 | jetbrick-template 支持私有参数传递 |
| #evaluate("${1 + 2}") | n/a | 不同 | 模板求值 | jetbrick-tempate 不支持 |
| n/a | #options(...) | 新增 | 模板选项 | jetbrick-tempate 支持独立的模板选项 |