本文基于 Velocity 1.7 版本撰寫链蕊。
概述
什么是Velocity?
Velocity是一個基于java的模板引擎(template engine)糠聪。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。
當(dāng)Velocity應(yīng)用于web開發(fā)時,界面設(shè)計人員可以和java程序開發(fā)人員同步開發(fā)一個遵循MVC架構(gòu)的web站點钻蹬,也就是說,頁面設(shè)計人員可以只 關(guān)注頁面的顯示效果凭需,而由java程序開發(fā)人員關(guān)注業(yè)務(wù)邏輯編碼问欠。Velocity將java代碼從web頁面中分離出來,這樣為web站點的長期維護提 供了便利粒蜈,同時也為我們在JSP和PHP之外又提供了一種可選的方案顺献。
Velocity的能力遠不止web站點開發(fā)這個領(lǐng)域,例如枯怖,它可以從模板(template)產(chǎn)生SQL和PostScript注整、XML,它也可以被當(dāng)作一個獨立工具來產(chǎn)生源代碼和報告度硝,或者作為其他系統(tǒng)的集成組件使用设捐。Velocity也可以為Turbine web開發(fā)架構(gòu)提供模板服務(wù)(template service)。Velocity+Turbine提供一個模板服務(wù)的方式允許一個web應(yīng)用以一個真正的MVC模型進行開發(fā)塘淑。
安裝
如果你的項目是 maven 項目路鹰,添加依賴到 pom.xml 中即可岭皂。
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
非maven項目浊猾,可以去官網(wǎng)下載 jar 包:<u>官網(wǎng)下載地址</u>
Velocity 編程模型
HelloWorld 示例
先展示一個最簡單的HelloWorld示例铅碍。
VelocityHelloWorld.java
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import java.io.StringWriter;
/**
* Velocity 的 HelloWorld 示例
*
* @author Victor Zhang
* @date 2016/12/22.
*/
public class VelocityHelloWorld {
public static void main(String args[]) {
/* 1.初始化 Velocity */
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.setProperty(VelocityEngine.RESOURCE_LOADER, "file");
velocityEngine.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, "D:/01_Workspace/Project/zp/javaparty/src/toolbox/template/src/main/resources");
velocityEngine.init();
/* 2.創(chuàng)建一個上下文對象 */
VelocityContext context = new VelocityContext();
/* 3.添加你的數(shù)據(jù)對象到上下文 */
context.put("name", "Victor Zhang");
context.put("project", "Velocity");
/* 4.選擇一個模板 */
Template template = velocityEngine.getTemplate("template/hello.vm");
/* 5.將你的數(shù)據(jù)與模板合并曙蒸,產(chǎn)生輸出內(nèi)容 */
StringWriter sw = new StringWriter();
template.merge(context, sw);
System.out.println("final output:\n" + sw);
}
}
hello.vm
在你的 resources (一般路徑為src/main/resources
) 目錄下創(chuàng)建 template/helloVelocity.vm
文件。
文件內(nèi)容如下:
Hello World! The first velocity demo.
Name is $name.
Project is $project
輸出
final output:
Hello World! The first velocity demo.
Name is Victor Zhang.
Project is Velocity
編程模型
通過HelloWorld示例岗钩,不難總結(jié)出Velocity的編程模型纽窟,大致如下:
- 初始化 Velocity 。
- 創(chuàng)建一個上下文對象兼吓。
- 添加你的數(shù)據(jù)對象到上下文臂港。
- 選擇一個模板。
- 將你的數(shù)據(jù)與模板合并视搏,產(chǎn)生輸出內(nèi)容审孽。
使用Properties定制Velocity
properties 文件
在HelloWorld示例中,第一步初始化過程中浑娜,設(shè)值了兩個 java.util.Properties
參數(shù)佑力。
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.setProperty(VelocityEngine.RESOURCE_LOADER, "file");
velocityEngine.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, "D:/01_Workspace/Project/zp/javaparty/src/toolbox/template/src/main/resources");
velocityEngine.init();
這兩個參數(shù)是用來在初始化 Velocity 模板引擎時,對它進行定制筋遭。
顯然打颤,如果每次都要逐一設(shè)值定制參數(shù)是很麻煩的。所以漓滔,可以將 java.util.Properties
參數(shù)統(tǒng)一置于properties 文件中编饺,然后加載進來。
這樣做的好處有兩點:
- 減少大量配置代碼
- 配置文件可以被多個引擎模板復(fù)用
velocity.properties
在你的 resources (一般路徑為src/main/resources
) 目錄下創(chuàng)建 template/velocity.properties
文件响驴。
resource.loader = file
file.resource.loader.path = D:/01_Workspace/Project/zp/javaparty/src/toolbox/template/src/main/resources
初始化部分的代碼替換如下:
Properties p = new Properties();
try {
p.load(VelocityDemo.class.getResourceAsStream("/template/velocity.properties"));
} catch (IOException e) {
e.printStackTrace();
}
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.init(p);
輸出
效果與HelloWorld的示例是一樣的透且。
Velocity 定制參數(shù)
Velocity 常見的定制參數(shù)可以在 org.apache.velocity.runtime.RuntimeConstants
中找到。你可以設(shè)值日志踏施、事務(wù)句柄、宏罕邀、加載資源方式等等重要配置畅形。
更多詳情見:<u>Velocity 官方開發(fā)者指南</u>
Velocity 語法
注釋
單行注釋
以 ##
開頭。
## This is a single line comment.
多行注釋
以 #*
開頭诉探,以 *#
結(jié)尾日熬。
#*
Thus begins a multi-line comment. Online visitors won't
see this text because the Velocity Templating Engine will
ignore it.
*#
引用
在 Velocity 中有三種類型的引用:變量,屬性和函數(shù)肾胯。
變量(Variables)
和我們所熟知的其他編程語言一樣竖席,Velocity 也可以在模板文件中有變量的概念。
變量以 $
開頭敬肚,首字母必須是英文字母毕荐。變量允許的字符為以下幾種類型:
字母(a .. z, A .. Z)
數(shù)字(0 .. 9)
連字符("-")
下劃線("_")
有效范例:
$foo
$mudSlinger
$mud-slinger
$mud_slinger
$mudSlinger1
變量定義
可以使用 #set
來為變量定義。
#set( $foo = "bar" )
屬性(Properties)
屬性以 $
開頭艳馒,標(biāo)識符間以 .
分隔憎亚。
有效范例:
$customer.Address
$purchase.Total
函數(shù)(Methods)
有效范例:
## 無參數(shù)
$customer.getAddress()
$purchase.getTotal()
## 單個參數(shù)
$page.setTitle( "My Home Page" )
## 參數(shù)列表
$person.setAttributes( ["Strange", "Weird", "Excited"] )
Velocity 1.6 開始支持重載函數(shù)员寇。
$sun.setPlanets('Earth', 'Mars', 'Neptune')
$sun.setPlanets('Mercury')
$sun.setPlanets()
條件語句
條件語句必須以 #if
開始,以 #end
結(jié)尾第美。
用法與Java中的條件語句極其相似蝶锋,看看例子就能懂。
#if( $foo )
<strong>Velocity!</strong>
#end
注意:Velocity中的 ==
的語義與Java略有不同什往,其中 ==
只能用于測試對象的相等性扳缕。在Velocity中,等效運算符可以用于直接比較數(shù)字别威,字符串或?qū)ο笄颉.?dāng)對象具有不同的類時,通過為每個對象調(diào)用 toString() 然后比較來獲得字符串表示兔港。
#set ($foo = "north")
#set ($bar = "north")
#if( $foo == $bar )
**Go North**
#elseif( $foo == "east" )
**Go East**
#elseif( $bar == "south" )
**Go South**
#else
**Go West**
#end
Velocity 中的條件語句也可以使用與庸毫、或、非衫樊。
#if( $foo && $bar )
**This AND That**
#end
#if( $foo || $bar )
**This OR That**
#end
#if( !$foo )
**NOT that**
#end
循環(huán)
#foreach
用來控制一個循環(huán)語句飒赃。
#foreach
支持遍歷一個 Vector、Hashtable 或 Array 對象科侈。
<ul>
#foreach( $key in $allProducts.keySet() )
<li>Key: $key -> Value: $allProducts.get($key)</li>
#end
</ul>
可以使用 #break
跳出循環(huán)载佳。$foreach.count
表示循環(huán)次數(shù)。
## list first 5 customers only
#foreach( $customer in $customerList )
#if( $foreach.count > 5 )
#break
#end
$customer.Name
#end
五臀栈、宏
Velocity 中的宏可以理解為函數(shù)定義蔫慧。定義的語法如下:
#macro(macroName arg1 arg2 …)
...
#end
調(diào)用這個宏的語法是:
#macroName(arg1 arg2 …)
這里的參數(shù)之間使用空格隔開,下面是定義和使用 Velocity 宏的例子:
#macro(sayHello $name)
hello $name
#end
#sayHello(“velocity”)
輸出的結(jié)果為 hello velocity
六权薯、#parse 和 #include
#parse 和 #include 指令的功能都是在外部引用文件姑躲,而兩者的區(qū)別是,#parse 會將引用的內(nèi)容當(dāng)成類似于源碼文件盟蚣,會將內(nèi)容在引入的地方進行解析黍析,#include 是將引入文件當(dāng)成資源文件,會將引入內(nèi)容原封不動地以文本輸出屎开。分別看以下例子:
foo.vm 文件:
#set($name =“velocity”)
parse.vm:
#parse(“foo.vm”)
輸出結(jié)果為:velocity
include.vm:
#include(“foo.vm”)
輸出結(jié)果為:#set($name =“velocity”)
以上內(nèi)容包含了部分 Velocity 的語法阐枣,詳細的語法內(nèi)容可以參考 Velocity 的官方文檔。
參考
范例
范例源碼