Velocity
是一個基於java
的模板引擎(template engine)
。它容許任何人僅僅簡單的使用模板語言(template language)
來引用由java
代碼定義的對象。 當Velocity
應用於web
開發時,界面設計人員能夠和java
程序開發人員同步開發一個遵循MVC
架構的web
站點,也就是說,頁面設計人員能夠只 關注頁面的顯示效果,而由java
程序開發人員關注業務邏輯編碼。Velocity
將java
代碼從web
頁面中分離出來,這樣爲web
站點的長期維護提 供了便利,同時也爲咱們在JSP
和PHP
以外又提供了一種可選的方案。php
#set($name = "hello")
說明:velocity
中變量是弱類型的。前端
當使用#set
指令時,括在雙引號中的字面字符串將解析和從新解釋,以下所示:java
#set($directoryRoot = "www" ) #set($templateName = "index.vm" ) #set($template = "$directoryRoot/$templateName" ) $template
輸出將會是:www/index.vm
python
注:在velocity
中使用$2.5
這樣的貨幣標識是沒有問題得的,由於velocity
中的變量老是以一個大寫或者小寫的字母開始的。程序員
${name}
,也能夠寫成:$name
。提倡用前面的寫法。web
例如:你但願經過一個變量$vice
來動態的組織一個字符串。面試
Jack is a $vicemaniac.小程序
原本變量是$vice
如今卻變成了$vicemaniac
,這樣Veloctiy
就不知道您到底要什麼了。因此,後端
應該使用規範的格式書寫 : Jack is a ${vice}maniac
微信小程序
如今Velocity
知道變量是$vice
而不是$vicemaniac
。
注意:當引用屬性的時候不能加{}
$name="hello"
賦值的左邊必須是一個變量或者是屬性引用。右邊能夠是下面六種類型之一:
變量引用,字面字符串,屬性引用,方法引用,字面數字,數組列表。
下面的例子演示了上述的每種類型:
#set( $monkey = $bill ) ## variable reference #set( $monkey.Friend = "monica" ) ## string #set( $monkey.Blame = $whitehouse.Leak ) ## property reference #set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference #set( $monkey.Number = 123 ) ##number #set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList
注意:
①若是上述例子中的右值是null
, 則左值不會被賦值,也就是說會保留之前的值。
②velocity
模板中未被定義的變量將被認爲是一個字符串。例如:
#set($foo = "gibbous") $moon = $foo
輸出結果爲:
$moon = gibbous
③velocity
模板中不會將reference
解釋爲對象的實例變量。例如:$foo.Name
將被解
釋爲Foo
對象的getName()
方法,而不是Foo
對象的Name
實例變量。例如:
$foo.getBar() 等同於$foo.Bar ; $data.getUser("jon") 等同於$data.User("jon") ; data.getRequest().getServerName() 等同於 $data.Request.ServerName等同於${data.Request.ServerName}
#foreach ($element in $list) This is $element. $velocityCount #end
例子:
#set( $list = ["pine", "oak", "maple"]) #foreach ($element in $list) $velocityCount This is $element. #end
輸出的結果爲:
1 This is pine. 2 This is oak. 3 This is maple.
每次循環$list中的一個值都會賦給$element
變量。
$list
能夠是一個Vector、Hashtable
或者Array
。分配給$element
的值是一個java
對象,而且能夠經過變量被引用。
例如:若是$element t
是一個java
的Product
類,而且這個產品的名字能夠經過調用他的getName()
方法獲得。
#foreach ( $key in $list.keySet()) Key: $key -> Value: $list.get($key) <br> #end
提示:velocity
中大小寫敏感。
Velocity
還特別提供了獲得循環次數的方法,$velocityCount
變量的名字是Velocity
默認的名字。
例子:
First example: #foreach ( $foo in [1..5] ) $foo #end Second example: #foreach ( $bar in [2..-2] ) $bar #end Third example: #set ( $arr = [0..1] ) #foreach ( $i in $arr ) $i #end
上面三個例子的輸出結果爲:
First example: 1 2 3 4 5 Second example: 2 1 0 -1 -2 Third example: 0 1
#if (condition) #elseif (condition) #else #end
#foreach ($element in $list) ## inner foreach 內循環 #foreach ($element in $list) This is $element. $velocityCount <br>inner<br> #end ## inner foreach 內循環結束 ## outer foreach This is $element. $velocityCount <br>outer<br> #end
語句中也能夠嵌套其餘的語句,如#if…#else…#end
等。
## This is a single line comment.
#* Thus begins a multi-line comment. Online visitors won’t see this text because the Velocity Templating Engine will ignore it. *#
#** This is a VTL comment block and may be used to store such information as the document author and versioning information: @version 1.1 @author xiao *#
Velocity
也具備邏輯AND, OR
和 NOT
操做符。
如
## example for AND #if($foo && $bar)<strong>This and that</strong> #end
例子中#if()
指令僅在$foo
和$bar
都爲真的時候才爲真。若是$foo
爲假,則表達式也爲假;
而且 $bar
將不被求值。若是 $foo
爲真,Velocity
模板引擎將繼續檢查$bar
的值,若是 $bar
爲真,則整個表達式爲真。而且輸出This AND that
。若是 $bar
爲假,將沒有輸出由於整
個表達式爲假。
Velocity中的宏咱們能夠理解爲函數。
①宏的定義
#macro(宏的名稱 $參數1 $參數2 …) 語句體(即函數體) #end
②宏的調用
#宏的名稱($參數1 $參數2 …) 說明:參數之間用空格隔開。
中止執行模板引擎並返回,把它應用於debug
是頗有幫助的。
#include
和#parse
的做用都是引入本地文件, 爲了安全的緣由,被引入的本地文件只能在
TEMPLATE_ROOT
目錄下。
區別:
若是您須要引入多個文件,能夠用逗號分隔就行:
#include ("one.gif", "two.txt", "three.htm" )
在括號內能夠是文件名,可是更多的時候是使用變量的:
#include ( 「greetings.txt」, $seasonalstock )
而#parse
引入的文件內容Velocity
將解析其中的velocity
語法並移交給模板,意思就是說
至關與把引入的文件copy
到文件中。
#parse
是能夠遞歸調用的,例如:若是dofoo.vm
包含以下行:
Count down.<br> #set ($count = 8) #parse ("parsefoo.vm") <br>All done with dofoo.vm!
那麼在parsefoo.vm
模板中,你能夠包含以下VTL
:
$count #set($count = $count - 1) #if ( $count > 0 )<br> #parse( "parsefoo.vm" ) #else <br>All done with parsefoo.vm! #end
的顯示結果爲:
Count down. 8 7 6 5 4 3 2 1 0 All done with parsefoo.vm! All done with dofoo.vm!
注意:在vm
中使用#parse
來嵌套另一個vm
時的變量共享問題。如:
->a.vm 裏嵌套 b.vm; ->a.vm 裏定義了變量 $param; ->b.vm 裏能夠直接使用$param,無任何限制。
但須要特別注意的是,若是b.vm
裏同時定義有變量$param
,則b.vm
裏將使用b.vm
裏定義的值。
若是reference
被定義,兩個’\’
意味着輸出一個’\’
,若是未被定義,剛按原樣輸出。
如:
#set($email = "foo" ) $email \$emai l\\$email \\\$email
輸出:
foo $email \foo \$email
若是$email
未定義
$email \$email \\$email \\\$email
輸出:
$email \$email \\$email \\$email
Velocity
內置了一些對象,在vm
模版裏能夠直接調用,列舉以下:
$request、$response、$session
,另外,模板內還可使用 $msg
內的消息工
具訪問 Struts
的國際化資源,達到簡便實現國際化的方法。
對數組的訪問在Velocity
中存在問題,由於Velocity
只能訪問對象的方法,而數組
又是一個特殊的Array
,因此雖然數組能夠進行循環列舉,但卻不能定位訪問特定
位置的元素,如 strs[2]
,數組對固定位置元素的訪問調用了Array
的反射方法
get(Object array, int index)
,而Velocity
沒能提供這樣的訪問,因此數組要麼改爲
List
等其餘類容器的方式來包裝,要麼就經過公用Util
類的方式來提供,傳入數組
對象和要訪問的位置參數,從而達到返回所需值的目的。
Velocity
能夠被應用在各類各樣的情景下,本文介紹的只是它的一種用途而已,它還能夠被用來作 MVC
結構中的view
層,或者動態內容靜態化等。另外,Velocit
y 並非惟一的模板框架,一樣很優秀的 Freemarker、Thymeleaf
也得到了很是普遍的應用,有興趣的讀者能夠去深刻研究更多的功能和用途。
歡迎關注、喜歡、和點贊後續將推出更多的工具集教程,敬請期待。
歡迎關注個人微信公衆號獲取更多更全的學習資源,視頻資料,技術乾貨!
公衆號回覆「學習」,拉你進程序員技術討論羣,乾貨資源第一時間分享。
公衆號回覆「視頻」,領取800GJava視頻學習資源。
公衆號回覆「全棧」,領取1T前端,Java,產品經理,微信小程序,Python等資源合集大放送。
公衆號回覆「慕課」,領取1T慕課實戰學習資源。
公衆號回覆「實戰」,領取750G項目實戰學習資源。
公衆號回覆「面試」,領取8G面試實戰學習資源。