把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仍是比較貼切的。