Velocity簡介及與Jsp、Freemarker對比

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.