天天看點

Velocity 模版引擎基礎文法

Velocity文法

1.     變量

(1) 變量的定義 :

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

當使用#set 指令時,括在雙引号中的字面字元串将解析和重新解釋,如下所示:

#set($directoryRoot = "www" )

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

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

$template

輸出将會是: www/index.vm

注: 在velocity中使用$2.5這樣的貨币辨別是沒有問題得的,因為velocity中的變量總是以一個大寫或者小寫的字母開始的。

(2) 變量規範的寫法

${name} ,也可以寫成:$name。提倡用前面的寫法。

例如:你希望通過一個變量$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.<br>

#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

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, 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 為假,将沒有輸出因為整個表達式為假。

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

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

\$email

\\$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類的方式來提供,傳入 數組對象和要通路的位置參數,進而達到傳回所需值的目的。

繼續閱讀