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來動態的組織一個字符串。
?
?Jackis a $vicemaniac.
?
本來變量是$vice如今卻變成了$vicemaniac,這樣Veloctiy就不知道您究竟要什么了。所以,
?
應該使用規范的格式書寫: Jack is a ${vice}maniac
?
如今Velocity知道變量是$vice而不是$vicemaniac。
?
注意:當引用屬性的時候不能加{}
?
(3)變量的賦值:
?
?$name="hello"
?
賦值的左邊必須是一個變量或者是屬性引用。右邊能夠是以下六種類型之中的一個:
?
變量引用,字面字符串,屬性引用,方法引用,字面數字,數組列表。
?
以下的樣例演示了上述的每種類型:
?
#set( $monkey = $bill ) ## variablereference
?
#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是一個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 23 4 5
?
Second example:
?
? 2 10 -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)多行凝視:
?
#*
?
?Thusbegins a multi-line comment. Online visitors won’t
?
?seethis text because the Velocity Templating Engine will
?
?ignore it.
?
?*#
(3)文檔格式:
?
#**
?
?Thisis a VTL comment block and
?
?maybe used to store such information
?
?asthe document author and versioning
?
information:
?
@version 1.1
?
@author xiao
?
*#
?
6. 關系和邏輯操作符
?
Velocity 也具有邏輯AND, OR 和 NOT 操作符。
?
如
?
## example for AND
?
#if($foo && $bar)<strong>Thisand 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" )
?
?
\$emai
?
l\\$email
?
?
輸出:
?
foo
?
?
\foo
?
?
假設$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知识点总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sublime text 3 快捷键大全
- 下一篇: 花40分钟写一个-CBIR引擎-代码公开