nvelocity学习笔记

老大终于给我们布置了实战性的任务。嘿嘿。想到自己做的东西可能要被千千万万的人看到,心里有点小兴奋。

不过,老大的任务里有个东西我以前没有接触过。所以今天一天都在学习这个——nvelocity。嘿嘿。现在把我的学习笔记贴出来,供以后参考。嘿嘿。

1、  NVelocityVelocity.NET平台上的一个实现。

2、  原来的xml是这个样子的:

<?xml version=’1.0’ encoding=’utf-8’?>

<users count=’用户人数’ title=’标题’>

           < !—要是可以在这里来个循环,把用户循环显示出来就好了à

           < user>

                    < name>用户名</name>

                    < sex>性别</sex>

                    < city>城市</city>

           < /user>

<users>

生成貌似上面xml格式数据的模板应该怎么写?如下代码:

<?xml version=’1.0’ encoding=’utf-8’?>

#foreach($u in $ListUsers)

#beforeall

<users count=’$Count’ title=’$Title’>

           #each

           < user>

                    < name>$u.Name</name>

                    < sex>$u.Sex</sex>

                    < city>$u.City</city>

           < /user>

#afterall

</users>

#nodata

<users>暂无用户资料</users>

#end

然后看看在服务器端怎么调用这个模板,并传给这个模板listUsers这个参数:

//获取到用户列表

IList<UserInfo> listUsers=UserInfoService.GetAllUsers();

//创建一个模板引擎

VelocityEngine vltEngine=new VelocityEngine();

//文件型模板,还可以是assembly,则使用资源文件

vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER,”file”);

//模板存放目录

vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH,Server.MapPath(“~/Template”));

vltEngine.Init();

//定义一个模板上下文

VelocityContext vltContext=new VelocityContext();

//传入模板所需要的参数

vltContext.Put(“Title”,”NVelocity文件模板例子”);

vltContext.Put(“Count”,listUsers.Count);

vltContext.Put(“ListUsers”,listUsers);

//获取我们刚才所定义的模板,上面已设置模板目录,此处用相对路径即可

Template vltTemplate=vltEngine.GetTemplate(“users.xml”);

//定义一个字符串输出流

StringWriter vltWriter=new StringWriter();

//根据模板的上下文,将模板生成的内容写进刚才定义的字符串输出流中

vltTemplate.Merge(vltContext,vltWriter);

//输出字符串流中的数据

Response.Write(vltWriter.GetStringBuilder().ToString());

3、  nVelocity是一个基于.NET的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由.NET代码定义的对象。

4、  VTL——nVelocity template language

5、  Velocity中仅String可以被赋值给变量。使用方式:#set($a=”Velocity”)

6、  关于Nvelocity的语法:

1、  单行注释:##单行注释

2、  多行注释:#*

多行注释

多行注释

                                     *#

         3、文档格式:#**

                  这是一个VTL注释块

                 可以用来存储这些信息文档的作者

                 及版本信息:

                 @version 5                  @author

                                     **#

4、  VTL中有三种类型的references:变量(variables)、属性(properties)、方法(methods)。

5、  VTL中的一切reference可以作为一个String对象处理。

6、  属性的例子:

$customer.Address

$purchase.Total

$customer.Address有两种含义,它可以表示:查找hashtable对象customer中以Address为关键字的值;也可以表示调用customer对象的getAddress()方法。

7、  方法就是被定义在.NET中的一段代码,并且它有完成某些有用工作的能力。例如:

$customer.getAddress()

$purchase.getTotal()

$page.setTitle(“My Home Page”)

$person.setAttribute([“Strange”,”Weird”,”Excited”])

VTL属性可以作为VTL方法的缩写。$customer.Address属性和使用$customer.getAddress()方法具有相同的效果。使用属性的方式比较合理。属性和方法的不同点在于你能够给一个方法指定一个参数列表。

8、  可以使用如下这种方式给文本框传值:

<input type=”text” name=”email” value=”$!email” />

或者:<input type=”text” name=”email” value=”$!{email}” />

9、  VTL中使用$2.5这样的货币标识是没有问题的,因为VTL中的reference总是以一个大写或者小写的字母开始。

10、  VTL中使用作为转义字符。

#set($email=”foo”)

$email         “$email    “”$email         “””$email         对应的输出如下:

Foo     $email      “foo  “”$email

11、  咋正在VTL中定义变量呢?是通过#set($email=”foo”)这样的方式吗?

#set($foo=”gibbous”)

$moon=$foo的输出结果是:$moon=gibbous

12、  赋值#set被用来设这一个reference的值。如:#set($foo=”abd”)

等号左边是一个变量或者属性reference,右侧可以是变量/字符串/属性/方法/数字/ArrayList     请看下面的例子:

#set($foo=$bill)           ##变量referen

#set($foo.Friend=”mone”)         ##字符串

#set($foo.ban=$whke.lean)       ##属性reference

#set($foo.plan=$soss.wef($web))     ##方法reference

#set($foo.num=123)           ##数字

#set($foo.say=[“not”,”my”,”own”])            ##ArrayList

注意:ArrayList的取值方法为:$foo.say.get(0)

#set($value=$foo+1)           ##右侧也可以是简单的算术运算,如加减乘除

13、  使用#setdirective时,字符串被封闭在一对双引号内。如:

#set($foo=”www”)

$set($fnn=”abd.vm”)

#set($fcc=”$foo/$fnn”)

$fcc

得到的结果是:www/abc.vm

但是,当字符串被封装在单引号内时,它将不被解析。

上面这个特性可以通过修改Views目录下的nvelocity.properties文件的stringliterals.interpolate=false的值来改变上面的特性是否有效。

14、  条件语句if/elseif/else

1、  Nvelocity的常用功能简介

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

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

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

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

E、  对逻辑判读语句的支持。

F、  对外部文件的引用。

G、对外部文件的解析。

2、  基本语法:

1、  特殊字符介绍:

#                   表示开始做什么事情

$                   表示用于获得什么

##       单行注释

#*…*#         多行注释

2、  关键字

set               开始做什么事情,比如定义变量,给变量重新赋值等

foreach                迭代语句

if                            条件判断语句

elseif

else

include                 对外部文件的引用,开始位置为模板路径

parse                    对外部文件的引用,并用nvelocity方式解析

macro                            创建宏,可以重复做某件事,类似于方法

even                      双数执行

odd                        单数执行

each                      每次都执行

注意:所有的变量在未定义之前不能使用。.NET后台定义的对象除外。模板语言区分大小写,所有的关键字必须小写。上面的列表不是很全。

3、  创建宏。可以当做方法使用。

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

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

           < p>最后的结果:</p>

           #end

调用:#Add(1 2)

注意:模板引擎的初始化方法有三种:一种参数为模板文件内容,一种是带模板文件地址。另一种就是假如在宏里面引入一个判断语句,则可以实现递归调用。这里有个问题:如果是带模板文件地址的话,发现模板文件内容yoga宏的时候好像有点问题。???

4、  使用对象方法

定义变量:#set($str=”cnf”)

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

输出:c

定义变量:#set($a=123)

调用方法:$a.GetType()

输出:System.Int32

注意:不管是.NET代码定义的对象,还是设计人员在页面中定义的变量,都可以使用对象的方法和属性。???(意思是都可以用c#中的方法吗?)

5、  使用evenodd简化代码,each辅助

#foreach($p in $ps)

#even

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

#odd

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

#end

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

6、  引用外部文件

Includeparse都有引入外部文件的作用,不同的是parse会根据nvelocity模板语言解析外部文件。也就是说如果引入当前模板,会出现死循环。

7、  #foreach语句必须以#end结束

8、  创建数组

创建:#set($List=[“”,””])

遍历:#foreach($Item in $List)

           < p>List成员:$Item</p>

           #end

输出:List成员:男

           List成员:女

来处:http://blog.csdn.net/zoohouse/article/details/6285548

原文地址:https://www.cnblogs.com/lidj/p/3488778.html