Tiny模板引擎(Velocity Plus)應用示例

把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

說明:在宏的包體中,有一個默認的變量,名稱就是宏的名字+ParameterList,當前例子中,宏的名字是hello,因此變量的名字就是:helloParameterList。
此變量的相似是一個List,所以能夠調用List的方法。

 Set示例

運行結果:宏定義及其調用示例 函數

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>

解說:在Tiny模板引擎中,宏定義的時候,能夠嵌套使用其它的帶帶包體的宏,而在Velocity中是不支持這樣寫的。

此功能極大的方便了宏的編寫及複用,乃是本人對Velocity沒法忍受之功能特性之一,在Tiny模板引擎中完美支持。

Tiny模板中的內容顯示

#set(abc="<b>Hello</b>")

1:${abc}
2:$!{abc}

運行結果

1:<b>Hello</b>
2:&lt;b&gt;Hello&lt;/b&gt;

說明:

顯示內容有兩種,一種是${} 一種是$!{}

第一種是原樣顯示,第二種是進行html,xml轉碼。

Tiny模板之註釋

##單行註釋

#*
多行註釋
*# 

#--
多行註釋 
--#

#**
文檔註釋
*#

Tiny模板引擎強制不解析標記


用#[[ ]]#包含起來的內容,不進行語法解析,會原樣輸出。

適用於裏面有許多語義衝突的內容,避免使用字符轉義 

Tiny模板引擎之IF

運行結果:

1:info
3:info
4:info
7:info
8:info

若是真,固然就成立了,全部有1:info

因爲abc沒有定義,因此就不成立,因此就沒有2:info

對於boolean類型看真假,對於非布爾型,看是否是null,若是不是null,那麼就成立,因而有3:info,8:info

因爲"abc"爲真,true爲真,!false爲真,因此 真&&真||真=真,因此有4:info

由於abc=1,因此,有7:info

Tiny模板語言之循環

運行結果:

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類,則循環變量存放其枚舉值
不然,則把對象做爲循環對象,可是隻循環一次

Tiny模板引擎之佈局

首先寫個佈局文件以下:

接下來寫3個頁面:

下面是運行結果:

a.page

這裏是A的header
這裏是a文件
這裏是A的Footer
b.page
這裏是B的header
這裏是b文件
這裏是B的Footer
c.page
這裏是c的header
這裏是c文件
這裏是默認的Footer

在佈局文件中,能夠用#layout指令定義佈局位置,在頁面文件中能夠經過#@layout來進行實現。

若是在頁面文件中沒有定義某個佈局位置的內容,則使用在佈局文件中默認的內容。

Tiny模板引擎之調用宏的N種寫法


解釋:

宏在Tiny模板引擎中有着巨大的做用,對宏的調用方式也有多種支持方式:

  1. #宏名,#@宏名方式
  2. #call(宏名錶達式)#@call(宏名錶達式)
  3. ${call(宏名錶達式)}

第一種方法:直接,方便,儘可能使用。

第二種方法:主要用於宏名是動態的時候,要調用宏名要根據參數來肯定調用哪一個的時候使用。

第三種方法:用得比較少,用於經過函數調用來進行宏渲染(這種不支持帶包體調用)

另外:帶@的時候,能夠帶包體調用(宏裏有#bodyContent),不帶@的時候,不帶包體調用。

Tiny模板引擎之宏默認值

運行結果:

<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>



解釋:只要在聲明宏的時候指定了默認參數,可是在實際使用的時候沒有指定,或者指定了,可是是null,則都會使用默認值進行使用。


這樣會大大方便編寫宏。

若是不支持默認值 ,則在編寫宏的時候,要等價的寫爲:

哪一個複雜、哪一個方便不辯自明

Tiny模板引擎之格式嚴格控制

#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}

解說,經過上面的標記能夠對格式進行格式控制,這樣就能夠輸出本身指望的結果,而沒必要擔憂有一些模板控制指令周邊的空格影響結果。

如何快速編寫並運行Tiny模板

說到模板開發,固然就離不開要調試,要運行。

因爲通常狀況下模板語言都是由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模板引擎之配套開發工具

要想作一流的模板引擎,固然有一流的模板編輯器是必須的。

Tiny模板引擎推出已經有一段時間了,可是因爲其語法是獨立的,所以編輯只能採用通常的文本編輯器,可是編輯效率天然就低。還有一種是採用Velocity編輯器進行編輯,可是帶來的問題常常會有錯誤的語法提示,有些語法沒法正確提示,總而言之言而總之,就是很差用。那問題已經來了,咋辦?答案固然是最好有一個本身的了。

如今,Tiny模板引擎的專有編輯器來了!

特性介紹

  1. 大綱支持:支持在大綱當中顯示一些關鍵內容,並能夠快速定位
  2. 語法高亮:支持在編輯器中,根據語法進行着色,使得代碼更容易閱讀和排錯
  3. 錯誤提示:若是模板語言存在錯誤,則能夠在工程導航、錯誤視圖及編輯窗口進行錯誤提示
  4. 代碼摺疊:支持對代碼塊進行代碼摺疊,方便查閱
  5. 語法提示:支持Tiny模板引擎語法提示及Html語法提示方便快速錄入
  6. 快速定位:支持Tiny模板中開始語句與結束語句間快速切換
  7. 變量快速提示:點鼠標點擊某變量時,會高亮顯示文件中的全部同名變量
  8. 宏定義對應位置顯示:在tiny塊處理的標籤頭部按ctrl時,會高亮顯示與其對應的#end,反之亦然
  9. 格式化:能夠按快捷鍵ctrl+shift+F進行格式化了
  10. 註釋處理:能夠按快捷鍵ctrl+/來進行快速設置單行註釋或取消單行註釋,能夠按ctrl+shift+/來進行快速設置塊註釋或取消塊註釋

截圖介紹

大綱支持,如今支持宏定義,佈局定義,佈局實現,變量定義四種,能夠經過雙擊大綱樹中的節點,快速定位並選定相關的內容

語法着色,這裏的顏色是我本身亂配的,僅用於展現效果,後面會讓美工仔細配配顏色

錯誤提示,當寫的模板有錯誤的時候,在項目導航,編輯窗口及錯誤視圖中都會同步顯示:

點擊編輯器前面的X,能夠顯示詳細的錯誤信息:

代碼摺疊

語法提示

也支持模糊匹配,能夠看到輸入了oc,實際上就過濾了只包含包含o和c的提示內容

除了模板語言的提示,也支持Html語法的支持:

固然,對html的支持不能僅僅是支持標籤,屬性也要支持:

快速切換:

當用ctrl+鼠標左鍵點擊#end時,會快速定位到對應的宏標籤頭部,當用ctrl+鼠標左鍵點擊宏標籤頭部時,能夠快速定位到對應的#end。

同名變量顯示,點擊一個變量時,同名變量會高亮顯示

當在塊頭或塊尾按Ctrl鍵時,對應的塊尾或塊頭會高亮顯示,便於快速定位。

格式化以前

格式化以後

快速註釋示例

總結

Tiny模板引擎若是從功能來講,比Velocity強大多了;從性能來講,是Velocity的4倍左右;從開發工具來講,比最強大的Velocity工開工具都強。

因此,綜合來講,把TinyTemplate說成Velocity Plus仍是比較貼切的。
相關文章
相關標籤/搜索