工具集核心教程 | 第四篇: Velocity模板引擎入門到進階

Velocity是一個基於java的模板引擎(template engine)。它容許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。 當Velocity應用於web開發時,界面設計人員能夠和java程序開發人員同步開發一個遵循MVC架構的web站點,也就是說,頁面設計人員能夠只 關注頁面的顯示效果,而由java程序開發人員關注業務邏輯編碼。Velocityjava代碼從web頁面中分離出來,這樣爲web站點的長期維護提 供了便利,同時也爲咱們在JSPPHP以外又提供了一種可選的方案。php

Velocity腳本語法摘要

1. 變量

(1)變量的定義:

#set($name = "hello") 說明:velocity中變量是弱類型的。前端

當使用#set 指令時,括在雙引號中的字面字符串將解析和從新解釋,以下所示:java

#set($directoryRoot = "www" )

#set($templateName = "index.vm" )

#set($template = "$directoryRoot/$templateName" )

$template

輸出將會是:www/index.vmpython

注:在velocity中使用$2.5這樣的貨幣標識是沒有問題得的,由於velocity中的變量老是以一個大寫或者小寫的字母開始的。程序員

(2)變量規範的寫法

${name} ,也能夠寫成:$name。提倡用前面的寫法。web

例如:你但願經過一個變量$vice來動態的組織一個字符串。面試

  Jack is a $vicemaniac.小程序

原本變量是$vice如今卻變成了$vicemaniac,這樣Veloctiy就不知道您到底要什麼了。因此,後端

應該使用規範的格式書寫 : Jack is a ${vice}maniac微信小程序

如今Velocity知道變量是$vice而不是$vicemaniac

注意:當引用屬性的時候不能加{}

(3)變量的賦值:

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

2. 循環

#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是一個javaProduct類,而且這個產品的名字能夠經過調用他的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

3. 條件語句

#if (condition)

#elseif (condition)

#else

 #end

4. 語句的嵌套

#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等。

5. 註釋

(1)單行註釋:

 ## This is a single line comment.

(2)多行註釋:

#*

 Thus begins a multi-line comment. Online visitors won’t

 see this text because the Velocity Templating Engine will

 ignore it.

 *#

(3)文檔格式:

#**

 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

*#

6. 關係和邏輯操做符

Velocity 也具備邏輯AND, ORNOT 操做符。

## 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 爲假,將沒有輸出由於整

個表達式爲假。

7.Velocity 中的宏

Velocity中的宏咱們能夠理解爲函數。

①宏的定義

#macro(宏的名稱 $參數1 $參數2 …)

       語句體(即函數體)

#end

②宏的調用

#宏的名稱($參數1 $參數2 …)

       說明:參數之間用空格隔開。

8.#stop

 中止執行模板引擎並返回,把它應用於debug是頗有幫助的。

9.#include與#parse

#include#parse的做用都是引入本地文件, 爲了安全的緣由,被引入的本地文件只能在

TEMPLATE_ROOT目錄下。

區別:

(1) 與#include不一樣的是,#parse只能指定單個對象。而#include能夠有多個

若是您須要引入多個文件,能夠用逗號分隔就行:

#include ("one.gif", "two.txt", "three.htm" )

在括號內能夠是文件名,可是更多的時候是使用變量的:

#include ( 「greetings.txt」, $seasonalstock )

(2) #include被引入文件的內容將不會經過模板引擎解析;

 而#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裏定義的值。

10.轉義字符''的使用

若是reference被定義,兩個’\’意味着輸出一個’\’,若是未被定義,剛按原樣輸出。

如:

#set($email = "foo" )

$email

\$emai

l\\$email

\\\$email

輸出:

foo

$email

\foo

\$email

若是$email 未定義

$email

\$email

\\$email

\\\$email

輸出:

$email

\$email

\\$email

\\$email

11.內置對象

Velocity內置了一些對象,在vm模版裏能夠直接調用,列舉以下:

$request、$response、$session,另外,模板內還可使用 $msg內的消息工

具訪問 Struts 的國際化資源,達到簡便實現國際化的方法。

12. 數組訪問

對數組的訪問在Velocity中存在問題,由於Velocity只能訪問對象的方法,而數組

又是一個特殊的Array,因此雖然數組能夠進行循環列舉,但卻不能定位訪問特定

位置的元素,如 strs[2],數組對固定位置元素的訪問調用了Array的反射方法

get(Object array, int index),而Velocity沒能提供這樣的訪問,因此數組要麼改爲

List等其餘類容器的方式來包裝,要麼就經過公用Util類的方式來提供,傳入數組

對象和要訪問的位置參數,從而達到返回所需值的目的。

結束語

Velocity 能夠被應用在各類各樣的情景下,本文介紹的只是它的一種用途而已,它還能夠被用來作 MVC 結構中的view 層,或者動態內容靜態化等。另外,Velocity 並非惟一的模板框架,一樣很優秀的 Freemarker、Thymeleaf 也得到了很是普遍的應用,有興趣的讀者能夠去深刻研究更多的功能和用途。

附錄及參考文獻

寫在最後

歡迎關注喜歡、和點贊後續將推出更多的工具集教程,敬請期待。
歡迎關注個人微信公衆號獲取更多更全的學習資源,視頻資料,技術乾貨!
歡迎掃碼關注

公衆號回覆「學習」,拉你進程序員技術討論羣乾貨資源第一時間分享。

公衆號回覆「視頻」,領取800GJava視頻學習資源。
java學習全套
820G資源

公衆號回覆「全棧」,領取1T前端Java產品經理微信小程序Python等資源合集大放送。
全棧資料
java
python
機器學習
產品經理
接近1T資源

公衆號回覆「慕課」,領取1T慕課實戰學習資源。
慕課實戰大全
php
python
測試
後端
前端
前端
微信
1061G資源

公衆號回覆「實戰」,領取750G項目實戰學習資源。
先後端實戰項目
750實戰資源

公衆號回覆「面試」,領取8G面試實戰學習資源。
JAVA面試實戰視頻

傳智面試講解
8G面試資源

相關文章
相關標籤/搜索