Velocity簡介及與Jsp、Freemarker對比

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好。

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