天天看點

掌握一種Java模闆技術 -- Velocity

======================================================

注:本文源代碼點此下載下傳

======================================================

原來的項目中基本都是用 jsp+tag 來展示内容,有時也有 jasper report 做報表,報表也算是一種模闆技術,隻是有些重量級。看過 spring 的書籍,都會對 velocity 和 freemaker 有介紹,帶動了我對先前看過的 *.vm 檔案的研究提上了日程,了解之後,已覺相見恨晚。

下面講利用 velocity 怎麼更好解決目前項目的一個簡單問題:系統在進行支付了支付後,自己按設定的資訊模闆發送一條短信給責任人。資訊模闆是:

{單據責任人}:您的 {單據号} 号{單據類型}在 {操作日期} 日已支付

原來的處理方式是在程式中拿到上面定義的模闆一次又一次的把前面大括中内容(含大括号)replaceall() 成實際資料。

如果更多的這種資訊模闆,處理起來就是不斷的重複着代碼。

下面介紹利用 velocity 如何簡練的處理上面的問題。velocity 可在 http://velocity.apache.org/ 下載下傳,下得 velocity-1.5.zip (提筆時版本是1.5),其中有 velocity-1.5.jar和其和依賴包(lib目錄中),例子中采用從類路徑中加載模闆,具體步驟如下:

一:定義模闆檔案 hellovelocity.vm (要放在類路徑下)

1.## {單據責任人}:您的 {單據号} 号{單據類型}在 {操作日期} 日已支付

2.${owner}:您的 ${bill} 号${type}在 ${ date } 日已支付

雙井号"##"開始是 velocity 模闆的注釋,與 velocity.input_encoding 對應,要求 hellovelocity.vm 用 gbk 字元集儲存,否則出亂碼。

二:加載模闆,填充值,輸出。 hellovelocity.java 的代碼如下

01.package com.unmi.velocity;

02.

03.import java.io.*;

04.import java.text.*;

05.import java.util.*;

06.

07.import org.apache.velocity.*;

08.import org.apache.velocity.app.*;

09.

10.public class hellovelocity {

11.public static void main(string[] args) throws exception {

12.// 配置初始化參數

13.properties props = new properties();

14.props.setproperty(velocity.input_encoding, "gbk");

15.props.setproperty(velocity.resource_loader, "class");

16.props.setproperty("class.resource.loader.class",

17."org.apache.velocity.runtime.resource.loader.classpathresourceloader");

18.

19.// 初始化并取得velocity引擎

20.velocityengine ve = new velocityengine(props);

21.

22.// 取得velocity的模版

23.template template = ve.gettemplate("hellovelocity.vm");

24.

25.// template執行個體的擷取方式也可以用下面兩行代碼

26.// velocity.init(props);

27.// template template = velocity.gettemplate("hellovelocity.vm");

28.

29.// 取得velocity的上下文context

30.velocitycontext context = new velocitycontext();

31.

32.// 把資料填入上下文

33.context.put("owner", "unmi");

34.context.put("bill", "1000");

35.context.put("type", "報帳單");

36.context.put("date", new simpledateformat("yyyy-mm-dd hh:mm:ss")

37..format(new date()));

38.

39.// 輸出流,你可以自由控制輸出到哪,string、file、socket 等

40.writer writer = new printwriter(system.out);

41.

42.// 轉換輸出

43.template.merge(context, writer);

44.writer.flush();

45.}

46.}

以上代碼執行結果是在控制台下輸出

unmi:您的 1000 号報帳單在 2007-06-04 21:56:13 日已支付

ok,代碼應該可以說是十厘清晰明了,加載模闆->填充值->合并模闆輸出内容,這就是模闆技術要做的事情。

上面介紹的是用 classpathresourceloader 方式加載模闆,velocity 還提供了其他幾種 resourceloader: datasourceresourceloader, fileresourceloader, jarresourceloader, stringresourceloader, urlresourceloader。由名稱我們就能知道它們是從哪加載模闆,可在項目中靈活選用适合自己的 resourceloader(通過配置 velocity 引擎的初始化參數)。

velocity 的預設配置在 velocity.jar 中的 org/apache/velocity/runtime/defaults/velocity.propertis,你可以修改這個檔案以适于你的需求,這樣就不需要對 velocityengine 配置初始化參數 properties 了。

當然,上面隻是一個非常簡單的例子,如果僅能完成如此之功能,肯定是用不廣泛。是以 velocity 還提供定義了一種稱之為 vtl(velocity template language) 的東西,支援 #if、#foreach、#set、#include、#parse、#macro 等文法能處理你更複雜的資料8028,詳細文法參考 velocity使用者手冊。可以定義出你想要的功能更完善的模闆。他可以作為一個 view 替代 jsp。當然一家定義的 vtl 着實給學習者增加了不少難度,但當你真正喜歡上了,這些都不成問題。

有一個 velocity eclipse 插件,可設定 updates site 為 http://propsorter.sourceforge.net/veloeclipse 進行下載下傳或更新,友善在eclipse 中編輯 vm 檔案。

你可以想想 velocity 能為你輕松解決什麼問題,如定義模闆自動化生成代碼,把我某個 blog 上的所有日志依據模闆生成一個 rss.xml 檔案就能導入到别的部落格中,與 spring 結合使用。http://velocity.apache.org/ 上的 anakia/texen/velocity-tools 為 velocity 擴充了更多的功能。

參考與應用:

1. java的模闆引擎velocity初體驗

2. struts 與 velocity 的內建

3. velocity使用者手冊

4. 模闆:velocity和freemarker的比較

5. 郵件發送功能的模闆實作

6. velocity改造心得

======================================================

在最後,我邀請大家參加新浪APP,就是新浪免費送大家的一個空間,支援PHP+MySql,免費二級域名,免費域名綁定 這個是我邀請的位址,您通過這個連結注冊即為我的好友,并獲贈雲豆500個,價值5元哦!短網址是http://t.cn/SXOiLh我建立的小站每天訪客已經達到2000+了,每天挂廣告賺50+元哦,呵呵,飯錢不愁了,\(^o^)/