Velocity浅析及与Jsp、Freemarker对比
轉(zhuǎn)載自:http://www.cnblogs.com/petermsdn/archive/2011/05/06/2039178.html
Velocity 是一個基于java 的模板引擎(template engine). 它可以讓視圖的設(shè)計者在web 頁面中引用java 代碼中定義的數(shù)據(jù)對象和命令。從而使Web designers 和java 開發(fā)者依照MVC 思想(Model-View-Controller )開發(fā)系統(tǒng),這意味著Web designers 只須將精力注用于良好表現(xiàn)力的視圖外觀設(shè)計,而Java程序員則只要關(guān)心著如何寫出高效簡潔的java 對象以實現(xiàn)業(yè)務(wù)邏輯—–Velocity 會將他們組裝到一起.
相比傳統(tǒng)的jsp、PHP 等腳本語言,Velocity 徹底的將避免了在視圖設(shè)計中出現(xiàn)的java 代碼, 從而保證了web site 的長期可維護性.
Apache 站點提供的另外一個框架Turbine可以和Velocity 有效結(jié)合以實現(xiàn)true MVC model.
一、我們來簡要看看Velocity模板語言(VTL)
1、VTL 聲明( statement),所有的VTL statement 都是以#開頭,且包含一個指示符,當客戶訪問你的頁面時, the Velocity Templating Engine 將搜索頁面中的所有# 符號,如果確定這是一個VTL 聲明時就按一定規(guī)則處理動態(tài)內(nèi)容, 符號#僅僅只是表明這可能是一個VTL 聲明.
2、VTL注釋:單行注釋是以## 開頭的一行文字.如要寫下多行注釋,將它們放入#* 和*#間
3、Velocity references 從java 語法中汲取了一些優(yōu)點以便模板設(shè)計者更容易使用VTL.
?????? VTL 汲取了java 語法和java bean 的一些簡潔語法以解析java 代碼中Context 中的對象和這些對象的命令及屬性—這樣,一個java 對象的所有功能都可以展示到視圖中了.
4、References(引用)
VTL 中有三種references:變量引用(variables),屬性引用(properties)和命令引用(methods). 做為一個使用VTL 的設(shè)計者, 你和你的java 軟件工程師必須就模板中引用的特定名了(就是$后的名字)達成一致的協(xié)議!這樣,模板和java 代碼才可按照你們的意圖去結(jié)合以輸出正確的內(nèi)容.
所有的引用在模板中都表現(xiàn)為一個字符串. 假設(shè)一個引用變量$foo 的值事實上是一個int, Velocity engine 在處理時將調(diào)用它的.toString()去解析這個字符串所代表的對象(int).
注意:模板中引用的必須是通過java Bean 中的getter/setter 實現(xiàn)的,而直接的java 對象的數(shù)據(jù)域是不能直接引用的,如$foo.Name 會解析到class Foo’s getName() 的實例方法,但不會解析到Foos 類的public Name 這個實例變量.
5、指令(directives)
模板設(shè)計者使用“引用“生成動態(tài)內(nèi)容, 指令(directives) – 簡單的說就是設(shè)計者在模板中操作java對象—讓視圖設(shè)計者全面控制輸出內(nèi)容的格式.
指令總是以#開頭后面緊跟具體的指令符.
注意:set指令中,如果右邊的操作數(shù)是一個屬性或命令的引用而返回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 輸出結(jié)果將是:
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、屬性引用中的屬性查找規(guī)則
前己提及,屬性可以引用到對象的命令. Velocity 會使用合適的策略選擇引用到的命令. 它會根據(jù)協(xié)定
的命令命令格式查找. 無論屬性引用的的名字是否大小寫,Velocity 都有固定的查找規(guī)則.如在
$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中的==計算有些不同:不能用來測試對象是否相等(指向同一塊內(nèi)存)Velocity中是否相等僅直接的用來比較numbers,strings的值,orobjects的toString()結(jié)果是否相等.如果是不同的對象,會調(diào)用它們的toString()命令結(jié)果來比較.
9、當Velocity應(yīng)用余應(yīng)用程序時,一般分一下幾步:
(1)、初始化Velocity
? (2)、創(chuàng)建context對象
(3)、添加數(shù)據(jù)到context
(4)、選擇模板
(5)、合并模板和數(shù)據(jù),產(chǎn)生輸出頁面
二、Velocity與Jsp、Freemarker的對比
在java領(lǐng)域,表現(xiàn)層技術(shù)主要有三種:jsp、freemarker、velocity。
jsp是大家最熟悉的技術(shù)?
優(yōu)點:?
1、功能強大,可以寫java代碼?
2、支持jsp標簽(jsp tag)?
3、支持表達式語言(el)?
4、官方標準,用戶群廣,豐富的第三方j(luò)sp標簽庫?
5、性能良好。jsp編譯成class文件執(zhí)行,有很好的性能表現(xiàn)?
缺點:?
jsp沒有明顯缺點,非要挑點骨頭那就是,由于可以編寫java代碼,如使用不當容易破壞mvc結(jié)構(gòu)。
velocity是較早出現(xiàn)的用于代替jsp的模板語言?
優(yōu)點:?
1、不能編寫java代碼,可以實現(xiàn)嚴格的mvc分離?
2、性能良好,據(jù)說比jsp性能還要好些?
3、使用表達式語言,據(jù)說jsp的表達式語言就是學velocity的?
缺點:?
1、不是官方標準?
2、用戶群體和第三方標簽庫沒有jsp多。?
3、對jsp標簽支持不夠好
freemarker?
優(yōu)點:?
1、不能編寫java代碼,可以實現(xiàn)嚴格的mvc分離?
2、性能非常不錯?
3、對jsp標簽支持良好?
4、內(nèi)置大量常用功能,使用非常方便?
5、宏定義(類似jsp標簽)非常方便?
6、使用表達式語言?
缺點:?
1、不是官方標準?
2、用戶群體和第三方標簽庫沒有jsp多
性能:velocity應(yīng)該是最好的,其次是jsp,普通的頁面freemarker性能最差,但是在復雜頁面上(包含大量判斷、日期金額格式化)的頁面上,freemarker的性能比使用tag和el的jsp好。
總結(jié)
以上是生活随笔為你收集整理的Velocity浅析及与Jsp、Freemarker对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【solr专题之三】Solr常见异常
- 下一篇: 【solr专题之四】关于Velocity