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