老大终于给我们布置了实战性的任务。嘿嘿。想到自己做的东西可能要被千千万万的人看到,心里有点小兴奋。
不过,老大的任务里有个东西我以前没有接触过。所以今天一天都在学习这个——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