NVelocity入门,为服务器与客户端传输xml数据,实现Ajax通信铺平道路[转]
2009-06-05 11:28
357 查看
要是直接写个xml,像这个样子:
<?xml version="1.0" encoding="utf-8" ?>
<users count="用户人数" title="标题">
<!-- 要是可以在这边来个循环,把用户循环显示出来就好了-->
<user>
<name>用户名</name>
<sex>性别</sex>
<city>城市</city>
</user>
</users>
到时候我们给这个xml一个人员列表的数据,让它可以生成一个人员列表的xml,这样的工具,我们管它叫模板引擎,NVelocity就属于这类。只要使用模板语言(template language)来编写好模板,到时候给模板引擎解析,并生成我们需要的数据。
好,既然这样,下面我们来看一下生成貌似上面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的人员列表数据,模板引擎就会帮我们生成需要的数据,
其实,学过一些编程语言后,在读模板语言写的代码时,基本上都能够猜出是什么意思。
我们现在来看看上面那个模板是什么意思:
#foreach($u in $ListUsers)其实跟C#里面的foreach(Java中的扩展for)几乎一样,就死遍历ListUsers里面的数据,每次遍历的值放到对象u中,接下来
#beforeall:就是在遍历ListUsers前,先输出<users count="$Count" title="$Title">
#each:就是每遍历一下,得到一个u,就输出
<user>
<name>$u.Name</name> //$u.Name就是输出u对象的Name属性,在Java中就肯定是调用getName()方法了哦,C#实现的NVelocity也延续了java的习惯,就是说,这个也可以表示调用getName()方法,具体是直接调用属性,还是调用方法得看具体情况,NVelocity会自动辨别的
<sex>$u.Sex</sex>
<city>$u.City</city>
</user>
#afterall:遍历完ListUsers后,输出</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());
终于搞定了,是不是很简单。
相关文章推荐
- 【转载】NVelocity入门,为服务器与客户端传输xml数据,实现Ajax通信铺平道路
- NVelocity入门,为服务器与客户端传输xml数据,实现Ajax通信铺平道路
- 解如何利用 XML 和 JavaScript Object Notation 在 Ajax 客户端和 Java 服务器之间传输数据(代码)(Oracle)。
- java做服务器,android做客户端,实现数据传输
- 【flex、Red5】Red5服务器+flex客户端中xml数据的压缩以及传输
- 【代码练习5】使用套接字实现客户端和服务器的数据传输
- 解如何利用 XML 和 JavaScript Object Notation 在 Ajax 客户端和 Java 服务器之间传输数据。
- 使用TCP协议实现客户端和服务器数据传输
- ASP.NET 中使用隐藏域实现客户端和服务器传输大量信息
- 左右互搏,基于http的xml消息的服务器和客户端实现
- c++服务器与android客户端进行文件传输功能的实现
- 如何实现两台服务器间无密码的传输数据和操作
- 一种即时通信数据传输方法、客户端、服务器及系统
- php webservice实现客户端提交数据库数据到服务器并返回另一份数据库数据
- 简单socket服务(三)实现多客户端向服务器发送数据并保证服务器接收到数据
- Android入门:通过XML数据与服务器进行通信
- COMET服务器推技术 – 实现Web服务器“主动”向客户端发送数据
- Android客户端向Python服务器以POST方式传输数据
- Windows 采用Socket方式实现服务器和客户端的数据访问
- flashAS实现远程服务器xml数据读取解析