天天看点

nvelocity学习笔记

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

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

1、   NVelocity 是 Velocity 在 .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、   使用 even 与 odd 简化代码, each 辅助

#foreach($p in $ps)

  #even

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

  #odd

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

#end

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

6、   引用外部文件

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

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

8、   创建数组

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

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

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

            #end

输出: List 成员:男

            List 成员:女

转自:http://hi.baidu.com/%C4%E9%C9%F9/blog/item/c975661536d8746fcb80c40d.html