NVelocity常用标签和使用方式

NVelocity是从java编写的Velocity移植的.net版本,是java界超强的模版系统,.net版本的NVelocity。
NVelocity拥有完善的、丰富的模板语言(VTL,Velocity Template Language) ,几乎所有高级语言的特性都可以在模板引擎语言中找到。(如流程控制语句、数学运算、关系和逻辑操作符、函数定义、注释等等)


NVelocity可以做什么?
能够快速生成所需的代码、SQL脚本、页面文件等基于文本内容的文件
生成速度快、模板语言完善、灵活性好
容易学习、开源,免费使用
前身为Velocity(Java),使用者多,资料全


NVelocity用途
在编写代码的时候,我们可以发现很多内容都是不需要变化的,变化的只是一小部分内容,对不同的对象,这些内容不同。
如果我们需要生成一个变化的文档,是否需要在代码拷贝这些不变化的内容么,或者把它剥离开放到其他的文件去么?还有我们是否能对这些内容有一些简单的控制和引用么?

简单例子(主要规则:引用以$开头用于取得什么东西,而指令以# 开始用于做什么事情)


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 + 属性名称替换为当前对象的当前属性的值。当然如果要调用对象的方法也可以用同样的方式获得。


NVelocity基本语法

     1、特殊字符介绍

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

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

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

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


NVelocity关键字

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


首先看Nvelocity的映射代码:(需要引入命名空间 NVelocity; NVelocity.App; NVelocity.Runtime;)


//用的时候考代码即可,只需改三个地方:模板所在文件夹、添加数据、设定模板
VelocityEngine vltEngine = new VelocityEngine();
vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
//模板文件所在的文件夹,例如我的模板为templates文件夹下的TestNV.html
vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));
vltEngine.Init();

VelocityContext vltContext = new VelocityContext();
vltContext.Put("dataName", person);//添加数据,在模板中可以通过$dataName来引用数据 
vltContext.Put("dataName2", person);//可添加多个数据,基本支持所有数据类型,包括字典、数据、datatable等
Template vltTemplate = vltEngine.GetTemplate("TestNV.html");//设定模板
System.IO.StringWriter vltWriter = new System.IO.StringWriter();
vltTemplate.Merge(vltContext, vltWriter);

string html = vltWriter.GetStringBuilder().ToString();
context.Response.Write(html);//返回渲染生成的标准html代码字符串


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="$.") 



评论回复