數據字典生成工具之旅(6):NVelocity語法介紹及實例

      本章開始將會爲你們講解NVelocity的用法,並帶領你們實現一個簡單的代碼生成器。html

  NVelocity是一個基於.NET的模板引擎(template engine)。它容許任何人僅僅簡單的使用模板語言(template language)來引用由.NET代碼定義的對象。從而使得界面設計人員與.NET程序開發人員基本分離。app

NVelocity的經常使用功能簡介

    一、 在頁面中定義變量,並進行簡單的運算。工具

    二、 在頁面中得到對後臺程序實體對象的引用。學習

    三、 在頁面中迭代實體對象集合。測試

    四、 在頁面中得到實體對象的屬性,及其方法。spa

    五、 對邏輯判斷語句的支持。設計

基本語法

    一、特殊字符介紹code

         A、「#」:表示開始作什麼事情。htm

         B、「$」:表示用於得到什麼。(以$開頭的表示「引用」意思是取得一些東東.可引用變量,屬性,方法)

         C、「##「:單行註釋。

         D、 「#*… …*#」:多行註釋。

     二、關鍵字

          A、 Set:開始作什麼事情,好比定義變量,給變量從新賦值等。(注意:若是右邊的操做數是一個屬性或命令的引用而返回null,那麼賦值將不會成功,且在隨後的VTL中也不能再取出使用,若是要用作if條件,一個解決辦法是,先給變量賦一個值,而後再將一個屬性或命令的引用賦給該變量)

          B、 Foreach:迭代語句

          C、 If:條件判斷語句

          D、 Elseif

          E、 Else

          F、  Even:雙數執行

          G、  Odd :單數執行

          K、 Each:每次都執行

    (備註:全部變量在未定義以前不能使用(由於咱們習慣了有全局變量的習慣),一個合法的VTL標示符是以一個字母開頭的。.NET後臺定義的對象除外。模板語言區分大小寫,全部的關鍵字必須爲小寫,默認狀況下,NVelocity解析是不分大小寫的,固然能夠經過設置runtime.strict.math=true,採用嚴格解析模式。)

 

    3.使用示例

    一、  在頁面中使用變量

        定義變量:#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)

    二、  在頁面中使用條件判斷語句

 

        #if ($p.StrSex == "女")

            #set($Sex = "女士")

       #elseif ($p.StrSex == "男")

            #set($Sex = "先生")

       #elseif ($p.StrSex == "無")

            #set($Sex = "人妖")

       #else

            #set($Sex = "怪物")

       #end

     (備註:能夠嵌套在Foreach語句塊中,用於對每一個列表對象進行特殊顯示處理。)

    四、使用對象方法

        定義變量:#set($str = 「CNF」)

        調用方法:$str.SubString(0,1) 

         輸出:C

 

         定義變量:#set($a = 123)

         調用方法:$a.GetType()

         輸出:System.Int32

    (備註:不論是.NET代碼定義的對象,仍是設計人員在頁面中定義的變量,均可以使用對象的方法及屬性,這一點很是強大。)

     五、使用even與odd簡化代碼,each輔助

         如上面所說用IF語句能夠在列表中爲每行建立不一樣的樣式,但若是隻須要區分單行與雙行的話,可使用even與odd簡化代碼。以下:

    

 

     #foreach($p in $ps)

              #even

              <p>雙行:$p.StrName</p>

             #odd

             <p>單行:$p.StrName</p>

      #end

    (備註:在使用這兩個關鍵字時,出現了與建立宏同樣的問題,即在初始化模板引引擎的時候,若是是用模板文件內容初始化的,會出現問題)

實例介紹   

  1.生成前臺html

  

     怎麼經過NVelocity生成上圖的表格呢,請看下面的例子,先看模版文件

   

<table id="appMenu" style="background-color: rgb(114, 136, 172); border: solid 1px #00377a;
    height: 23px; color: White; font-size: 12px; font-family: 宋體; width: 100%; cursor: default;"
    cellspacing="0" cellpadding="0">
    <tr>
        <td style="padding-left: 5px" nowrap="">
            <b>學生信息列表</b>
        </td>
        <td style="padding-right: 5px; text-align: right;" nowrap="">
            <span><span onclick="alert(1)">新增</span> <span class="mnuBtn" onclick="alert(2)">刪除</span>
            </span>
        </td>
    </tr>
</table>
<table border="1" style="width: 100%; border: solid 1px #dbdac9; border-collapse: collapse;
    table-layout: fixed; cursor: default; font-size: 12px; font-family: 宋體;" cellspacing="0"
    cellpadding="0">
    <colgroup>
        <col width="40">
        <col width="12%">
        <col width="12%">
        <col width="12%">
        <col width="12%">
        <col width="12%">
        <col width="12%">
        <col width="12%">
        <col />
    </colgroup>
    <tr height="22" style="background-color: rgb(233, 231, 215);">
        <th align="center">
            序號
        </th>
        <th>
            學生姓名
        </th>
        <th>
            年級
        </th>
        <th>
            專業
        </th>
        <th>
            性別
        </th>
        <th>
            考試成績
        </th>
        <th>
            級別
        </th>
        <th>
            申請時間
        </th>
        <th>
            申請狀態
        </th>
    </tr>
    #foreach( $s in $ListStudent )
    <tr height="22">
        <td>
            $s.Num
        </td>
        <td>
            $s.Name
        </td>
        <td>
            $s.Grade
        </td>
        <td>
            $s.Major
        </td>
        <td>
                  $s.Sex
        </td>
        <td align="right">
            #if($s.Status=="已審覈") $s.Score #else
            <input style="border:solid 1px black;width:95%;" value="$s.Score" />
            #end
        </td>
        <td align="right">
            #if($s.Status=="已審覈") $s.Level #else
            <input style="border:solid 1px black;width:95%;" value="$s.Level" />
            #end
        </td>
        <td align="center">
          $s.GetAppoveDate($s.Status)
        </td>
        <td align="center">
            $s.Status
        </td>
    </tr>
    #end
</table>

    用到了foreach循環和調用類的方法,這裏特別強調一下,其實NVelocity和直接寫後臺代碼相似,經過.方法名就能夠調用變量有的方法

    後臺代碼文件

  

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Hashtable ht = new Hashtable();
                List<Student> list = new List<Student>();
                for (int i = 1; i < 10; i++)
                {
                    Student s = new Student();
                    s.Num = i;
                    s.Name = "Test"+i.ToString();
                    s.Score = i.ToString();
                    s.Status = i % 2 == 0 ? "未審覈" : "已審覈";
                    s.Sex = i % 2 == 0 ? "" : "";
                    s.Level = i.ToString ();
                    s.Major = "測試";
                    s.Grade = "大一";
                    list.Add(s);
                }
                ht["ListStudent"] = list;
                divTemplate.InnerHtml = FileGen.GetFileText(Server.MapPath(@"模版文件\列表模版.vm"), ht).ToString();
            }
        }

     爲了更方面的使用NVelocity,封裝了一個幫助類即上面的FileGen類

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NVelocity.App;
using Commons.Collections;
using NVelocity.Runtime;
using NVelocity;
using NVelocity.Context;
using System.IO;
using System.Collections;

namespace NVelocityDemo
{
    /// <summary>
    /// SQL文件生成
    /// </summary>
    public class FileGen
    {
        /// <summary>
        /// 經過模版文件路徑讀取文件內容
        /// </summary>
        /// <param name="path">模版文件路徑</param>
        /// <param name="ht">模版文件的參數</param>
        /// <returns>StringWriter對象</returns>
        public static StringWriter GetFileText(string path, Hashtable ht)
        {
            if (String.IsNullOrEmpty(path))
            {
                throw new ArgumentNullException("模版文件路徑爲空!");
            }
            try
            {
                string tmpPath = path.Substring(0,path.LastIndexOf(@"\"));
                string filePath = path.Substring(path.LastIndexOf(@"\")+1);
                //建立NVelocity引擎的實例對象
                VelocityEngine velocity = new VelocityEngine();
                ExtendedProperties props = new ExtendedProperties();
                props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");
                props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, tmpPath);
                props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, true);
                props.AddProperty(RuntimeConstants.INPUT_ENCODING, "utf-8");
                props.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "utf-8");
                velocity.Init(props);
                //從文件中讀取模板
                Template temp = velocity.GetTemplate(filePath);
                IContext context = new VelocityContext();
                foreach (string key in ht.Keys)
                {
                    context.Put(key, ht[key]);
                }
                //合併模板
                StringWriter writer = new StringWriter();
                temp.Merge(context, writer);
                return writer;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 經過模版文件路徑讀取文件內容
        /// </summary>
        /// <param name="path">模版文件路徑</param>
        /// <param name="ht">模版文件的參數</param>
        /// <param name="strOutputPath">生成文件的輸出路徑,如c:\1.txt</param>
        /// <returns>TextWriter對象</returns>
        public static void GetFile(string path, Hashtable ht,string strOutputPath)
        {
            if (String.IsNullOrEmpty(strOutputPath))
            {
                throw new ArgumentNullException("模版文件輸出路徑爲空!");
            }
            try
            {
                StringWriter stringW=GetFileText(path, ht);
                StreamWriter sw = new StreamWriter(strOutputPath,false,Encoding.UTF8);
                sw.Write(stringW.ToString());
                sw.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}

        上面的例子差很少將NVelocity語法都使用到了,沒使用過NVelocity的能夠經過上述例子學習語法,下一章將利用本章的語法寫出一個簡單的代碼生成器,敬請期待!

    本章例子下載

工具源代碼下載

      目前總共有通過了七個版本的升級,如今提供最新版本的下載地址

數據字典生成工具V2.0安裝程序 最新安裝程序
數據字典生成工具源代碼 最新源代碼
http://code.taobao.org/svn/DataDicPub SVN最新源碼共享地址

學習使用

      若是你使用了該工具,或者想學習該工具,歡迎加入這個小組,一塊兒討論數據字典生成工具、把該工具作的更強,更方便使用,一塊兒加入147425783 QQ羣

      更多數據字典生成工具資料請點擊數據字典生成工具專題

 

相關文章
相關標籤/搜索