velocity模板的语法简要汇总
velocity模板的語法簡要匯總
What’s velocity
Velocity是一個基于java的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。
符號
如:
“”用來標識一個對象(或理解為變量);如如:i、msg、TagUtil.options(…)等。
“{}”用來明確標識Velocity變量;
比如在頁面中,頁面中有一個someonename,此時,Velocity將把someonename作為變量名,若我們程序是想在someone這個變量的后面緊接著顯示name字符,則上面的標簽應該改成{someone}name。
“!”用來強制把不存在的變量顯示為空白。
如當頁面中包含msg,如果msg對象有值,將顯示msg的值,如果不存在msg對象同,則在頁面中將顯示msg字符。這是我們不希望的,為了把不存 在的變量或變量值為null的對象顯示為空白,則只需要在變量名前加一個“!”號即可。
如:$!msg
變量定義
#set($maxValue=5) #set($name="Bob") #set($arrayName=["element1","element2",...])注釋
## 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. *#還有一個文檔注釋
(3)文檔格式:#**This is a VTL comment block andmay be used to store such informationas the document author and versioninginformation:@version 1.1@author xiao*#靜態引用輸出
Velocity 遇到一個不能處理的引用時,一般他會直接輸出這個引用email的寫法,頁面上會看到的是email,如下例,我們可以在$后面加上一個!號,那么就會輸出空白:
<input type="text" name="email" value="$email"/> <input type="text" name="email" value="$!email"/>關系和邏輯操作符
Velocity 也具有邏輯AND, OR 和 NOT 操作符。
如
例子中#if()指令僅在$foo和$bar斗為真的時候才為真。如果$foo為假,則表達式也為假;并且 $bar將不被求值。如果 $foo 為真,Velocity 模板引擎將繼續檢查$bar的值,如果 $bar 為真,則整個表達式為真。并且輸出This AND that 。如果 $bar為假,將沒有輸出因為整個表達式為假。
轉義字符
如果email 己定義了(比如它的值是foo),而這里你卻想輸出$email. 這樣一個字符串,就需要使用轉義字符”\”.
## The following line defines $email in this template: #set( $email = "foo" ) $email \$email \\$email \\\$email上面的模板在web 頁面上的輸出將是:
foo $email \foo \$email關于null
但注意:如果右邊的操作數是一個屬性或命令的引用而返回null,那么賦值將不會成功,且在隨后也不能再取出使用. 如下例:
#set( $result = $query.criteria("name")) The result of the first query is $result #set( $result = $query.criteria("address")) The result of the second query is $result如果query.criteria("name")返回的是字符串"bill",但query.criteria(“address”) 返回null,上面的輸出結果將是:
The result of the first query is bill The result of the second query is bill又如下例:
#set( $criteria = ["name", "address"] ) #foreach($criterion in $criteria )#set($result=$query.criteria($criterion) )#if($result)Query was successful #end在上例中,就不能依賴if($result)來決定查詢是否成功. #set右邊如果是null會 它將不能被賦其它值.一個解決辦法是,每次都將$result設為false:
#set( $criteria = ["name", "address"] ) #foreach($criterion in $criteria )#set($result = false)#set($result=$query.criteria($criterion) )#if($result)Query was successful #end條件判斷
#if($foo<10)<strong>Go North</strong> #elseif($foo==10)<strong>Go East</strong> #elseif($bar==6)<strong>Go South</strong> #else<strong>Go West</strong> #end循環和計數
通過引用變量$velocityCount可以訪問到Velocity 提供的計數器:
<table> #foreach( $customer in $customerList )<tr><td>$velocityCount</td><td>$customer.Name</td></tr> #end </table>$velocityCount是默認的計數器引用,你可以在配置velocity.properties 中改成你喜歡的:
include
include腳本元素讓模板設計者可以在模板中引入一個本地文件, 這個被引入的文件將不會經過Velocity 的解析. 安全起見,可以引放的文件只是是配置參數TEMPLATE_ROOT所定義目錄下的,默認為當前目錄下.
#include( "one.txt" )多個文件或者用變量名代替:
#include( "greetings.txt", $seasonalstock )parse
parse元素指示可以引入一個包含TVL 的本地文件,這個文件將被Veloict engine 解析輸出。
#parse( "me.vm" )與#include 指令不同, #parse 可以從引入的模板中得到變量引用.但#parse 指令只能接受一個參數.
VTL templates 被#parse 的模板中還可以再包含#parse 聲明,默認的深度為10,這是由配置參數directive.parse.max.depth 在文件velocity.properties 中決定的,你可以修改它以適合項目要求
stop
stop指令用來指示在模板的某處,engine 停止解析,這一般用來調用。用法很簡單.
#stop宏調用
macro指令讓模板設計者可以將些重復、相關的的腳本版斷定義為一個功能塊.
#macro( tablerows $color $somelist )#foreach( $something in $somelist )<tr><td bgcolor=$color>$something</td></tr>#end #end然后,我們在頁面中來使用:
#set( $greatlakes = ["Superior","Michigan","Huron","Erie","Ontario"] ) #set( $color = "blue" ) <table>#tablerows( $color $greatlakes ) </table>輸出結果:
<table><tr><td bgcolor="blue">Superior</td></tr><tr><td bgcolor="blue">Michigan</td></tr><tr><td bgcolor="blue">Huron</td></tr><tr><td bgcolor="blue">Erie</td></tr><tr><td bgcolor="blue">Ontario</td></tr> </table>如果將宏#tablerows($color $list)定義到一個模板庫中(Velocimacros template library), 其它模板就都可以訪問它了.
盡量不要直接在模板中使用#parse() 包含#macro() 指令.因為#parse() 動作在運行時執行,時會有一個在VM 中查找元素的過程.
內置對象
Velocity內置了一些對象,在vm模版里可以直接調用,列舉如下:
$request、$response、$session,另外,模板內還可以使用 $msg內的消息工具訪問 Struts 的國際化資源,達到簡便實現國際化的方法。
數組訪問
對數組的訪問在Velocity中存在問題,因為Velocity只能訪問對象的方法,而數組又是一個特殊的Array,所以雖然數組可以進行循環列舉,但卻不能定位訪問特定位置的元素,如 strs[2],數組對固定位置元素的訪問調用了Array的反射方法get(Object array, int index),而Velocity沒能提供這樣的訪問,所以數組要么改成List等其他類容器的方式來包裝,要么就通過公用Util類的方式來提供,傳入數組對象和要訪問的位置參數,從而達到返回所需值的目的。
總結
以上是生活随笔為你收集整理的velocity模板的语法简要汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么先锋电视便宜(汉典为字的基本解释)
- 下一篇: 绝地求生信号枪刷新点在哪里(正版战斗特训