【轉】每個人應該知道的NVelocity用法

來源:互聯網
上載者:User

標籤: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用法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.