NVelocity是一個(gè)基于.NET的模板引擎(template engine)。它允許任何人僅僅簡(jiǎn)單的使用模板語言(template language)來引用由.NET代碼定義的對(duì)象,。從而使得界面設(shè)計(jì)人員與.NET程序開發(fā)人員基本分離,。 一、nVelocity的常用功能簡(jiǎn)介 1,、 在頁面中定義變量,,并進(jìn)行簡(jiǎn)單的運(yùn)算。 2,、 在頁面中獲得對(duì)后臺(tái)程序?qū)嶓w對(duì)象的引用,。 3、 在頁面中迭代實(shí)體對(duì)象集合,。 4,、 在頁面中獲得實(shí)體對(duì)象的屬性,及其方法,。 5,、 對(duì)邏輯判斷語句的支持。 6,、 對(duì)外部文件的引用,。 7、 對(duì)外部文件的解析,。 二,、nVelocity的工作原理 可以使用.NET的反射實(shí)現(xiàn)。以下是nVelocity對(duì)迭代實(shí)體類的簡(jiǎn)單實(shí)現(xiàn)步驟: 1,、 定義People類,,并擁有Name與Sex屬性。表示一個(gè)人,。 2,、 在頁面中列出人物列表,則輸入以下代碼: #foreach($p in $ps) <p>歡迎您:$p.Name</p> #end 3,、 獲取人物列表,,保存在_List中。并指定頁面中的字符串“ps”對(duì)應(yīng)_List,。 4,、以文本方式讀取模板文件,并匹配#foreach…#end段,,如果匹配到則繼續(xù)匹配$X in $XX 段,,分別記錄用于保存集合與單項(xiàng)的字符,,本次為“p”與“ps”。 5 ,、用Type對(duì)象的GetProperties()方法獲取_list中每一項(xiàng)的所有屬性,并在#foreach #end段中循環(huán)將$p + 屬性名稱替換為當(dāng)前對(duì)象的當(dāng)前屬性的值,。當(dāng)然如果要調(diào)用對(duì)象的方法也可以用同樣的方式獲得,。 三、基本語法 1,、特殊字符介紹 A,、“#”:表示開始做什么事情。 B,、“$”:表示用于獲得什么,。(以$開頭的表示“引用”意思是取得一些東東.可引用變量,屬性,,方法) C,、“##“:?jiǎn)涡凶⑨尅?/p> D、 “#*… …*#”:多行注釋,。 2,、關(guān)鍵字 A、 Set:開始做什么事情,,比如定義變量,,給變量重新賦值等。(注意:如果右邊的操作數(shù)是一個(gè)屬性或命令的引用而返回null,那么賦值將不會(huì)成功,,且在隨后的VTL中也不能再取出使用,如果要用做if條件,,一個(gè)解決辦法是,先給變量賦一個(gè)值,,然后再將一個(gè)屬性或命令的引用賦給該變量) B,、 Foreach:迭代語句 C、 If:條件判斷語句 D,、 Elseif E,、 Else F、 Include:對(duì)外部文件的引用,,開始位置為模板路徑,。 G、 Parse:對(duì)外部文件的引用,,并用nVelocity方式解析,。 H、 Macro:創(chuàng)建宏,,可以重復(fù)做某件事,,類似于方法。 I、 Even:雙數(shù)執(zhí)行 J,、 Odd :?jiǎn)螖?shù)執(zhí)行 K,、 Each:每次都執(zhí)行 (備注:所有變量在未定義之前不能使用(因?yàn)槲覀兞?xí)慣了有全局變量的習(xí)慣),一個(gè)合法的VTL標(biāo)示符是以一個(gè)字母開頭的,。.NET后臺(tái)定義的對(duì)象除外,。模板語言區(qū)分大小寫,所有的關(guān)鍵字必須為小寫,,默認(rèn)情況下,,NVelocity解析是不分大小寫的,當(dāng)然可以通過設(shè)置runtime.strict.math=true,,采用嚴(yán)格解析模式,。) 四、使用示例 1,、 在頁面中使用變量 定義變量:#set($a = “CNF”) 引用變量:歡迎光臨:$a 定義變量:#set($a = 1) 運(yùn)算:#set($a = $a + 1) 輸出:$a ##得:2 運(yùn)算:#set($a = $a*5) 輸出:$a ##得:10 #set( $criteria = ["name", "address"] ) #foreach( $criterion in $criteria ) #set( $result = false ) //先設(shè)置默認(rèn)值 #set( $result = $query.criteria($criterion) ) #if( $result ) Query was successful #end #end (備注:從以上可以看出nVelocity的替換順序與.NET程序代碼的執(zhí)行基本一致,,如果放在Foreach語句塊中可以實(shí)現(xiàn)累加。并用If語句獲得行號(hào),,對(duì)特殊行號(hào)的內(nèi)容特殊處理,。所有變量在未定義之前不能使用,.NET后臺(tái)對(duì)象除外,,最好采用正規(guī)引用格式,,${a},正規(guī)引用格式一般用于在模板中直接調(diào)整字符串內(nèi)容;靜態(tài)引用輸出:NVelocity遇到一個(gè)不能處理的引用時(shí),,一般他會(huì)直接輸出這個(gè)引用$email的寫法,頁面上會(huì)看到的是$email,我們可以在$后面加上一個(gè)!號(hào),,那么就會(huì)輸出空白.$!{email}如果不能處理會(huì)輸出空白。如果email己定義了 (比如它的值是 foo),而這里你卻想輸出 $email. 這樣一個(gè)字符串,就需要使用轉(zhuǎn)義字符”\”,,如:\$email) 2,、 在頁面中使用條件判斷語句 #if ($p.StrSex == "女") #set($Sex = "女士") #elseif ($p.StrSex == "男") #set($Sex = "先生") #elseif ($p.StrSex == "無") #set($Sex = "人妖") #else #set($Sex = "怪物") #end (備注:可以嵌套在Foreach語句塊中,用于對(duì)每個(gè)列表對(duì)象進(jìn)行特殊顯示處理,。) 3,、 創(chuàng)建宏,可以當(dāng)做方法使用,。
創(chuàng)建:#macro(Add $a $b) #set($c = $a + $b) <p>最后結(jié)果:$c</p> #end 調(diào)用:#Add(1 2)
(備注:模板引擎的初始化方法有3種,,一種參數(shù)為模板文件內(nèi)容,一種是帶模板文件地址,。結(jié)果發(fā)現(xiàn)帶模板文件內(nèi)容的,,在應(yīng)用宏的時(shí)候好像有點(diǎn)問題。另外一個(gè)就是假如在宏里面加入一個(gè)判斷語句,,則可以實(shí)現(xiàn)遞歸調(diào)用,。) 4,、使用對(duì)象方法 定義變量:#set($str = “CNF”) 調(diào)用方法:$str.SubString(0,1) 輸出:C 定義變量:#set($a = 123) 調(diào)用方法:$a.GetType() 輸出:System.Int32 (備注:不管是.NET代碼定義的對(duì)象,還是設(shè)計(jì)人員在頁面中定義的變量,,都可以使用對(duì)象的方法及屬性,,這一點(diǎn)非常強(qiáng)大。) 5,、使用even與odd簡(jiǎn)化代碼,,each輔助 如上面所說用IF語句可以在列表中為每行創(chuàng)建不同的樣式,但如果只需要區(qū)分單行與雙行的話,,可以使用even與odd簡(jiǎn)化代碼。如下:
#foreach($p in $ps) #even <p>雙行:$p.StrName</p> #odd <p>單行:$p.StrName</p> #end (備注:在使用這兩個(gè)關(guān)鍵字時(shí),,出現(xiàn)了與創(chuàng)建宏一樣的問題,,即在初始化模板引引擎的時(shí)候,如果是用模板文件內(nèi)容初始化的,,會(huì)出現(xiàn)問題) 6,、引用外部文件 Include與parse都有引入外部文件的作用,不同的是parse會(huì)根據(jù)nVelocity模板語言解析外部文件,。也就是說如果引入當(dāng)前模板,,則會(huì)出現(xiàn)死循環(huán)。 #include 腳本元素讓模板設(shè)計(jì)者可以在模板中引入一個(gè)本地文件, 這個(gè)被引入的文件將不會(huì)經(jīng)過NVelocity的解析. 安全起見,,可以引放的文件只是是配置參數(shù)TEMPLATE_ROOT所定義目錄下的,,默認(rèn)為當(dāng)前目錄下. #include( "head.html" ) 如果需要引入多個(gè)文件,可以像下面這樣. #include( "one.gif","two.txt","three.htm" ) 當(dāng)然,,還可用一個(gè)變量名來代替文件名引入. #include( "greetings.txt", $seasonalstock ) #parse 元素指示可以引入一個(gè)包含TVL的本地文件,,這個(gè)文件將被NVeloict engine解析輸出。 #parse( "me.vm" ) 與 #include 指令不同, #parse 可以從引入的模板中得到變量引用.但#parse指令只能接受一個(gè)參數(shù).VTL templates 被#parse 的模板中還可以再包含#parse聲明,,默認(rèn)的深度為10,,這是由配置參數(shù)directive.parse.max.depth在文件velocity.properties中決定的,你可以修改它以適合項(xiàng)目要求,。 7,、使用Foreach語句 上面多次列出Foreach語句,相信已經(jīng)知道它的作用,。即循環(huán)列出一組對(duì)象集合,。比如:#foreach($p in $ps),其中$ps需要與后臺(tái)代碼中具體的實(shí)體類名稱對(duì)應(yīng),,$p代表$ps中的其中一項(xiàng),。上面已經(jīng)提到過,即$p可以調(diào)用實(shí)體類的屬性和方法,。 (備注:#foreach 語句必須以#end結(jié)束,通過引用變量$velocityCount可以訪問到NVelocity提供的計(jì)數(shù)器:) 8,、創(chuàng)建數(shù)組 創(chuàng)建:#set($List = [“男”,”女”]) 遍歷:#foreach($Item in $List) <p>List成員:$Item</p> #end 輸出:List成員:男 List成員:女 提供一個(gè)NVelocity 操作類VelocityHelper,方便大家使用:點(diǎn)擊下載 NVelocity.dll下載:點(diǎn)擊下載 VelocityHelper調(diào)用如下:
VelocityHelper vh = new VelocityHelper(); vh.Init("~/template/"); //模板路徑 vh.Put("templateVariable", Variable); vh.Display("index.htm"); 附:NVelocity常用語法指令 對(duì)變量的引用:$ [ ! ][ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ][ } ],。 在NVelocity中,對(duì)變量的引用都是以$開頭加上變量名稱,。當(dāng)使用!時(shí)表示當(dāng)此變量值為空時(shí),,顯示空字符串。比如當(dāng)$article為空,,那會(huì)顯示“$article“,,而$!article會(huì)顯示為“”。{}為變量名稱限定,,有時(shí)候變量名稱后會(huì)有字符串,,這是就需要用到{}了。比如$articleshow,,想引用$article,,這時(shí)只要修改為${article}就可以。其實(shí),,NVelocity對(duì)整個(gè)模板解析后都會(huì)變成這種模式,。 對(duì)屬性的引用:$ [ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ]* .[a..z, A..Z ][ a..z, A-Z, 0..9, -, _ ]* [ } ] 。 例如$article.Title或者${article.Title},。 對(duì)方法的引用:$ [ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ]* .[ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ]*( [ optional parameter list... ] ) [ } ],。 例如:$article.GetListByTitle(‘nvelocity’)或${article.GetListByTitle(‘nvelocity’)}。其實(shí)對(duì)對(duì)象的屬性值也可以用$article.get_Title()獲得,。 賦值指令#set:# [ { ] set [ } ] ( $ref = [ ", ' ]arg[ ", ' ] ),。 例如:$article.Title=’NVelocity’,$$article.Categories=[1,2,3],,當(dāng)然右側(cè)也可以使用復(fù)雜的表達(dá)式:$article.Title=$otherArticle.Title.SubString(0,3),,算術(shù)表達(dá)式:$article.Page=4/3等等。屬性賦值也可以用$article.set_Title(‘NVelocity’),。 條件指令#if:# [ { ] if [ } ] ( [condition] ) [output] [ # [ { ] elseif [ } ] ( [condition] ) [output] ]* [ # [ { ] else [ } ] [output] ] # [ { ] end [ } ] ,。 條件可以是返回bool的復(fù)查表達(dá)式。例如:#if($article.Total>1) $article.Title #else 沒有數(shù)據(jù) #end,。 循環(huán)指令#foreach:# [ { ] foreach [ } ] ($refinarg)statement# [ { ] end [ } ],。 例如:#foreach($article in $articles) $article.Title #end。 引用靜態(tài)資源指令#include:# [ { ] include [ } ] ( arg[ arg2 ... argn] ),。 例如:#include(‘tmp.js’),,會(huì)把tmp.js文件內(nèi)容插入當(dāng)前流。當(dāng)然可以使用表達(dá)式:#include($article.Url),。 引用并解析資源指令#parse:# [ { ] parse [ } ] ( arg ),。 例如:#parse(‘tmp.js’),與#include不同是,,假如tmp.js文件中有NVelocity的指令,,變量會(huì)進(jìn)行處理,,并把結(jié)果插入到當(dāng)前流。 停止指令#stop:# [ { ] stop [ } ] ,。 當(dāng)NVelocity解析到此指令時(shí),,會(huì)停止解析過程。一般用戶調(diào)試,。 計(jì)算指令#evaluate:# [ { ] evaluate [ } ] ( arg ),。 例如:#evaluate(‘$article.Title’),會(huì)在當(dāng)前輸出$article.Title NVelocity的$與Jquery的$發(fā)生沖突時(shí)的解決方法有以下幾個(gè): |
|