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