標籤:style blog http io ar 使用 sp for strong
NVelocity是一個基於.NET的模板引擎(template engine)。它允許任何人僅僅簡單的使用範本語言(template language)來引用由.NET代碼定義的對象。從而使得介面設計人員與.NET程式開發人員基本分離。
原文地址:http://www.cnblogs.com/hxling/archive/2011/10/23/2221918.html
一、nVelocity的常用功能簡介
1、 在頁面中定義變數,並進行簡單的運算。
2、 在頁面中獲得對背景程式實體物件的引用。
3、 在頁面中迭代實體物件集合。
4、 在頁面中獲得實體物件的屬性,及其方法。
5、 對邏輯判斷語句的支援。
6、 對外部檔案的引用。
7、 對外部檔案的解析。
二、nVelocity的工作原理
可以使用.NET的反射實現。以下是nVelocity對迭代實體類的簡單實現步驟:
1、 定義People類,並擁有Name與Sex屬性。表示一個人。
2、 在頁面中列出人物列表,則輸入以下代碼:
#foreach($p in $ps)
<p>歡迎您:$p.Name</p>
#end
3、 擷取人物列表,儲存在_List中。並指定頁面中的字串“ps”對應_List。
4、以文本方式讀模數板檔案,並匹配#foreach…#end段,如果匹配到則繼續匹配$X in $XX 段,分別記錄用於儲存集合與單項的字元,本次為“p”與“ps”。
5 、用Type對象的GetProperties()方法擷取_list中每一項的所有屬性,並在#foreach #end段中迴圈將$p + 屬性名稱替換為當前對象的當前屬性的值。當然如果要調用對象的方法也可以用同樣的方式獲得。
三、基本文法
1、特殊字元介紹
A、“#”:表示開始做什麼事情。
B、“$”:表示用於獲得什麼。(以$開頭的表示“引用”意思是取得一些東東.可引用變數,屬性,方法)
C、“##“:單行注釋。
D、 “#*… …*#”:多行注釋。
2、關鍵字
A、 Set:開始做什麼事情,比如定義變數,給變數重新賦值等。(注意:如果右邊的運算元是一個屬性或命令的引用而返回null,那麼賦值將不會成功,且在隨後的VTL中也不能再取出使用,如果要用做if條件,一個解決辦法是,先給變數賦一個值,然後再將一個屬性或命令的引用賦給該變數)
B、 Foreach:迭代語句
C、 If:條件判斷語句
D、 Elseif
E、 Else
F、 Include:對外部檔案的引用,開始位置為模板路徑。
G、 Parse:對外部檔案的引用,並用nVelocity方式解析。
H、 Macro:建立宏,可以重複做某件事,類似於方法。
I、 Even:雙數執行
J、 Odd :單數執行
K、 Each:每次都執行
(備忘:所有變數在未定義之前不能使用(因為我們習慣了有全域變數的習慣),一個合法的VTL標示符是以一個字母開頭的。.NET後台定義的對象除外。範本語言區分大小寫,所有的關鍵字必須為小寫,預設情況下,NVelocity解析是不分大小寫,當然可以通過設定runtime.strict.math=true,採用嚴格解析模式。)
四、使用樣本
1、 在頁面中使用變數
定義變數:#set($a = “CNF”)
引用變數:歡迎光臨:$a
定義變數:#set($a = 1)
運算:#set($a = $a + 1)
輸出:$a ##得:2
運算:#set($a = $a*5)
輸出:$a ##得:10
#set( $criteria = ["name", "address"] )
#foreach( $criterion in $criteria )
#set( $result = false ) //先設定預設值
#set( $result = $query.criteria($criterion) )
#if( $result )
Query was successful
#end
#end
(備忘:從以上可以看出nVelocity的替換順序與.NET程式碼的執行基本一致,如果放在Foreach語句塊中可以實現累加。並用If語句獲得行號,對特殊行號的內容特殊處理。所有變數在未定義之前不能使用,.NET後台對象除外,最好採用正規引用格式,${a},正規引用格式一般用於在模板中直接調整字串內容;靜態引用輸出:NVelocity遇到一個不能處理的引用時,一般他會直接輸出這個引用$email的寫法,頁面上會看到的是$email,我們可以在$後面加上一個!號,那麼就會輸出空白.$!{email}如果不能處理會輸出空白。如果email己定義了 (比如它的值是 foo),而這裡你卻想輸出 $email. 這樣一個字串,就需要使用逸出字元”\”,如:\$email)
2、 在頁面中使用條件判斷語句
#if ($p.StrSex == "女")
#set($Sex = "女士")
#elseif ($p.StrSex == "男")
#set($Sex = "先生")
#elseif ($p.StrSex == "無")
#set($Sex = "人妖")
#else
#set($Sex = "怪物")
#end
(備忘:可以嵌套在Foreach語句塊中,用於對每個列表對象進行特殊顯示處理。)
3、 建立宏,可以當做方法使用。
建立:#macro(Add $a $b)
#set($c = $a + $b)
<p>最後結果:$c</p>
#end
調用:#Add(1 2)
(備忘:模板引擎的初始化方法有3種,一種參數為模板檔案內容,一種是帶模板檔案地址。結果發現帶模板檔案內容的,在應用宏的時候好像有點問題。另外一個就是假如在宏裡面加入一個判斷語句,則可以實現遞迴調用。)
4、使用對象方法
定義變數:#set($str = “CNF”)
調用方法:$str.SubString(0,1)
輸出:C
定義變數:#set($a = 123)
調用方法:$a.GetType()
輸出:System.Int32
(備忘:不管是.NET代碼定義的對象,還是設計人員在頁面中定義的變數,都可以使用對象的方法及屬性,這一點非常強大。)
5、使用even與odd簡化代碼,each輔助
如上面所說用IF語句可以在列表中為每行建立不同的樣式,但如果只需要區分單行與雙行的話,可以使用even與odd簡化代碼。如下:
#foreach($p in $ps)
#even
<p>雙行:$p.StrName</p>
#odd
<p>單行:$p.StrName</p>
#end
(備忘:在使用這兩個關鍵字時,出現了與建立宏一樣的問題,即在初始化模板引引擎的時候,如果是用模板檔案內容初始化的,會出現問題)
6、引用外部檔案
Include與parse都有引入外部檔案的作用,不同的是parse會根據nVelocity範本語言解析外部檔案。也就是說如果引入當前模板,則會出現死迴圈。
#include 指令碼元素讓模板設計者可以在模板中引入一個本地檔案, 這個被引入的檔案將不會經過NVelocity的解析. 安全起見,可以引放的檔案只是是配置參數TEMPLATE_ROOT所定義目錄下的,預設為目前的目錄下.
#include( "head.html" )
如果需要引入多個檔案,可以像下面這樣.
#include( "one.gif","two.txt","three.htm" )
當然,還可用一個變數名來代替檔案名稱引入.
#include( "greetings.txt", $seasonalstock )
#parse 元素指示可以引入一個包含TVL的本地檔案,這個檔案將被NVeloict engine解析輸出。
#parse( "me.vm" )
與 #include 指令不同, #parse 可以從引入的模板中得到變數引用.但#parse指令只能接受一個參數.VTL templates 被#parse 的模板中還可以再包含#parse聲明,預設的深度為10,這是由配置參數directive.parse.max.depth在檔案velocity.properties中決定的,你可以修改它以適合項目要求。
7、使用Foreach語句
上面多次列出Foreach語句,相信已經知道它的作用。即迴圈列出一組對象集合。比如:#foreach($p in $ps),其中$ps需要與後台代碼中具體的實體類名稱對應,$p代表$ps中的其中一項。上面已經提到過,即$p可以調用實體類的屬性和方法。
(備忘:#foreach 語句必須以#end結束,通過引用變數$velocityCount可以訪問到NVelocity提供的計數器:)
8、建立數組
建立:#set($List = [“男”,”女”])
遍曆:#foreach($Item in $List)
<p>List成員:$Item</p>
#end
輸出:List成員:男
List成員:女
提供一個NVelocity 操作類VelocityHelper,方便大家使用:點擊下載
NVelocity.dll下載:點擊下載
VelocityHelper調用如下:
VelocityHelper vh = new VelocityHelper();
vh.Init("~/template/"); //模板路徑
vh.Put("templateVariable", Variable);
vh.Display("index.htm");
附:NVelocity常用文法指令
對變數的引用:$ [ ! ][ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ][ } ]。
在NVelocity中,對變數的引用都是以$開頭加上變數名稱。當使用!時表示當此變數值為空白時,顯示Null 字元串。比如當$article為空白,那會顯示“$article“,而$!article會顯示為“”。{}為變數名稱限定,有時候變數名稱後會有字串,這是就需要用到{}了。比如$articleshow,想引用$article,這時只要修改為${article}就可以。其實,NVelocity對整個模板解析後都會變成這種模式。
對屬性的引用:$ [ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ]* .[a..z, A..Z ][ a..z, A-Z, 0..9, -, _ ]* [ } ] 。
例如$article.Title或者${article.Title}。
對方法的引用:$ [ { ][ 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’)}。其實對對象的屬性值也可以用$article.get_Title()獲得。
賦值指令#set:# [ { ] set [ } ] ( $ref = [ ", ‘ ]arg[ ", ‘ ] )。
例如:$article.Title=’NVelocity’,$$article.Categories=[1,2,3],當然右側也可以使用複雜的運算式:$article.Title=$otherArticle.Title.SubString(0,3),算術運算式:$article.Page=4/3等等。屬性賦值也可以用$article.set_Title(‘NVelocity’)。
條件指令#if:# [ { ] if [ } ] ( [condition] ) [output] [ # [ { ] elseif [ } ] ( [condition] ) [output] ]* [ # [ { ] else [ } ] [output] ] # [ { ] end [ } ] 。
條件可以是返回bool的複查運算式。例如:#if($article.Total>1) $article.Title #else 沒有資料 #end。
迴圈指令#foreach:# [ { ] foreach [ } ] ($refinarg)statement# [ { ] end [ } ]。
例如:#foreach($article in $articles) $article.Title #end。
引用靜態資源指令#include:# [ { ] include [ } ] ( arg[ arg2 ... argn] )。
例如:#include(‘tmp.js’),會把tmp.js檔案內容插入當前流。當然可以使用運算式:#include($article.Url)。
引用並解析資源指令#parse:# [ { ] parse [ } ] ( arg )。
例如:#parse(‘tmp.js’),與#include不同是,假如tmp.js檔案中有NVelocity的指令,變數會進行處理,並把結果插入到當前流。
停止指令#stop:# [ { ] stop [ } ] 。
當NVelocity解析到此指令時,會停止解析過程。一般使用者調試。
計算指令#evaluate:# [ { ] evaluate [ } ] ( arg )。
例如:#evaluate(‘$article.Title’),會在當前輸出$article.Title
NVelocity的$與Jquery的$發生衝突時的解決方案有以下幾個:
1、
使用jQuery.noConflict。 如:var j = jQuery.noConflict(); j.ajax();
缺點:當使用jQuery的相關外掛程式時,會使得外掛程式失效哦!
2、
使用jQuery代替$. 如:jQuery.ajax();
缺點:不適合擴充,一旦替換成第三方庫時,那就麻煩大發
3、
wrap jQuery中的衝突方法。
如$.ajax()在Velocity中會衝突,則重新定義如下:
function dw(){}
dw.ajax=function(s){ jQuery.ajax(s); } dw.ajax();
4、
定義一個$JQ為$. 以後在js 中就可以用${JQ}AJAX了.
在前台這樣寫(定義):#set($JQ="$.")
【轉】每個人應該知道的NVelocity用法