以前用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());