项目 | Velocity代码 | TinyTemplate代码 | 比较 |
单行注释 | ##单行注释 | ##单行注释 | 效果完全相同 |
多行注释 | #*多行注释*# | #*多行注释*# #--多选注释--# | 效果完全相同 Tiny多一种 |
定义变量 | #set($a=1,$b=2) | #set(a=1,b=2) | 效果完全相同 Tiny不需要在变量前加$,更简洁 |
定义数组 | #set($a=[1..5]) | #set(a=[1..5],b=[5..1],c=[1+2..a+b]) | Tiny的起始和终止值都可以是表达式或常量 |
全局变量定义 | N/A | #!set | 如果不加!,表示在当前域内定义变量,如果加了!表示在全局定义变量,使用#!set定义的变量在整个模板都可以被访问,而#set如果定义的变量在循环体内,则只在循环体范围内可以被访问。 |
定义map | #set($a={"a" : 1, "b" : "s"}) | #set(a={"a":1,"b":"s","c":[1..5]},b={"a"+1:1,"b"+c:"s"}} 其中c是一个变量 | Tiny的键值和值都可以是各种类型的对象,并且支持各种表达式计算 |
循环 | #foreach( $item in $items) | #foreach( item in items) #for( item in items) #foreach( item : items) #for( item : items) | Tiny支持的方式多一些 所有的对象都可以用来进行进行循环 |
break | #break | #break #break(i<3) | Tiny支持条件或无条件两种方式 |
stop | #stop | #stop #stop | Tiny支持条件或无条件两种方式 |
continue | N/A | #continue #continue(i<3) | Tiny支持条件或无条件两种方式 |
evaluate | #evaluate( 'string #if(true)will be displayed#end' | ${eval('string #if(true)will be displayed#end') ${evaluate('string #if(true)will be displayed#end') | 效果完全相同 |
parse | #parse( "lecorbusier.vm" ) | #include("include-sub.vm") #include("../include-sub.vm") #include("/template/tiny/test/include-sub.vm") #include("include-sub.vm", {"myvar": "hello from parent"}) | Tiny支持传参 |
include | #include( "disclaimer.txt" "opinion.txt" ) | ${read("disclaimer.txt")} ${readContent("disclaimer.txt")} | Tiny支持各种相对和绝对地址 |
define | #define( $hello ) Hello $who #end #set( $who = "World!") $hello | #macro hello(who) hello ${who} #end #set(who = "World!") #hello(who) #hello #set(result=call("hello")) #set(result=call("hello",who)) | 运行结果完全一致 |
macro | #macro(macroName $a,$b) $bodyContent #end | #macro macroName(a,b) #bodyContent #end #macro a() #bodyContent #end #macro b() #@a() #bodyContent #end #end | 表面上是一样的,但是Tiny的性能更高,内存更少 Tiny的支持嵌套,Velocity不支持嵌套 |
macro | N/A | 通过java代码扩展宏 | |
调用宏 | #macroName("a" "b") #@macroName("a" "b") info #end | #macroName("a","b") #@macroName("a" "b") info #end #@macroName(b:"b") info #end | Tiny不仅支持顺序参数访问,还支持命名参数访问,当有时参数可以省略时更方便 |
#[[]]# | #[[]]# | #[[]]# | 完全一样 |
I18N | N/A | $${ab.key} | Tiny完美支持I18N扩展 |
$!{} | 强制非空输出 | 强制进行html转码输出 | |
call | N/A | #call("aa"+1,para1,prar2) #@call("aa"+1,para1,prar2) info #end | 有的时候宏的名字,需要根据传来的参数进行拼接之后,能知道调用的宏的名字的时候,可以通过#call指令进行调用 |
精确格式 | N/A | #b,#{b}显示空格 #t,#{t}显示缩进 #[,#{[}缩进加一层 #],#{]}缩进减一层 | 如果需要,Tiny模板引擎可以对格式进行严格输出,做控制输出为各种严格的格式。 |
模板文件加载 | 需要通过配置文件指定 | 全自动识别,无须干预 | |
布局支持 | N/A | 可以自动对页面进行多重渲染 | 这个特性使得DRY原则完全落实,也使得程序员只需要做自己需要做的一点页面就可以了,可以让整个网站无重复,而且可以使得同一个页面在不同的工程中完全融入到工程所有的页面体系中。是Tiny模板引擎中最具特色且功能强大的功能。 同时在布局文件中可以定义多个位置,每个位置都可以在子页面中进行定制化实现。 |
函数扩展 | 支持 | 支持 | |
类方法扩展 | N/A | 可以现有类或接口添加扩展方法从而扩充现有类的功能。 | 比如:给Object上增加toXml(),toJson()方法,就可以方便的生成xml或json了: ${user.toXml()} ${user.toJson()} #set(aa=user.toXml()) |
宏参数默认值 | N/A | #macro testParameter(aa=var+3, bb=123,cc) | #set(var="def") #macro testParameter(aa=var+3, bb=123,cc) aa:${aa},bb:${bb},cc:${cc} #end #set(cc="11111") #testParameter() 运行结果: aa:def3,bb:123,cc:11111 |