NVelocity入门,为服务器与客户端传输xml数据,实现Ajax通信铺平
StringBuilder usersXML = new StringBuilder(); // 获取用户信息列表,烦人的sql语句了不见了,coding时是不是很舒服呢 List<UserInfo> users = userInfoDAO.SelectAll(); usersXML.Append("<users count=""+ users.Count +"" title="使用字符串拼接的例子">"); foreach (UserInfo user in users) { usersXML.Append("<user>") .Append("<name>").Append(user.Name).Append("</name>") .Append("<sex>").Append(user.Sex).Append("</sex>") .Append("<city>").Append(user.City).Append("</city>") .Append("</user>"); } usersXML.Append("</users>"); Response.Clear(); Response.ContentType = "text/xml"; Response.Write("<?xml version="1.0" encoding="utf-8" ?>"); Response.Write(usersXML.ToString()); Response.End(); 这种方式实现挺简单的,看起来效果也不错,于是心底暗自偷笑:“真是小菜一碟,数据准备好了,接下来可以玩Ajax了,多么酷的效果哦,爽…….”。可别得意,先来看这么做存在的一个问题,一个很严重的问题:
<?xml version="1.0" encoding="utf-8" ?> <users count="用户人数" title="标题"> <!-- 要是可以在这边来个循环,把用户循环显示出来就好了--> <user> <name>用户名</name> <sex>性别</sex> <city>城市</city> </user> </users> <?xml version="1.0" encoding="utf-8" ?> <users count="用户人数" title="标题"> <!-- 要是可以在这边来个循环,把用户循环显示出来就好了--> <user> <name>用户名</name> <sex>性别</sex> <city>城市</city> </user> </users>
<?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());
终于搞定了,是不是很简单。 代码包中包含了一个调用已编译dll中的模板的例子(user.xml模板已经被编译进dll中了,这样带来的好处是:以后你只需要将修改的dll覆盖掉原来的dll就可以了,大哥,组件化开发呀),代码差不多,我就不多说了,该说的我都说了,该你看了吧! 原文:http://depravedangel.iteye.com/blog/335598 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |