Velocity用戶指南(中文版)(3)(完)

指令(Directives)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

引用允許模板設計者爲Web站點生成動態內容,而指令使巧妙處理Java代碼的腳本元素容易使用。

1#set

格式:#set( LHS = RHS )

l         LHS可以是變量引用或屬性引用

l         RHS可以是引用、字符串、數字、ArrayListMap

下面的例子展示了上面的每種RHS類型:

對於ArrayListMap,可以使用對應的Java方法訪問其中的元素值:

l         RHS可以是簡單的算術表達式

算術表達式只支持整型。/的結果爲整數;如果非整型數值,返回null

l         如果RHS的結果爲null,是不會賦值給LHS

看下面的例子:

上面使用$result檢查是否執行成功是有問題的。如果第一次執行成功,$result不爲null,則後面的執行不管是否成功,檢查條件總是成立。改進的方法是在每次執行前初始化爲false

l         String文字可以使用雙引號或單引號括起。兩者的主要區別是雙引號中的引用會替換成相應的值,而單引號中的引用原樣輸出

輸出結果是:www/index.vm

如果使用單引號:

輸出結果是:$directoryRoot/$templateName

l         使用雙引號可以實現字符串的串聯,如下面的例子:

2#if / #elseif / #else

#if指令在條件成立時,顯示#if#end之間的內容,否則顯示#else#end之間的內容。下面是一個例子:

條件成立有兩種情況:

l         如果$fooboolean,則$foo要爲true

l         否則,$foo不爲null

#if指令中可以使用的關係和邏輯符號包括:

l         <<===>=>

l         &&(and)||(or)!(not)

3)循環:foreach

下面是一個例子:

$allProducts的內容可以是VectorHashtableArrayList,每次取出一個值賦值給$product;返回的值是一個Java對象,可以用來引用具體的方法。下面的例子假設$allProductsHashtable對象:

Velocity提供了訪問循環計數變量的簡單方法:

$velocityCount$customer.Name

$velocityCountVelocity表示循環計數的內部變量,缺省開始值爲1。該設置在velocity.properties文件中定義:

可以在#foreach指令中使用範圍操作符[n..m],其中nm必須是整型:

輸出結果是:

4#include

#include指令導入本地文件到#include指令定義的地方。導入的文件內容不會被模板引擎解析。出於安全考慮,導入的文件應該放在TEMPLATE_ROOT目錄下。一次可以導入多個文件,文件名之間用逗號分隔;並且通常使用變量引用來替代文件名。下面是一個例子:

5#parse

#parse指令允許導入一個包含VTL的本地文件,並由模板引擎進行解析。#parse指令導入的文件必須放在TEMPLATE_ROOT目錄下,並且一次只能導入一個文件。允許在Velocity模板中嵌套執行#parse指令。最大深度由velocity.properties文件中的parse_directive.maxdepth定義。下面是一個例子:

包含的parsefoo.vm文件如下:

輸出結果是:

6#stop

#stop指令停止模板引擎的執行並返回。這在Debug時很有用。

7#macro

#macro指令允許定義一段重複使用的VTL模板(稱Velocimacros)。

l         Velocimacros可以有0或多個參數。下面是一個例子:

$something

這個叫tablerowsVelocimacro2個參數:一個color和一個array。下面的代碼包含對

tablerows的調用:

 

輸出結果爲:

Superior

Michigan

Huron

Erie

Ontario

l         Velocimacros可以在VTL模板中定義爲inline,這樣對其它的VTL模板是無效的;要使Velocimacros在所有VTL模板中共享,可以將Velocimacros定義在Velocimacros模板庫(全局)中。

l         Velocimacros屬性在velocity.properties文件中定義,提供實現Velocimacros的靈活性:

velocimacro.library:定義逗號分隔的Velocimacros全局模板庫,缺省是VM_global_library.vm,可以增加自定義的模板庫;

velocimacro.permissions.allow.inline:指定是否允許在VTL模板中定義Velocimacros,缺省是true(允許);

velocimacro.permissions.allow.inline.to.replace.global:指定是否允許inline定義的Velocimacros替換同名的全局Velocimacros,缺省是false(不允許);

velocimacro.permissions.allow.inline.local.scope:指定inline定義是否是定義的模板中可見,缺省是false

velocimacro.context.localscope:指定context內容是否是本地範圍的,缺省是false;如果設爲true,則使用#set指令對context做的修改只在本地範圍有效,不會永久性的影響context

velocimacro.library.autoreload指定是否自動裝載Velocimacros模板庫,缺省是false;如果設爲true,則在調用Velocimacros模板庫中的Velocimacro時,會檢查模板庫是否更新,並在需要時重新裝載;使用前提是file.resource.loader.cache = false;該屬性應該在開發時使用,而不是產品階段;

l         Velocimacros必須在第一次使用之前進行定義。因此#parse指令包含inline定義的Velocimacros的模板會有問題,簡單的解決方法就是將Velocimacros定義到模板庫中,以便Velocity啓動時裝載。

l         引用作爲Velocimacros的參數時,是使用by name形式的,這意味在Velocimacros內部每次使用時纔會獲得其值

l         Velocimacros的不能作爲參數傳遞給另一個Velocimacros,如:

你可以採用下面的形式達到同樣的目的:

下面是一個嵌套調用的例子:

輸出的結果是:Outer : inner : outerlala

因爲參數以by name形式傳遞,在#outer內部先設置$bar的值,再調用#inner

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章