NVelocity用法(转)

每一个人应该知道的NVelocity用法

 

NVelocity是一个基于.NET的模板引擎(template engine)。它容许任何人仅仅简单的使用模板语言(template language)来引用由.NET代码定义的对象。从而使得界面设计人员与.NET程序开发人员基本分离。html

 

 1、nVelocity的经常使用功能简介ajax

    一、 在页面中定义变量,并进行简单的运算。数组

    二、 在页面中得到对后台程序实体对象的引用。安全

    三、 在页面中迭代实体对象集合。post

    四、 在页面中得到实体对象的属性,及其方法。lua

    五、 对逻辑判断语句的支持。url

    六、 对外部文件的引用。插件

    七、 对外部文件的解析。设计

2、nVelocity的工做原理调试

    可使用.NET的反射实现。如下是nVelocity对迭代实体类的简单实现步骤:

    一、 定义People类,并拥有Name与Sex属性。表示一我的。

    二、 在页面中列出人物列表,则输入如下代码:

 

        #foreach($p in $ps)

          <p>欢迎您:$p.Name</p>

        #end

    三、 获取人物列表,保存在_List中。并指定页面中的字符串“ps”对应_List。

    四、以文本方式读取模板文件,并匹配#foreach…#end段,若是匹配到则继续匹配$X in $XX 段,分别记录用于保存集合与单项的字符,本次为“p”与“ps”。

    5 、用Type对象的GetProperties()方法获取_list中每一项的全部属性,并在#foreach  #end段中循环将$p + 属性名称替换为当前对象的当前属性的值。固然若是要调用对象的方法也能够用一样的方式得到。

 

3、基本语法

     一、特殊字符介绍

         A、“#”:表示开始作什么事情。

         B、“$”:表示用于得到什么。(以$开头的表示“引用”意思是取得一些东东.可引用变量,属性,方法)

         C、“##“:单行注释。

         D、 “#*… …*#”:多行注释。

     二、关键字

          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,采用严格解析模式。)

 

4、使用示例

    一、  在页面中使用变量

        定义变量:#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语句块中,用于对每一个列表对象进行特殊显示处理。)

    三、  建立宏,能够当作方法使用。

         

 

建立:#macro(Add $a $b)

         #set($c = $a + $b)

          <p>最后结果:$c</p>

      #end

 调用:#Add(1 2)

   

   (备注:模板引擎的初始化方法有3种,一种参数为模板文件内容,一种是带模板文件地址。结果发现带模板文件内容的,在应用宏的时候好像有点问题。另一个就是假如在宏里面加入一个判断语句,则能够实现递归调用。)

    四、使用对象方法

        定义变量:#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

    (备注:在使用这两个关键字时,出现了与建立宏同样的问题,即在初始化模板引引擎的时候,若是是用模板文件内容初始化的,会出现问题)

     六、引用外部文件

          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中决定的,你能够修改它以适合项目要求。

     七、使用Foreach语句

          上面屡次列出Foreach语句,相信已经知道它的做用。即循环列出一组对象集合。好比:#foreach($p in $ps),其中$ps须要与后台代码中具体的实体类名称对应,$p表明$ps中的其中一项。上面已经提到过,即$p能够调用实体类的属性和方法。

    (备注:#foreach 语句必须以#end结束,经过引用变量$velocityCount能够访问到NVelocity提供的计数器:)

    八、建立数组

 

          建立:#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中,对变量的引用都是以$开头加上变量名称。当使用!时表示当此变量值为空时,显示空字符串。好比当$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的$发生冲突时的解决方法有如下几个: 一、 使用jQuery.noConflict。 如:var j = jQuery.noConflict(); j.ajax(); 缺点:当使用jQuery的相关插件时,会使得插件失效哦! 二、 使用jQuery代替$. 如:jQuery.ajax(); 缺点:不适合扩展,一旦替换成第三方库时,那就麻烦大发 三、 wrap jQuery中的冲突方法。 如$.ajax()在Velocity中会冲突,则从新定义以下: function dw(){} dw.ajax=function(s){ jQuery.ajax(s); } dw.ajax(); 四、 定义一个$JQ为$. 之后在js 中就能够用${JQ}AJAX了. 在前台这样写(定义):#set($JQ="$.") 

相关文章
相关标签/搜索