ASP.NET 使用 NVelocity 生成静态页

NVelocity 是 Velocity 的  .NET 实现,该项目的目的是将 Jakarta Velocity 项目移植到 C# 平台。它允许任何人仅仅简单的使用模板语言来引用由 .NET 代码定义的对象。从而使得界面设计人员与 .NET 程序开发人员基本分离。

项目地址:http://nvelocity.sourceforge.net/

NVelocity 模版引擎助手类实现如下:

using System.IO;
using System.Web;
using Commons.Collections;
using NVelocity;
using NVelocity.App;
using NVelocity.Context;
using NVelocity.Runtime;

/// <summary>
/// NVelocity 模版引擎助手类。
/// </summary>
public class NVelocityHelper
{

    private VelocityEngine velocity = null;

    private IContext context = null;

    /// <summary>
    /// 初始化 <see cref="NVelocityHelper"/> 类的新实例。
    /// </summary>
    public NVelocityHelper() { }

    /// <summary>
    /// 使用指定的模版文件初始化 <see cref="NVelocityHelper"/> 类的新实例。
    /// </summary>
    /// <param name="templateDir">模板文件夹路径。</param>
    public NVelocityHelper(string templateDir)
    {
        Init(templateDir);
    }

    /// <summary>
    /// 初始化 NVelocity 模块。
    /// </summary>
    /// <param name="templateDir">模版文件所在的文件夹。</param>
    public void Init(string templateDir)
    {
        // 创建 VelocityEngine 实例对象
        velocity = new VelocityEngine();
        // 使用设置初始化 VelocityEngine
        ExtendedProperties props = new ExtendedProperties();
        props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");
        props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, templateDir);
        props.AddProperty(RuntimeConstants.INPUT_ENCODING, "utf-8");
        props.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "utf-8");
        velocity.Init(props);
        // 为模板变量赋值
        context = new VelocityContext();
    }

    /// <summary>
    /// 给模板变量赋值
    /// </summary>
    /// <param name="key">模板变量键。</param>
    /// <param name="value">模板变量值。</param>
    public void Put(string key, object value)
    {
        if (context == null)
        {
            context = new VelocityContext();
            context.Put(key, value);
        }
        else
        {
            context.Put(key, value);
        }
    }

    /// <summary>
    /// 获取或设置 <see cref="IContext"/> 对象。
    /// </summary>
    public IContext Context
    {
        set { context = value; }
        get { return context; }
    }

    /// <summary>
    /// 获取模版文件的字符串。
    /// </summary>
    /// <param name="templateFileName">模版文件名称。</param>
    /// <returns>模版文件的字符串。</returns>
    public StringWriter GetResultString(string templateFileName)
    {
        // 从文件中读取模板
        Template template = velocity.GetTemplate(templateFileName);
        // 合并模板
        StringWriter writer = new StringWriter();
        template.Merge(context, writer);
        return writer;
    }

    /// <summary>
    /// 显示结果内容。
    /// </summary>
    /// <param name="templatFileName">模版文件名称。</param>
    public void Display(string templateFileName)
    {
        StringWriter writer = GetResultString(templateFileName);
        //输出
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Write(writer.ToString());
        HttpContext.Current.Response.Flush();
        HttpContext.Current.Response.End();
    }

    /// <summary>
    /// 生成 HTML 文件, 若生成成功返回 true,否则返回 false。
    /// </summary>
    /// <param name="templateFileName">模版文件名。</param>
    /// <param name="targetFolder">目标文件夹。</param>
    /// <param name="fileName">生成的文件名。</param>
    /// <returns>若生成成功返回 true,否则返回 false。</returns>
    public bool GenerateShtml(string templateFileName, string targetFolder, string fileName)
    {
        StringWriter writer = GetResultString(templateFileName);
        try
        {
            if (Directory.Exists(targetFolder))
            {
                File.WriteAllText(targetFolder + "\\" + fileName, writer.ToString(), new System.Text.UTF8Encoding(true));
                return true;
            }
            else
            {
                return false;
            }
        }
        catch
        {
            return false;
        }
    }

}

NVelocity 的更多使用方法请参考官方文档。

posted @ 2012-04-01 13:50  Charles Zhang  阅读(357)  评论(0编辑  收藏  举报