Velocity是基於Java的模板引擎,它允許頁面設計者引用Java中定義的方法。頁面設計者和Java開發者能夠同時使用MVC的模式開發網站,這樣網頁設計者能夠把精力放在頁面的設計上,程序員也可以把精力放在代碼開發上。Velocity把Java代碼從Web頁面中分離, 使網站可維護性更強,同時也在Java服務器頁面(JSPs)或者PHP中提供了可視化交互的選擇。
Velocity 可以被用在以下場景中:
-
Web 應用:開發者在不使用 JSP 的情況下,可以用 Velocity 讓 HTML 具有動態內容的特性。
-
源代碼生成:Velocity 可以被用來生成 Java 代碼、SQL 或者 PostScript。有很多開源和商業開發的軟件是使用 Velocity 來開發的。
-
自動 Email:很多軟件的用戶注冊、密碼提醒或者報表都是使用 Velocity 來自動生成的。使用 Velocity 可以在文本文件里面生成郵件內容,而不是在 Java 代碼中拼接字符串。
-
轉換 xml:Velocity 提供一個叫 Anakia 的 ant 任務,可以讀取 XML 文件並讓它能夠被 Velocity 模板讀取。一個比較普遍的應用是將 xdoc 文檔轉換成帶樣式的 HTML 文件。
一、變量
1. 變量定義
velocity 中的變量是弱類型,大小寫敏感。
#set($name="velocity")
當使用 set 指令時,等號后面引號中的字面字符串將解析和重新解析,例如出現以 $ 開始的字符串時,將做變量的替換。
#set($hello="hello $name")
上面的這個等式將會給 $hello 賦值為“hello velocity”
2. 變量使用
在模板文件中使用 $name 或者 ${name} 來使用定義的變量。推薦使用 ${name} 這種格式,因為在模板中同時可能定義了類似 $name 和 $names 的兩個變量,如果不選用大括號的話,引擎就沒有辦法正確識別 $names 這個變量。
對於一個復雜對象類型的變量,例如 $person,可以使用 ${person.name} 來訪問 person 的 name 屬性。值得注意的是,這里的 ${person.name} 並不是直接訪問 person 的 name 屬性,而是訪問 person 的 getName() 方法,所以 ${person.name} 和${person.getName()} 是一樣的。
3. 變量賦值
對於 Velocity 來說,變量是弱數據類型的,可以在賦了一個 String 給變量之后再賦一個數字或者數組給它。
賦值的左邊必須是一個變量或者屬性引用。
賦值的右邊可以是以下6種類型之一:
- 變量引用
- 字面字符串
- 屬性引用
- 方法引用
- 字面數字
- 數組列表
#set($foo = $bar) #set($foo ="hello") #set($foo.name = $bar.name) #set($foo.name = $bar.getName($arg)) #set($foo = 123) #set($foo = ["foo",$bar])
注:(1)如果上述例子中右值為 null,則左值不會被賦值,也就是說會保留以前的值。
(2)Velocity 模板中未被定義的變量將會認為是字符串。例如:
#set($foo = $bar) $foo 輸出結果: $foo
二、循環語句
#set($list=["velocity","freemarker","jsp"]) #foreach($element in $list) <p>${velocityCount}. This is ${element}</p> #end 輸出結果: 1. This is velocity 2. This is freemarker 3. This is jsp
Velocity 引擎會將 list 中的值循環賦給 element 變量,同時會創建一個 $velocityCount 的變量作為計數,從 1 開始,每次循環都會加 1。
另外,Velocity 中還提供了得到循環次數的方法, $velocityCount 變量的名字是 Velocity 默認的名字。
#foreach($i in [1..3]) $i #end 輸出結果: 1 2 3
三、條件語句
#if($condition > 5) <p>condition > 5</p> #elseif($condition == 5) <p>condition = 5</p> #else <p>condition < 5</p> #end 輸出結果: condition = 5
四、關系操作符
Velocity 引擎提供了 AND、OR 和 NOT 操作符,分別對應 && 、|| 和 ! 。
#set($a=true) #set($b=false) #if($a && $b) This is all true. #end
五、宏
Velocity 中的宏可以理解為函數定義。
(1)宏的定義:
#macro(宏的名稱 $參數1 $參數2 ...) 語句體(即函數體) #end
(2)宏的調用:
#宏的名稱($參數1 $參數2 ...)
注意:參數之間用空格隔開
(3)示例:
#macro(func $args1 $args2) This is a macro. The argument have ${args1} and ${args2}. #end #func("hello" "world") 輸出結果: This is a macro. The argument have hello and world.
六、#parse 與 #include
#parse 與 #include 指令的功能都是在外部引用文件,而兩者的區別是,#parse 會將引用的內容當成類似於源碼文件,會將內容在引入的地方進行解析,#include 是將引入文件當成資源文件,會將引入內容原封不動地以文本輸出。
示例:
foo.vm 文件:
#set($name="velocity")
$name
(1)parse.vm 文件:
#parse("foo.vm")
輸出結果:
velocity
(2)include.vm 文件
#include("foo.vm")
輸出結果:
#set($name="velocity") $name