考究一下 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
05 |
using NVelocity.Runtime; |
07 |
public class HelloNVelocity |
09 |
public static void Main(string[] args) |
11 |
VelocityEngine vltEngine = new VelocityEngine(); |
12 |
vltEngine.SetProperty(RuntimeConstants_Fields.RESOURCE_LOADER, "file"); |
13 |
vltEngine.SetProperty(RuntimeConstants_Fields.FILE_RESOURCE_LOADER_PATH, "d:/Template/"); |
16 |
Template vltTemplate = vltEngine.GetTemplate("HelloNVelocity.vm"); |
18 |
VelocityContext vltContext = new VelocityContext(); |
20 |
vltContext.Put("owner", "Unmi"); |
21 |
vltContext.Put("bill", "1000"); |
22 |
vltContext.Put("type", "报销单"); |
23 |
vltContext.Put("date", DateTime.Now.ToLongDateString()); |
25 |
StringWriter vltWriter = new StringWriter(); |
26 |
vltTemplate.Merge(vltContext, vltWriter); |
28 |
Console.WriteLine(vltWriter.GetStringBuilder().ToString()); |
30 |
Console.Write("Press any key to continue . . . "); |
31 |
Console.ReadKey(true); |
执行后,控制台输出:
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 等语法能处理你更复杂的数。