把TinyTemplate当成是Velocity的升级版其实也是能够的,毕竟它的语法是基到Veloccity扩展而来的,兼容度在80%以上。 html
至于TinyTemplate的实例是怎样的,且看下面: java
在Java中的可变参数使用起来很是方便,Tiny模板也对可变参有必定支持。 编辑器
#macro hello() ParameterList: ${helloParameterList.size()} #for(para:helloParameterList) hello:${para} #end #end #call("hello","aa",1,true,false)
ParameterList: 4 hello:aa hello:1 hello:true hello:false
运行结果:宏定义及其调用示例 函数
1:1 2:2 3:1 4:2 5:2解释:
首先设置abc=1,而后显示它的值,结果是1,这个是理所固然的。 工具
而后定义一个宏,在宏里设置变量abc的值为2,而后显示这个值。 布局
在调用setAbc宏的时候,果真显示出来abc的值为2,这个也是没有问题的。 性能
接下来再显示abc的值的时候,结果是1,为何呢? 开发工具
这是由于在Tiny宏中引入了变量范围的概念,也就是说在宏里面的变量是局部变量 ,对于宏外的变量没有影响。 测试
所以,在宏里的#set指令并无改变了外层的abc的值,所以第三个输出的结果是1 spa
接下来在setAbc2宏里用#!set指令进行赋值,赋值为2,所以第四个输出告终果2
因为#!set修改的是模板级的变量,因此,它就修改了外部变量的值为2,因此第五个输出的结果也是2.
好的,上面就介绍清楚了这些概念,那么问题来了:
下面的宏,输出结果是什么?
答案a:没有任何输出,答案b:输出1,亲们在下面回答下?
运行结果:
Hello1,world Hello1,world Hello2,world Hello2,world 我是附加内容 Hello3,world Hello4,world
#macro是定义宏的指令,后面哪着一个关键字做为宏的名字,括号内是参数,参数能够有多个,也能够一个没有。
在#macro当中,能够有一个占位符#bodyContent,表示调用的时候在宏头和#end之间的内容会被放在这里。
调用的时候,也有两种调法一种是“#宏名(...)”,另一种是"#@宏名(...)#end"的方式。
带@的表示是有宏体调用,不带@表示是简单调用。
与Velocity不一样,调用宏,后面必须跟小括号,不能省略。
#@hello1("world") 我是附加内容 #end上面这段有加内容,可是因为在定义宏时没有点位符,所以“我是附加内容”被忽略。
#@hello2("world") 我是附加内容 #end这里因为hello2宏定义时有#bodyContent占位符,因此就能够显示出来。
注意,宏定义,能够放在任何位置,且没有任何区别,和调用顺序没有关系,也就是能够在前面调用后面定义的宏。
也就是说
#macro hello3(name) Hello3,${name} #macro hello4(name) Hello4,${name} #end #end和
#macro hello3(name) Hello3,${name} #end #macro hello4(name) Hello4,${name} #end没有任何区别
运行结果
hello,World hello,john Good morning,World
在Tiny模板引擎中,定义宏时,能够为宏定义默认的参数值,当调用宏的时候,若是没有传入指定的值,则会取其默认值
固然下面的调用方式,也是支持的:
#hello("Good afternoon","john") #hello(info="Good afternoon","john") #hello(name="john",info="Good afternoon")
运行结果
<div class="class1"> <div class="class2"> HelloWorld </div> </div>
此功能极大的方便了宏的编写及复用,乃是本人对Velocity没法忍受之功能特性之一,在Tiny模板引擎中完美支持。
#set(abc="<b>Hello</b>") 1:${abc} 2:$!{abc}
运行结果
1:<b>Hello</b> 2:<b>Hello</b>
显示内容有两种,一种是${} 一种是$!{}
第一种是原样显示,第二种是进行html,xml转码。
##单行注释 #* 多行注释 *# #-- 多行注释 --# #** 文档注释 *#
适用于里面有许多语义冲突的内容,避免使用字符转义
运行结果:
1:info 3:info 4:info 7:info 8:info
因为abc没有定义,因此就不成立,因此就没有2:info
对于boolean类型看真假,对于非布尔型,看是否是null,若是不是null,那么就成立,因而有3:info,8:info
因为"abc"为真,true为真,!false为真,因此 真&&真||真=真,因此有4:info
由于abc=1,因此,有7:info
运行结果:
sample1:1 sample2:1 sample2:2 sample2:3 sample3:abc sample4:DefaultInfo sample5:1 sample5:2 sample5:3 sample6:1 sample6:3 sample7:1
任何对象,均可以进行循环操做。
可是不一样的对象循环时的效果不一样:
若是是null,则不执行循环体。
若是是Map,则循环变量存放其entry,能够用循环变量.key、循环变量.value的方式读取其中的值
若是是Collection或Array则循环变量放其中的元素
若是是Enumeration、Iterator,则循环变量存放其下一个变量。
若是是enum类,则循环变量存放其枚举值
不然,则把对象做为循环对象,可是只循环一次
首先写个布局文件以下:
接下来写3个页面:
下面是运行结果:
a.page
这里是A的header 这里是a文件 这里是A的Footerb.page
这里是B的header 这里是b文件 这里是B的Footerc.page
这里是c的header 这里是c文件 这里是默认的Footer
若是在页面文件中没有定义某个布局位置的内容,则使用在布局文件中默认的内容。
宏在Tiny模板引擎中有着巨大的做用,对宏的调用方式也有多种支持方式:
第一种方法:直接,方便,尽可能使用。
第二种方法:主要用于宏名是动态的时候,要调用宏名要根据参数来肯定调用哪一个的时候使用。
第三种方法:用得比较少,用于经过函数调用来进行宏渲染(这种不支持带包体调用)
另外:带@的时候,能够带包体调用(宏里有#bodyContent),不带@的时候,不带包体调用。
运行结果:
<div id="abc" style="width:800;height:600;"> Hello,World </div> Box1 <div id="box1" style="width:800;height:600;"> Box2 <div id="box2" style="width:800;height:600;"> HelloWorld </div> </div>
这样会大大方便编写宏。
若是不支持默认值 ,则在编写宏的时候,要等价的写为:
哪一个复杂、哪一个方便不辩自明
#for( i :[ 1 .. 3 ]) ${i}#eol #[ #for( j :[ 1 .. 3 ]) #t${i}*${j}={i*j}#eol #end #] #end
运行结果:
1 1*1={i*j} 1*2={i*j} 1*3={i*j} 2 2*1={i*j} 2*2={i*j} 2*3={i*j} 3 3*1={i*j} 3*2={i*j} 3*3={i*j}
说到模板开发,固然就离不开要调试,要运行。
因为通常状况下模板语言都是由Java程序驱动跑的,所以,每次都须要搞一个Java类或搭建一个Web环境来驱动它,才能运行出结果。这个对于悠然来说,是不可忍受的。所以,TinyTemplate必需要能够快速开发,快速运行。
首先编写一个模板文件
33table.page
#for(i:[1..2]) #for(j:[1..2]) ${i}*${j}=${i*j}#eol #end #end而后在资源管理器中,选中33table.page,点鼠标右键,而后选择运行方式,在运行方式里选择TinyTemplate:
在控制台就能够看到运行结果了:
1*1=1 1*2=2 2*1=2 2*2=4固然,若是想进行调试,也是能够进行调试的,只要把生成源码的目录设置成源代码目录即 可。
这个时候的开发效率,就是一个字:快;这个时候的心情,就是一个字:爽。
有时候,要测试的模板文件是须要外部参数的,这个时候怎么测试呢?
只要在运行参数中添加一段html方式URL(格式aa=1&bb=3)内容传参便可:
好比宏内容以下:
Hello,${name}
在运行窗口的参数中添加参数:
name=World
运行结果就是Hello,World
要想作一流的模板引擎,固然有一流的模板编辑器是必须的。
Tiny模板引擎推出已经有一段时间了,可是因为其语法是独立的,所以编辑只能采用通常的文本编辑器,可是编辑效率天然就低。还有一种是采用Velocity编辑器进行编辑,可是带来的问题常常会有错误的语法提示,有些语法没法正确提示,总而言之言而总之,就是很差用。那问题已经来了,咋办?答案固然是最好有一个本身的了。
如今,Tiny模板引擎的专有编辑器来了!
大纲支持,如今支持宏定义,布局定义,布局实现,变量定义四种,能够经过双击大纲树中的节点,快速定位并选定相关的内容
语法着色,这里的颜色是我本身乱配的,仅用于展现效果,后面会让美工仔细配配颜色
错误提示,当写的模板有错误的时候,在项目导航,编辑窗口及错误视图中都会同步显示:
点击编辑器前面的X,能够显示详细的错误信息:
代码折叠
语法提示
也支持模糊匹配,能够看到输入了oc,实际上就过滤了只包含包含o和c的提示内容
除了模板语言的提示,也支持Html语法的支持:
固然,对html的支持不能仅仅是支持标签,属性也要支持:
快速切换:
当用ctrl+鼠标左键点击#end时,会快速定位到对应的宏标签头部,当用ctrl+鼠标左键点击宏标签头部时,能够快速定位到对应的#end。
同名变量显示,点击一个变量时,同名变量会高亮显示
当在块头或块尾按Ctrl键时,对应的块尾或块头会高亮显示,便于快速定位。
格式化以前
格式化以后
快速注释示例
Tiny模板引擎若是从功能来讲,比Velocity强大多了;从性能来讲,是Velocity的4倍左右;从开发工具来讲,比最强大的Velocity工开工具都强。
因此,综合来讲,把TinyTemplate说成Velocity Plus仍是比较贴切的。