轉載自:http://www.cnblogs.com/petermsdn/archive/2011/05/06/2039178.html
Velocity 是一個基於java 的模板引擎(template engine). 它可以讓視圖的設計者在web 頁面中引用java 代碼中定義的資料對象和命令。從而使Web designers 和java 開發人員依照MVC 思想(Model-View-Controller )開發系統,這意味著Web designers 只須將精力注用於良好表現力的視圖外觀設計,而Java程式員則只要關心著如何寫出高效簡潔的java 對象以實現商務邏輯—–Velocity 會將他們組裝到一起.
相比傳統的jsp、PHP 等指令碼語言,Velocity 徹底的將避免了在視圖設計中出現的java 代碼, 從而保證了web site 的長期可維護性.
Apache 網站提供的另外一個架構Turbine可以和Velocity 有效結合以實現true MVC model.
一、我們來簡要看看Velocity範本語言(VTL)
1、VTL 聲明( statement),所有的VTL statement 都是以#開頭,且包含一個指示符,當客戶訪問你的頁面時, the Velocity Templating Engine 將搜尋網頁面中的所有# 符號,如果確定這是一個VTL 聲明時就按一定規則處理動態內容, 符號#僅僅只是表明這可能是一個VTL 聲明.
2、VTL注釋:單行注釋是以## 開頭的一行文字.如要寫下多行注釋,將它們放入#* 和*#間
3、Velocity references 從java 文法中汲取了一些優點以便模板設計者更容易使用VTL.
VTL 汲取了java 文法和java bean 的一些簡潔文法以解析java 代碼中Context 中的對象和這些對象的命令及屬性—這樣,一個java 對象的所有功能都可以展示到視圖中了.
4、References(引用)
VTL 中有三種references:變數引用(variables),屬性引用(properties)和命令引用(methods). 做為一個使用VTL 的設計者, 你和你的java 軟體工程師必須就模板中引用的特定名了(就是$後的名字)達成一致的協議。這樣,模板和java 代碼才可按照你們的意圖去結合以輸出正確的內容.
所有的引用在模板中都表現為一個字串. 假設一個引用變數$foo 的值事實上是一個int, Velocity engine 在處理時將調用它的.toString()去解析這個字串所代表的對象(int).
注意:模板中引用的必須是通過java Bean 中的getter/setter 實現的,而直接的java 對象的資料域是不能直接引用的,如$foo.Name 會解析到class Foo’s getName() 的執行個體方法,但不會解析到Foos 類的public Name 這個執行個體變數.
5、指令(directives)
模板設計者使用“引用“產生動態內容, 指令(directives) – 簡單的說就是設計者在模板中操作java對象—讓視圖設計者全面控制輸出內容的格式.
指令總是以#開頭後面緊跟具體的指令符.
注意:set指令中,如果右邊的運算元是一個屬性或命令的引用而返回null,那麼賦值將不會成功,且在隨後的VTL中也不能再取出使用. 如下例:
#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,上面的TVL 輸出結果將是:
The result of the first query is bill
The result of the second query is bill
6、 指令#literal 元素可以用來輸出字面意思,如下:
#literal()
#foreach ($woogie in $boogie)
nothing will happen to $woogie
#end
#end
會輸出::
#foreach ($woogie in $boogie)
nothing will happen to $woogie
#end
7、屬性引用中的屬性尋找規則
前己提及,屬性可以引用到對象的命令. Velocity 會使用合適的策略選擇引用到的命令. 它會根據協定
的命令命令格式尋找. 無論屬性引用的的名字是否大小寫,Velocity 都有固定的尋找規則.如在
$customer.address 引用時,尋找順序是:
1. getaddress()
2. getAddress()
3. get(“address”)
4. isAddress()
對於VTL中大寫的屬性名稱Address 引用,將是:
1. getAddress()
2. getaddress()
3. get(“Address”)
4. isAddress()
8、Velocity使用==來做比較
注意:==計算與java中的==計算有些不同:不能用來測試對象是否相等(指向同一塊記憶體)Velocity中是否相等僅直接的用來比較numbers,strings的值,orobjects的toString()結果是否相等.如果是不同的對象,會調用它們的toString()命令結果來比較.
9、當Velocity應用餘應用程式時,一般分一下幾步:
(1)、初始化Velocity
(2)、建立context對象
(3)、添加資料到context
(4)、選擇模板
(5)、合并模板和資料,產生輸出頁面
二、Velocity與Jsp、Freemarker的對比
在java領域,表現層技術主要有三種:jsp、freemarker、velocity。
jsp是大家最熟悉的技術
優點:
1、功能強大,可以寫java代碼
2、支援jsp標籤(jsp tag)
3、支援運算式語言(el)
4、官方標準,使用者群廣,豐富的第三方jsp標籤庫
5、效能良好。jsp編譯成class檔案執行,有很好的效能表現
缺點:
jsp沒有明顯缺點,非要挑點骨頭那就是,由於可以編寫java代碼,如使用不當容易破壞mvc結構。
velocity是較早出現的用於代替jsp的範本語言
優點:
1、不能編寫java代碼,可以實現嚴格的mvc分離
2、效能良好,據說比jsp效能還要好些
3、使用運算式語言,據說jsp的運算式語言就是學velocity的
缺點:
1、不是官方標準
2、使用者群體和第三方標籤庫沒有jsp多。
3、對jsp標籤支援不夠好
freemarker
優點:
1、不能編寫java代碼,可以實現嚴格的mvc分離
2、效能非常不錯
3、對jsp標籤支援良好
4、內建大量常用功能,使用非常方便
5、宏定義(類似jsp標籤)非常方便
6、使用運算式語言
缺點:
1、不是官方標準
2、使用者群體和第三方標籤庫沒有jsp多
效能:velocity應該是最好的,其次是jsp,普通的頁面freemarker效能最差,但是在複雜頁面上(包含大量判斷、日期金額格式化)的頁面上,freemarker的效能比使用tag和el的jsp好。