掌握一种 C#/.Net 模板技术 — Velocity



考究一下 C# 中怎么使用相应的 nVelocity 模板。

当目光转移到了 C#/.Net 之后,但凡想要找个某个功能组件时都会联想到,曾经在 Java 中用过什么,.Net 中应该会有它相应的实现,例如 Spring.Net, nHibernate, iTextSharp,还有这里的 nVelocity,特点就是组件名一般是 .Net 结尾或 n 字打头。

还是依照原来的例子,从 http://sourceforge.net/projects/nvelocity/files/ 下载 nVelocity 组件,当前版本是 NVelocity-0.4.2.8580。下载后解压,在你的项目中引入 build 目录中的 NVelocity.dll,如果是 web 项目中用 nVelocity,可附加引入 NVelocity.Http.dll。 

第一步:建立模板,模板语言的语法也基本一致的,如创建文件 HelloNVelocity.vm,把它放在 d:\tempalte\ 目录下,内容为:

1 ## {单据责任人}:您的 {单据号} 号{单据类型}在 {操作日期} 日已支付
2 ${owner}:您的 ${bill} 号${type}在 ${date} 已支付

第二步:加载模板,填充值,输出,HelloNVelocity.cs

01 using System;
02 using System.IO;
03 using NVelocity;
04 using NVelocity.App;
05 using NVelocity.Runtime;
06   
07 public class HelloNVelocity
08 {
09     public static void Main(string[] args)
10     {
11         VelocityEngine vltEngine = new VelocityEngine();
12         vltEngine.SetProperty(RuntimeConstants_Fields.RESOURCE_LOADER, "file");
13         vltEngine.SetProperty(RuntimeConstants_Fields.FILE_RESOURCE_LOADER_PATH, "d:/Template/");
14         vltEngine.Init();
15   
16         Template vltTemplate = vltEngine.GetTemplate("HelloNVelocity.vm");
17   
18         VelocityContext vltContext = new VelocityContext();
19   
20         vltContext.Put("owner", "Unmi");
21         vltContext.Put("bill", "1000");
22         vltContext.Put("type", "报销单");
23         vltContext.Put("date", DateTime.Now.ToLongDateString());
24   
25         StringWriter vltWriter = new StringWriter();
26         vltTemplate.Merge(vltContext, vltWriter);
27   
28         Console.WriteLine(vltWriter.GetStringBuilder().ToString());
29   
30         Console.Write("Press any key to continue . . . ");
31         Console.ReadKey(true);
32     }
33 }

执行后,控制台输出:

Unmi:您的 1000 号报销单在 2010年5月19日 已支付

代码逻辑与 Java 的 Velocity 组件的应用是完全一致的,加载模板->填充值->合并模板输出内容。

同时也要注意模板文件有中文的话要以 UTF-8 字符集保存,不然会出现乱码,需然默认的字符集仍然是 ISO8859-1。还应留意 Runtime.Resource.Loader Namespace 中,你可以从中体查出它支持哪些方式来加载模板文件:

1. FileResourceLoader    从文件系统加载模板文件
2. ResourceLocator        从文件系统或程序集中加载资源作为模板
3. DataSourceResourceLoader  从数据源中加载内容作为模板,奇怪的是这个类出现在源代码中,却未编译到 NVelocity.dll 中。

另外它的配置文件在 NVelocity.dll 的资源 Runtime\Defaults\nvelocity.properties 中。

NVelocity 使用了与 Velocity 保持一致的 VTL(Velocity Template Language) 语言,支持 #if、#foreach、#set、#include、#parse、#macro 等语法能处理你更复杂的数。

posted @ 2010-09-09 10:24  bsso  阅读(1339)  评论(0)    收藏  举报
土蜀佃博客