由于工作中常常需要使用模板配置文件来做动态的输出而以前又采用的是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; }
        }
    }
}

解决方案 »

  1.   

    下面给出具体的应用
    为实现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();
    }
    }
      

  2.   

    基于HttpHandler的处理
    对全站页面模版统一化、编码统一管理很有好处
    up
      

  3.   

    恩,19楼说的不错对于显示层来说,NVelocity的语法的确很够用
      

  4.   

    在网上搜索下NVelocity的基本用法与语法,看这个代码就很简单了
      

  5.   

    用模板引擎的语言是非常幽默的事。aspx 页面自己就可以使用c#,VB.net等等语言了。健壮性、性能肯定是超过XX 模板引擎的。
      

  6.   

    模板这个东西让我很困惑写个html页,加上一些代表内容的标签,就是模板了,这些标签相当于aspx里的 <%= %> 或 <%# %> 调用,只不过在设计里要比aspx页要直观一点,但是很多时候事情不是这么简单的,你需要在模板里加上循环和条件判断,来控制如何显示这些标签,从这时候起,模板就不是模板,而是脚本了,一个绝对不可能有aspx强大的脚本
      

  7.   


    模板引擎用的是反射,当然在性能和健壮性上不如aspx,但它的解释性,有时候却给我们带来极大的方便例如:对于一个页面要根据要根据不同的参数输出布局截然不同的页面当然,针对不同条件动态的加载用户控件是可以达到效果,但还是得编译,有时候这种情况是允许的
      

  8.   

    回44楼不是加一层而是NVelocity直接输出了这个过程不会实例化任何Page类
      

  9.   

    前一阵用nvelocity,读取编码,utf-8就ok,其他格式就异常,没辙,把模板硬转成utf-8了。
      

  10.   

    this.TemplateFile = ViewPath("/user/userMaster.htm");
    这句什么意思  这个ViewPath()是什么函数