`
pcajax
  • 浏览: 2173631 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

每个人应该知道的NVelocity用法

 
阅读更多

每个人应该知道的NVelocity用法 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

摘自:http://www.cnblogs.com/hxling/archive/2011/10/23/2221918.html

 

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

 一、nVelocity的常用功能简介

    1 在页面中定义变量,并进行简单的运算。

    2 在页面中获得对后台程序实体对象的引用。

    3 在页面中迭代实体对象集合。

    4 在页面中获得实体对象的属性,及其方法。

    5 对逻辑判断语句的支持。

    6 对外部文件的引用。

    7 对外部文件的解析。

二、nVelocity的工作原理

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

    1 定义People类,并拥有NameSex属性。表示一个人。

    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、使用evenodd简化代码,each辅助

         如上面所说用IF语句可以在列表中为每行创建不同的样式,但如果只需要区分单行与双行的话,可以使用evenodd简化代码。如下:

    

     #foreach($p in $ps)

              #even

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

             #odd

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

      #end

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

     6、引用外部文件

          Includeparse都有引入外部文件的作用,不同的是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中,对变量的引用都是以$开头加上变量名称。当使用!时表示当此变量值为空时,显示空字符串。比如当$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用法

    ### NVelocity用法详解 NVelocity 是一个 .NET 框架下的模板引擎,它提供了一种简单且高效的方式来处理动态内容的生成。基于 Java 的 Velocity 引擎,NVelocity 被设计用于 .NET 平台,允许开发人员利用其强大的...

    NVelocity 中文手册

    - **NVelocity**: 虽然名称有所不同,但从上下文来看,NVelocity应该是Velocity的一个分支或变体。因此,对于NVelocity的理解,我们可以参考Velocity的相关概念和技术。 #### 二、Velocity模板语言(VTL) - **...

    NVelocity示例

    在这个例子中,`$title`和`$users`是来自后端的数据,`#foreach`循环遍历用户列表并展示每个用户的姓名和电子邮件。 接下来,我们需要在.NET代码中设置NVelocity上下文,并渲染模板。以下是一个简单的C#示例: ```...

    [ASP.NET]邮件发送模块

    每个附件是`Attachment`类的一个实例,通过构造函数传入文件路径。 5. **邮件认证**:某些SMTP服务器需要进行身份验证,可以通过设置`SmtpClient`的`EnableSsl`属性启用SSL/TLS加密,`UseDefaultCredentials`为...

    C#自动生成.cs文件

    当我们编写C#程序时,通常会创建多个.cs文件,每个文件代表一个或多个相关的类或功能。 自动生成.cs文件的方法有多种,其中最常见的是使用文本模板引擎和代码生成库。以下是一些关键技术点: 1. **文本模板引擎**...

    Jquery插件

    // 对每个匹配的元素执行操作 }); }; })(jQuery); ``` 在这里,`$.fn`(即`$.prototype`)被用来扩展jQuery对象的方法。`options`参数用于传递配置项,可根据需求定制插件的行为。 ### `jQueryPad.exe.config`...

    MonoRail基础学习文档和实例

    控制器通常由多个方法组成,每个方法对应一个特定的URL路由。 2. **Action**:控制器中的每个方法被称为Action,这些Action根据URL请求参数被调用,执行相应的业务逻辑。例如,`Index()` 方法通常用于显示默认页面...

    MonoRail+IBatisNet +Velocity

    在VS2010中配置这些组件可能需要一些时间和耐心,因为每个框架都有自己的配置文件和约定,但一旦设置完毕,你将获得一个强大且易于维护的开发环境。 具体配置步骤大致如下: 1. 安装Castle Project的NuGet包,包括...

    详解linux下的.net/mvc/cms程序结构

    模板引擎部分,Razor模板被存储在Themes文件夹下,每个不同的CMS风格对应一个文件夹。用户可以根据需求通过后端设置轻松切换模板。虽然文章中提到模板切换功能还在完善中,但这种方式已经为自定义和扩展提供了很好的...

    数据字典生成工具源码 (c#)

    在生成数据字典时,反射可以用来获取数据库中每个表对应的实体类信息,包括类名、属性名(对应数据库字段)和属性类型。 3. **XML序列化与反序列化**:数据字典通常会以XML或JSON格式保存,便于读写和交换。C#提供...

    ASP代码与页面分离

    这样,可以在不同的页面中复用相同的代码块,而不必在每个页面中复制粘贴。 2. **自定义服务器控件(Custom Server Controls)**:ASP支持创建自定义服务器控件,这些控件有自己的属性和方法,可以封装复杂的业务...

    C#生成IBatisNet实体和XML配置文件

    每个类代表一个数据库表,类中的属性对应表中的字段,属性类型应与数据库字段类型一致。 接下来,我们需要生成XML配置文件。IBatisNet的XML配置文件主要包含两部分:SQL映射和结果映射。SQL映射定义了各种SQL语句,...

    传智播客C#/.net MVC 电商项目中用到的各种企业级Helper

    下面将详细解释每个Helper类的作用和可能涉及的技术点: 1. **SqlHelper.cs**:这是一个数据库操作助手类,通常用于简化对SQL的执行。它可能包含了执行SQL查询、存储过程的方法,如ExecuteNonQuery(执行非查询SQL...

    实体类代码生成器

    2. 属性定义:每个属性对应数据库表的一列,其名称和类型应与数据库列保持一致。可以使用`public`或`private`关键字来控制访问修饰符,以决定这些属性是否能在类的外部直接访问。 3. 数据注解:对于ORM框架,需要...

    英文版ASPNET_MVC2 ppt

    每个组件都可以独立进行测试,而无需依赖整个系统环境。这大大提高了代码质量,减少了调试时间。 ##### 支持红绿TDD(测试驱动开发) MVC2框架鼓励使用测试驱动开发方法,即先编写测试用例,再编写能够通过这些...

Global site tag (gtag.js) - Google Analytics