1. 程式人生 > >Velocity高速新手教程

Velocity高速新手教程

doc 輸出 array 變量引用 特定 mail index property adding

變量

(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能夠是一個VectorHashtable或者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, 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模板中,你能夠包括例如以下VTLvelocity tag laugane

$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

\$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類的方式來提供,傳入數組對象和要訪問的位置參數,從而達到返回所需值的目 本文參考http://www.360doc.com/content/13/0401/13/10825198_275274565.shtml#

Velocity高速新手教程