由于工作中常常需要使用模板配置文件来做动态的输出而以前又采用的是Dom解析Xml的方式,导致如果模板中需要一个特殊处理,就得变动代码,以至于现在的不堪重负不经意的时候,看到了NVelocity模板引擎,感觉很不错,语法很简单,很适合做UI,遂封装了下,现在分享给大家如果您有任何的建议或者意见,都可以跟帖或者EMail我:[email protected]代码不难看懂,直接上代码了:BaseHandler.csusing System;
using System.IO;
using System.Web;
using System.Text;
using System.Collections;using NVelocity;
using NVelocity.App;
using NVelocity.Context;
using NVelocity.Runtime;
using Commons.Collections;namespace AspNet.App.UI
{
public abstract class BaseHandler : IHttpHandler
{
private static readonly VelocityEngine viewEngine = new VelocityEngine(); static BaseHandler()
{
//TODO:这里的硬编码可以改成配置文件的方式
ExtendedProperties extend = new ExtendedProperties();
extend.AddProperty(RuntimeConstants.COUNTER_NAME, "i");
extend.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");
extend.AddProperty(RuntimeConstants.INPUT_ENCODING, "utf-8");
extend.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "utf-8");
string appPath = AppDomain.CurrentDomain.BaseDirectory;
extend.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, appPath); //模板的缓存设置
extend.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, true); //是否缓存
extend.AddProperty("file.resource.loader.modificationCheckInterval", (Int64)30); //缓存时间(秒)
viewEngine.Init(extend);
} public HttpContext HttpContext
{
get;
private set;
} public HttpRequest Request
{
get;
private set;
} public HttpResponse Response
{
get;
private set;
} private Hashtable templateData = new Hashtable();
public Hashtable TemplateData
{
get { return templateData; }
} private string templateFile = string.Empty;
public string TemplateFile
{
get { return templateFile; }
set { templateFile = value; }
} public void ProcessRequest(HttpContext context)
{
this.HttpContext = context;
this.Request = context.Request;
this.Response = context.Response; //此方法主要进行数据的获取
Handler_Load(this, EventArgs.Empty); //输出
IContext ctx = new VelocityContext(templateData);
viewEngine.MergeTemplate(TemplateFile, "utf-8", ctx, context.Response.Output);
} //局部文件的呈现
protected string Merge(Hashtable data, string fileName)
{
IContext ctx = new VelocityContext(data);
StringBuilder sb = new StringBuilder(512);
StringWriter writer = new StringWriter(sb); viewEngine.MergeTemplate(fileName, "utf-8", ctx, writer);
return sb.ToString();
} public abstract void Handler_Load(object sender, EventArgs e); public bool IsReusable
{
get { return false; }
}
}
}
using System.IO;
using System.Web;
using System.Text;
using System.Collections;using NVelocity;
using NVelocity.App;
using NVelocity.Context;
using NVelocity.Runtime;
using Commons.Collections;namespace AspNet.App.UI
{
public abstract class BaseHandler : IHttpHandler
{
private static readonly VelocityEngine viewEngine = new VelocityEngine(); static BaseHandler()
{
//TODO:这里的硬编码可以改成配置文件的方式
ExtendedProperties extend = new ExtendedProperties();
extend.AddProperty(RuntimeConstants.COUNTER_NAME, "i");
extend.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");
extend.AddProperty(RuntimeConstants.INPUT_ENCODING, "utf-8");
extend.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "utf-8");
string appPath = AppDomain.CurrentDomain.BaseDirectory;
extend.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, appPath); //模板的缓存设置
extend.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, true); //是否缓存
extend.AddProperty("file.resource.loader.modificationCheckInterval", (Int64)30); //缓存时间(秒)
viewEngine.Init(extend);
} public HttpContext HttpContext
{
get;
private set;
} public HttpRequest Request
{
get;
private set;
} public HttpResponse Response
{
get;
private set;
} private Hashtable templateData = new Hashtable();
public Hashtable TemplateData
{
get { return templateData; }
} private string templateFile = string.Empty;
public string TemplateFile
{
get { return templateFile; }
set { templateFile = value; }
} public void ProcessRequest(HttpContext context)
{
this.HttpContext = context;
this.Request = context.Request;
this.Response = context.Response; //此方法主要进行数据的获取
Handler_Load(this, EventArgs.Empty); //输出
IContext ctx = new VelocityContext(templateData);
viewEngine.MergeTemplate(TemplateFile, "utf-8", ctx, context.Response.Output);
} //局部文件的呈现
protected string Merge(Hashtable data, string fileName)
{
IContext ctx = new VelocityContext(data);
StringBuilder sb = new StringBuilder(512);
StringWriter writer = new StringWriter(sb); viewEngine.MergeTemplate(fileName, "utf-8", ctx, writer);
return sb.ToString();
} public abstract void Handler_Load(object sender, EventArgs e); public bool IsReusable
{
get { return false; }
}
}
}
为实现Master效果对上面的代码进行2次封装:using System;
using System.Data;using AspNet.App.UI;namespace AspNet.Web.User
{
public abstract class UserMasterHandler : BaseHandler
{
public override void Handler_Load(object sender, EventArgs e)
{
//这里的数据主要是为了呈现Master配置文件的 DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("name"); for (int i = 1; i <= 10; i++)
{
DataRow dr = dt.NewRow();
dr["id"] = i.ToString("D2");
dr["name"] = "测试名字" + i.ToString("D2"); dt.Rows.Add(dr);
} this.TemplateData.Add("dt", dt);
this.TemplateData.Add("title", get_Title());
this.TemplateData.Add("centerHtml", get_CenterHtml()); this.TemplateFile = ViewPath("/user/userMaster.htm");
} public abstract string get_Title();//为子文件必须实现的方法,子文件可以不关心Master文件中到底有什么标记或有多少标记,只需要实现了Master的所有abstract方法即可 public abstract string get_CenterHtml();
}
}
对全站页面模版统一化、编码统一管理很有好处
up
模板引擎用的是反射,当然在性能和健壮性上不如aspx,但它的解释性,有时候却给我们带来极大的方便例如:对于一个页面要根据要根据不同的参数输出布局截然不同的页面当然,针对不同条件动态的加载用户控件是可以达到效果,但还是得编译,有时候这种情况是允许的
这句什么意思 这个ViewPath()是什么函数