zoukankan      html  css  js  c++  java
  • Nvelocity 模板引擎 实例

      看了小泥鳅博客源码,觉得模板引擎是个好东西,参考了源代码写了基于Nvelocity模板引擎的实例。写着玩的,欢迎拍砖。 项目结构如下:

      

       关键代码:TemplateHelper.cs    Nvelocity辅助类,参考NVelocity 操作类VelocityHelper

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

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

    namespace NVelocityApp.Core
    {
    public class TemplateHelper
    {
    private VelocityEngine velocity = null;
    private IContext context = null;
    private string templatFileName;

    public TemplateHelper(string templatePath)
    {
    velocity
    = new VelocityEngine();

    //使用设置初始化VelocityEngine
    ExtendedProperties props = new ExtendedProperties();

    props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, templatePath);
    props.AddProperty(RuntimeConstants.INPUT_ENCODING,
    "utf-8");

    // props.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "gb2312");
    // props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");

    // props.SetProperty(RuntimeConstants.RESOURCE_MANAGER_CLASS, "NVelocity.Runtime.Resource.ResourceManagerImpl\\,NVelocity");

    velocity.Init(props);
    //RuntimeConstants.RESOURCE_MANAGER_CLASS
    //为模板变量赋值
    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);
    }




    /// <summary>
    /// 生成字符
    /// </summary>
    /// <param name="templatFileName">模板文件名</param>
    public string BuildString(string templateFile)
    {
    //从文件中读取模板
    Template template = velocity.GetTemplate(templateFile);

    //合并模板
    StringWriter writer = new StringWriter();
    template.Merge(context, writer);
    return writer.ToString();
    }


    /// <summary>
    /// 显示模板
    /// </summary>
    /// <param name="templatFileName">模板文件名</param>
    public void Display(string templatFileName)
    {
    //从文件中读取模板
    Template template = velocity.GetTemplate(templatFileName);
    //合并模板
    StringWriter writer = new StringWriter();
    template.Merge(context, writer);
    //输出
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.Write(writer.ToString());
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.End();
    }
    }
    }

                     TagFields.cs            对应模板中限定名。

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace NVelocityApp.Core
    {
    public class TagFields
    {
    /// <summary>
    /// 网站名称
    /// </summary>
    public const string SITE_NAME = "sitename";

    /// <summary>
    /// 网站描述
    /// </summary>
    public const string SITE_DESCRIPTION = "sitedescription";


    /// <summary>
    /// 文章列表
    /// </summary>
    public const string Article_LIST = "articlelist";
    }
    }

                      PageMethod.cs        页面处理类,主要向相应模板传递数据。有点像MVC中的C。

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web;
    namespace NVelocityApp.Core
    {

    public class PageMethod
    {

    public void index(TemplateHelper th)
    {

    string aa = HttpContext.Current.Request.QueryString["t"];
    th.Put(TagFields.SITE_NAME,
    "测试网站");

    }

    public void list(TemplateHelper th)
    {
    List
    <Person> list = new List<Person>();

    for (int i = 0; i <= 5; i++)
    {
    list.Add(
    new Person { ID = i.ToString(), Name = "" + i + "个用户" });
    }
    th.Put(TagFields.SITE_NAME,
    "测试网站");
    th.Put(TagFields.Article_LIST, list);
    }
    }
    }

                    Entity 下的是实体。当做测试用。

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace NVelocityApp.Core
    {
    public class Person
    {
    public string ID
    {
    get;
    set;
    }

    public string Name
    {
    get;
    set;
    }

    }

    }

           没有写业务层与数据层,可以根据情况扩展。

                   Default.aspx.cs 中代码,通过反射调用PageMethod.cs中方法。反射的用法可以参考。反射学习笔记(1)

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using NVelocityApp.Core;
    using System.Reflection;

    namespace NVelocityApp
    {
    public partial class _Default : System.Web.UI.Page
    {

    /// <summary>
    /// 模板封装类
    /// </summary>
    private TemplateHelper th = null;// new TemplateHelper();

    /// <summary>
    /// 模板路径
    /// </summary>
    private string templatePath = null;


    protected void Page_Load(object sender, EventArgs e)
    {
    string cmd = Request.QueryString["t"];//页面唯一限定名

    //可以设置读取
    templatePath = Server.MapPath(string.Format("/themes/{0}/template/", "default"));
    th
    = new TemplateHelper(templatePath);
    try
    {
    Assembly ass
    = Assembly.Load("NVelocityApp.Core");
    object obj = ass.CreateInstance("NVelocityApp.Core.PageMethod");
    var method
    = obj.GetType().GetMethod(cmd);
    if (method != null)
    {
    method.Invoke(obj,
    new object[] { th });
    th.Display(cmd
    + ".html");
    }

    }
    catch (Exception)
    {


    }
    }
    }
    }

                Intelligencia.UrlRewriter.dll   URL重写组件。也可以自己写个httpModules或HttpHandel处理,我直接用开源组件了,方便嘛。如果不熟悉的朋友可以参考。Url 重写

                     rewrite.xml  重写规则

    代码
    <?xml version="1.0" encoding="utf-8" ?>
    <rewriteRules>
    <rewrite url="~/Default.aspx" to="~/Default.aspx?t=index" processing="stop" />
    <rewrite url="~/Index" to="~/Default.aspx?t=index" processing="stop" />
    <rewrite url="~/List" to="~/Default.aspx?t=list" processing="stop" />

    </rewriteRules>

    当然还有最重要的Nvelocity语法,可以看看这个nVelocity使用简介

    源码在这:NVelocityApp.rar



  • 相关阅读:
    centos7 升级 python3
    宿主机休眠后,虚拟机网络ping不通网关
    给微信群和朋友圈里发长视频的方法
    在word2019中使用latex
    anki2.1中使用latex,使用 MathJax 渲染latex格式的数学公式,化学公式
    如何用GoldWave批量删除mp3文件开头65秒?
    一款 CentOS-7 个性化配置脚本
    算法及算法分析
    博客园markdown使用LaTeX数学公式
    数据结构与算法
  • 原文地址:https://www.cnblogs.com/dooom/p/1887495.html
Copyright © 2011-2022 走看看