以前用winforms写模板生成,现在没必要了,有了Velocity(以下简称V),就可以写出web的模板生成了。
使用很简单,下载了之后,引用dll,我这里写了一个通用的类
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;
using NVelocity;
using NVelocity.App;
using NVelocity;
using NVelocity.Runtime;
using Commons.Collections;
using System.IO;
using NVelocity.Context;
/// <summary>
/// BaseVelocity 的摘要说明
/// </summary>
public class BaseVelocity
{
/// <summary>
/// Common
/// </summary>
/// <param name="tempAbsPath">模板路径</param>
/// <param name="outAbsPath">输出绝对路径</param>
/// <param name="parameters">初始参数</param>
/// <param name="tempEncoding">模板编码[options]</param>
/// <param name="outEncoding">输出编码[optioins]</param>
/// <param name="returnStr"></param>
/// <returns></returns>
private string create(string tempAbsPath, string outAbsPath,Hashtable parameters,string tempEncoding, string outEncoding,bool returnStr)
{
if (tempAbsPath == "") { throw new ArgumentException("模板参数错误"); }
if (outAbsPath == "") { throw new ArgumentException("输出参数错误"); }
if (tempEncoding == "") tempEncoding = "utf-8";
if (outEncoding == "") outEncoding = "utf-8";
//创建NVelocity引擎的实例对象
VelocityEngine velocity = new VelocityEngine();
//初始化该实例对象
string root = tempAbsPath.Substring(0, tempAbsPath.LastIndexOf("\\") + 1);
string fileName = tempAbsPath.Substring(tempAbsPath.LastIndexOf("\\") + 1);
ExtendedProperties props = new ExtendedProperties();
props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");
props.AddProperty(RuntimeConstants.INPUT_ENCODING, tempEncoding);
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, root);
props.AddProperty(RuntimeConstants.OUTPUT_ENCODING, outEncoding);
velocity.Init(props);
//从文件中读取模板
NVelocity.Template temp = velocity.GetTemplate(fileName);
IContext context = new VelocityContext();
if (parameters != null)
{
foreach (string key in parameters.Keys)
{
context.Put(key, parameters[key]);
}
}
//合并模板
StringWriter writer = new StringWriter();
//velocity.MergeTemplate(context, writer);
temp.Merge(context, writer);
//生成静态页
if (!returnStr)
{
using (StreamWriter writer2 = new StreamWriter(outAbsPath, false, System.Text.Encoding.GetEncoding(outEncoding), 200))
{
writer2.Write(writer);
writer2.Flush();
writer2.Close();
}
}
else
return writer.ToString();
return null;
}
/// <summary>
/// 创建静态文件
/// </summary>
/// <param name="tempAbsPath">模板绝对路径</param>
/// <param name="outAbsPath">输出绝对路径</param>
/// <param name="parameters">初始参数</param>
/// <param name="tempEncoding">模板编码[options]</param>
/// <param name="outEncoding">输出编码[optioins]</param>
/// <param name="returnStr"></param>
/// <returns></returns>
public void creatFile(string tempAbsPath, string outAbsPath, Hashtable parameters, string tempEncoding, string outEncoding)
{
create(tempAbsPath,outAbsPath,parameters,tempEncoding,outEncoding,false);
}
/// <summary>
/// 创建输出字符串
/// </summary>
/// <param name="tempAbsPath">模板绝对路径</param>
/// <param name="outAbsPath">输出绝对路径</param>
/// <param name="parameters">初始参数</param>
/// <param name="tempEncoding">模板编码[options]</param>
/// <param name="outEncoding">输出编码[optioins]</param>
/// <param name="returnStr"></param>
/// <returns></returns>
public string createStr(string tempAbsPath, string outAbsPath, Hashtable parameters, string tempEncoding, string outEncoding)
{
return create(tempAbsPath, outAbsPath, parameters, tempEncoding, outEncoding, true);
}
}
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;
using NVelocity;
using NVelocity.App;
using NVelocity;
using NVelocity.Runtime;
using Commons.Collections;
using System.IO;
using NVelocity.Context;
/// <summary>
/// BaseVelocity 的摘要说明
/// </summary>
public class BaseVelocity
{
/// <summary>
/// Common
/// </summary>
/// <param name="tempAbsPath">模板路径</param>
/// <param name="outAbsPath">输出绝对路径</param>
/// <param name="parameters">初始参数</param>
/// <param name="tempEncoding">模板编码[options]</param>
/// <param name="outEncoding">输出编码[optioins]</param>
/// <param name="returnStr"></param>
/// <returns></returns>
private string create(string tempAbsPath, string outAbsPath,Hashtable parameters,string tempEncoding, string outEncoding,bool returnStr)
{
if (tempAbsPath == "") { throw new ArgumentException("模板参数错误"); }
if (outAbsPath == "") { throw new ArgumentException("输出参数错误"); }
if (tempEncoding == "") tempEncoding = "utf-8";
if (outEncoding == "") outEncoding = "utf-8";
//创建NVelocity引擎的实例对象
VelocityEngine velocity = new VelocityEngine();
//初始化该实例对象
string root = tempAbsPath.Substring(0, tempAbsPath.LastIndexOf("\\") + 1);
string fileName = tempAbsPath.Substring(tempAbsPath.LastIndexOf("\\") + 1);
ExtendedProperties props = new ExtendedProperties();
props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");
props.AddProperty(RuntimeConstants.INPUT_ENCODING, tempEncoding);
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, root);
props.AddProperty(RuntimeConstants.OUTPUT_ENCODING, outEncoding);
velocity.Init(props);
//从文件中读取模板
NVelocity.Template temp = velocity.GetTemplate(fileName);
IContext context = new VelocityContext();
if (parameters != null)
{
foreach (string key in parameters.Keys)
{
context.Put(key, parameters[key]);
}
}
//合并模板
StringWriter writer = new StringWriter();
//velocity.MergeTemplate(context, writer);
temp.Merge(context, writer);
//生成静态页
if (!returnStr)
{
using (StreamWriter writer2 = new StreamWriter(outAbsPath, false, System.Text.Encoding.GetEncoding(outEncoding), 200))
{
writer2.Write(writer);
writer2.Flush();
writer2.Close();
}
}
else
return writer.ToString();
return null;
}
/// <summary>
/// 创建静态文件
/// </summary>
/// <param name="tempAbsPath">模板绝对路径</param>
/// <param name="outAbsPath">输出绝对路径</param>
/// <param name="parameters">初始参数</param>
/// <param name="tempEncoding">模板编码[options]</param>
/// <param name="outEncoding">输出编码[optioins]</param>
/// <param name="returnStr"></param>
/// <returns></returns>
public void creatFile(string tempAbsPath, string outAbsPath, Hashtable parameters, string tempEncoding, string outEncoding)
{
create(tempAbsPath,outAbsPath,parameters,tempEncoding,outEncoding,false);
}
/// <summary>
/// 创建输出字符串
/// </summary>
/// <param name="tempAbsPath">模板绝对路径</param>
/// <param name="outAbsPath">输出绝对路径</param>
/// <param name="parameters">初始参数</param>
/// <param name="tempEncoding">模板编码[options]</param>
/// <param name="outEncoding">输出编码[optioins]</param>
/// <param name="returnStr"></param>
/// <returns></returns>
public string createStr(string tempAbsPath, string outAbsPath, Hashtable parameters, string tempEncoding, string outEncoding)
{
return create(tempAbsPath, outAbsPath, parameters, tempEncoding, outEncoding, true);
}
}
这种是通过文件加载模板的
以下可以通过变量加载模板
关键代码:
System.Text.StringBuilder builder = new System.Text.StringBuilder();
builder.Append("#foreach($u in $ListUsers)"r"n" +
"#beforeall"r"n" +
"<table border=""0"" cellpadding=""10"" cellspacing=""10"">" +
"<tr><td>Name</td><td>Sex</td><td>City</td></tr>" +
"#each"r"n" +
"<tr>" +
"<td>$u.Name</td>" +
"<td>$u.Sex</td>" +
"<td>$u.City</td>" +
"</tr>" +
"#afterall"r"n" +
"</table>" +
"#nodata"r"n" +
"暂无用户资料"r"n" +
"#end");
VelocityEngine vltEngine = new VelocityEngine();
vltEngine.Init();
VelocityContext vltContext = new VelocityContext();
vltContext.Put("PageTitle", "字符串模板例子");
vltContext.Put("ListUsers", listUsers);
System.IO.StringWriter vltWriter = new System.IO.StringWriter();
vltEngine.Evaluate(vltContext, vltWriter, null, builder.ToString());
Response.Write(vltWriter.GetStringBuilder().ToString());
builder.Append("#foreach($u in $ListUsers)"r"n" +
"#beforeall"r"n" +
"<table border=""0"" cellpadding=""10"" cellspacing=""10"">" +
"<tr><td>Name</td><td>Sex</td><td>City</td></tr>" +
"#each"r"n" +
"<tr>" +
"<td>$u.Name</td>" +
"<td>$u.Sex</td>" +
"<td>$u.City</td>" +
"</tr>" +
"#afterall"r"n" +
"</table>" +
"#nodata"r"n" +
"暂无用户资料"r"n" +
"#end");
VelocityEngine vltEngine = new VelocityEngine();
vltEngine.Init();
VelocityContext vltContext = new VelocityContext();
vltContext.Put("PageTitle", "字符串模板例子");
vltContext.Put("ListUsers", listUsers);
System.IO.StringWriter vltWriter = new System.IO.StringWriter();
vltEngine.Evaluate(vltContext, vltWriter, null, builder.ToString());
Response.Write(vltWriter.GetStringBuilder().ToString());