看了小泥鳅博客源码,觉得模板引擎是个好东西,参考了源代码写了基于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


转载于:https://www.cnblogs.com/dooom/archive/2010/11/25/1887495.html

Nvelocity 模板引擎 实例相关推荐

  1. NVelocity模板引擎初学总结。[zhuan]

    前不久,接触到.NET下的MVC-MonoRail,它推荐使用的模板引擎就是NVelocity(目前由Castle Project项目组接手) 因此决定自学一下NVelocity的使用(抛开MonoR ...

  2. Nvelocity模板引擎

    A.nVelocity是一个基于.NET的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由.NET代码定义的对象.页面设计人 ...

  3. php ejs,EJS模板引擎实例详解

    前面的话 nodejs的模板引擎有很多, EJS是比较简单和容易上手的.本文将详细介绍EJS 概述 EJS是一个简单高效的模板语言,通过数据和模板,可以生成HTML标记文本.可以说EJS是一个Java ...

  4. NVelocity模板引擎的注意事项

    1.$param 的写法碰上如果后面要紧跟其他字符,这样就会出错,应当使用${param}的写法. 2.${velocityCount}是foreach循环的计数,每循环一次加1,v一定要小些,如果v ...

  5. C#模板引擎NVelocity实战项目演练

    一.背景需求 很多人在做邮件模板.短信模板的时候,都是使用特殊标识的字符串进行占位,然后在后台代码中进行Replace字符串,如果遇到表格形式的内容,则需要在后台进行遍历数据集合,进行字符串的拼接,继 ...

  6. php 简单模板引擎,PHP 实现简单的模板引擎

    模板引擎作为视图层和模型曾分离的一种解决方案. 首先我们新建一个Template.class.php 的文件 '.m', //设置模板文件'templateDir' => 'template/' ...

  7. 一个简单的PHP模板引擎

    PHP早期开发中通常是PHP代码和HTML代码混写,这也使代码中充斥着数据库操作,逻辑处理等.当项目不大时,这样的代码还可以接受,但是随着项目不断扩大,我们就会发现同一个文件中同时存在前端逻辑和后端处 ...

  8. if laytpl 非_laytpl : 一款非常轻量的JavaScript模板引擎

    //假设你得到了这么一段数据 var data = { title: '前端圈', intro: '一群码js的骚年,幻想改变世界,却被世界改变.', list: [{name: '贤心', city ...

  9. Javascript模板引擎handlebars使用实例及技巧

    我们在开发的时候针对DOM操作,用简单的JS应用来说不成问题,但如果你对视图的每次更新都需要对我文档中非常大量的块进行操作呢?这时JS模版就派上用场了. 源地址:http://rfyiamcool.b ...

最新文章

  1. 图像处理算法之瘦脸及放大眼睛
  2. 程序员硬核劝告:现在还不是出门的时候
  3. [翻译] CSStickyHeaderFlowLayout
  4. SSL/TLS握手过程
  5. 浅谈如何更好的打开和关闭ADO.NET连接池
  6. 所有致力于团队沟通协作的看图软件
  7. 使用ComplexHeatmap绘制3D热图
  8. 公众号里面套页面_微信公众号页面模板有什么用?开通的方法是什么?
  9. eclipse和myeclipse的差别问题
  10. cmake中添加引用动态链接_C# 添加、编辑、删除PPT中的超链接
  11. 《设计工作室生存手册》—第1章1.3节设计师目标要清晰
  12. 利用rsync+crontab实现linux的定时增量备份,利用rsync+crontab实牡现Linux服务器间的定时增量备份.doc...
  13. Hyperledger Fabric MSP Identity Validity Rules——MSP身份验证规则
  14. 多表无关联查询(范围查询):查询某个人属于哪个工资区间
  15. ILSpy反编译软件的使用
  16. 大数据——python爬虫
  17. 混合线性规划matlab,matlab求解混合的非线性规划软件说明
  18. 信息学奥赛NOIP/CSP-J初赛知识点汇总
  19. 面试算法:利用堆栈计算逆向波兰表达式
  20. html 网页地图集制作ECHARTS,pyecharts绘制地图(示例代码)

热门文章

  1. hdmi接口有什么用_你的电脑为什么没有HDMI接口?
  2. luci L大_“大众”果然没失望,空间大,颜值暴增
  3. 如何使用facenet详解_如何使用冰箱更节能 使用冰箱节能技巧介绍【详解】
  4. linux通过字符串查看,linux命令strings有什么用?查找二进制文件可打印字符串。...
  5. 周期三角波傅里叶级数例题_傅里叶详解之傅里叶级数
  6. mysql分片建表语句_Mysql元数据如何生成Hive建表语句注释脚本详解
  7. oracle rollup 小计,Oracle Group By 用法之 —— Rollup (小计功能)
  8. c++ printf怎么用_【经典】把脉printf中的C进阶技巧
  9. 电源开关上的 | 和 O 究竟代表了什么?
  10. 是什么故障码_大众途观报P2187、P0101故障,差点就换发动机了