一、前言

本节我们将实际实现一个简单的NVelocity解析环境,以便为以后的实例做一些基本工作,虽然NVelocity如何使用已经属于老掉牙的话题,但我只能专门挑出来一章来做铺垫.人生就是这样无奈啊.不过请您放心,不会耗去您太多的时间.

二、项目搭建

  • 1.新建一个”ASP.Net 空Web应用程序”,.Net版本请选择4,项目命名为:SW.VMTest,并”为解决方案创建目录”
  • 2.在解决方案下再新建一个类库项目:SW.VMTest.Library
  • 3.续上文,在SW.VMTest.Library 上引用您下载到的4.0/NVelocity.dll
  • 4.新建一个NVelocityEngine类:
    using Commons.Collections;
    using NVelocity;
    using NVelocity.App;
    using System;
    using System.Collections;
    using System.IO;
    using System.Web; namespace SW.VMTest.Library
    {
    public class NVelocityEngine
    {
    public VelocityContext Context { get; set; } private VelocityEngine _Engine { get; set; } public NVelocityEngine(HttpContext httpContext)
    {
    ExtendedProperties ep = new ExtendedProperties();
    //#foreach 计数器初始值
    ep.AddProperty("directive.foreach.counter.initial.value", 0);
    //是否允许设置为null
    ep.AddProperty("directive.set.null.allowed", false);
    //模板路径
    ep.AddProperty("file.resource.loader.path", AppDomain.CurrentDomain.BaseDirectory + "\\Template");
    _Engine = new VelocityEngine(ep); //Context init
    Hashtable hs = new Hashtable();
    hs.Add("Session", httpContext.Session);
    hs.Add("Request", httpContext.Request);
    hs.Add("Server", httpContext.Server);
    hs.Add("ObjHelper", new ObjectHelper());
    Context = new VelocityContext(hs);
    } public bool Merge(string templateName, TextWriter writer)
    {
    bool result = _Engine.MergeTemplate(templateName, "UTF-8", Context, writer);
    if (!result)
    _Engine.Error("模板解析失败!");
    return result;
    } public bool Evaluate(TextWriter writer, string inString)
    {
    bool result = _Engine.Evaluate(Context, writer, "Error", inString);
    if (!result)
    _Engine.Error("模板解析失败!");
    return result;
    }
    }
    }
  • 5.继续在在SW.VMTest.Library 项目上引用System.Web
  • 6.新建一个SHtmlHandler类:
    using System.IO;
    using System.Web; namespace SW.VMTest.Library
    {
    public class SHtmlHandler : IHttpHandler
    {
    public bool IsReusable
    {
    get { return false; }
    } public void ProcessRequest(HttpContext context)
    {
    NVelocityEngine _nVe = new NVelocityEngine(context);
    string filePath = context.Request.Path.TrimStart('\\').Replace(".shtml", ".vm"); StringWriter writer = new StringWriter();
    _nVe.Merge(filePath, writer); context.Response.Clear();
    context.Response.Write(writer);
    context.Response.End();
    }
    }
    }
  • 7.在SW.VMTest.Library上新建一个文件夹,命名为Helper
  • 8.在Helper文件夹内新建一个ObjectHelper类:
    using System;
    
    namespace SW.VMTest.Library
    {
    public class ObjectHelper
    {
    public object GetObject(string typeName)
    {
    return GetObject(typeName, null);
    } public object GetObject(string typeName, params object[] args)
    {
    Type type = Type.GetType(typeName);
    if (type == null)
    throw new ArgumentException("找不到具体的类型");
    object obj;
    if (args != null)
    obj = Activator.CreateInstance(type, args);
    else
    obj = Activator.CreateInstance(type);
    return obj;
    }
    }
    }
  • 9.在SW.VMTest项目上修改Web.config文件:
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpHandlers>
    <add path="*.shtml" verb="*" type="SW.VMTest.Library.SHtmlHandler, SW.VMTest.Library"/>
    </httpHandlers>
    </system.web>
    </configuration>
  • 10.在SW.VMTest项目上创建新文件夹Template
  • 11.Template文件夹上点右键,选择”在文件资源管理器中打开此文件”
  • 12.在打开的文件夹中创建一个空白的.txt文档,并修改文件名为”test.vm”
  • 13.点击vs”工具”->”选项”->”文本编辑器”->”文件扩展名”,添加如下图项目,确定
    14.点击解决方案管理中的”显示文件”按钮
  • 15.找到Template文件夹下的Test.vm,右击,选择”包含进项目”
  • 16.打开Test.vm文件,输入以下代码:
    <html>
    <head>
    <title>Test Page</title>
    </head>
    <body>
    <h1>Hello World</h1>
    <ul>
    #foreach($item in [1..5])
    <li>I'm the list$item with index $velocityCount</li>
    #end
    </ul>
    <p>$Server.MapPath('aaa.aspx')</p>
    <p>$Request.QueryString.get_item('aa')</p>
    #set($dictionary = $ObjHelper.GetObject('System.Collections.Generic.Dictionary`2[[System.Int32],[System.Int32]]'))
    $dictionary.Add(1,123)
    $dictionary.Add(2,223)
    $dictionary.Add(3,323)
    <p>$dictionary.get_item(1)</p>
    </body>
    </html>
  • 17.运行,输入以下地址:

    http://localhost:3205/test.shtml?aa=hahaha

  • 18.请确认是否为以下界面,如果不,请检查步骤.

三、说明

以下是上述步骤的一些说明:

NVelocityEngine类

任何一个习惯语言的人,我想都最好还是不要打破他们索引从0起的习惯吧.所以directive.foreach.counter.initial.value=0是有必要在配置里面的

而在一个网站系统里面,把所有的模板都放在一个目录,我认为就方便查找的原因来讲,也是需要重视的.本节配置里面file.resource.loader.path我设置为根目录下的Template文件夹

为了后文能有更多的例子可以讲,我特意在Context里面加入了Session、Request、Server和一个简易的ObjectHelper

SHtmlHandler类

本类的主要目的就是将.shtml的请求交给本类来处理.

ObjectHelper

我们知道在NVelocity里面是不能new出对象的.ObjectHelper的目的便在于此,通过反射来得到新的对象.

其他

将vm设置为HTML编辑器打开可以解决HTML标签的着色问题,当然这个问题在后文我们会解决,但为了暂时的书写方便,先设置为HTML编辑器.毕竟全是黑字,时间长了,会很费眼睛的.

四、还有些要说的

实际上,在任何一个系统级别的应用,仅仅编写以上代码是不够的,对于缓存的处理,更丰富的帮助类,都是必须的.

但仅以上内容对于后面系列的文章就足够了.

另外我十分头疼这个代码插件,为什么不能折叠起来呢?

VS Extension+NVelocity系列(一)——构建一个简单的NVelocity解析环境的更多相关文章

  1. [Android5 系列—] 1. 构建一个简单的用户界面

    前言 安卓应用的用户界面是构建在View 和ViewGroup 这两个物件的层级之上的. View 就是一般的UI组件.像button,输入框等. viewGroup 是一些不可见的view的容器,用 ...

  2. gRPC初探——概念介绍以及如何构建一个简单的gRPC服务

    目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...

  3. 利用 Docker 构建一个简单的 java 开发编译环境

    目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...

  4. 从零构建一个简单的 Python Web框架

    为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何 ...

  5. 用Qt写软件系列三:一个简单的系统工具(上)

    导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...

  6. [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)

    [0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...

  7. struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb

    在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...

  8. 【Android Developers Training】 3. 构建一个简单UI

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)

    构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study ...

随机推荐

  1. Element-ui安装与使用(网站快速成型工具)

    我之所以将Element归类为Vue.js,其主要原因是Element是(饿了么团队)基于MVVM框架Vue开源出来的一套前端ui组件.我最爱的就是它的布局容器!!! 下面进入正题: 1.Elemen ...

  2. MySQL入门很简单: 5 索引

    1. 索引的含义和特点 索引:创建在表上,是对数据库表中一列或多列的值进行排序的一种结构. 存储类型: B性树(BTREE)索引和哈希(HASH)索引: InnoDB和MyISAM支持BTREE索引, ...

  3. Python 看书的一些记录 运算符重载

    1.类和模块有什么关系? (1)类是模块的一部分,是模块对象的属性. (2)类和模块都是命名空间,但是类是对于语法的.模块是对于文件的 (3)类支持多个实例,但是模块被导入时只有一个. 2.什么是抽象 ...

  4. 在jupyter notebook 中同时使用安装不同版本的python内核-从而可以进行切换

    在安装anaconda的时候,默认安装的是python3.6 但是cs231n课程作业是在py2.7环境下运行的.所以需要在jupyter notebook中安装并启用python2.7版本 方法: ...

  5. for循环研究

    for循环和递归是算法设计的重要结构之一: 两者具有相同的设计准则: 1.范围:开始和结束条件: 2.步增条件: 两者都用来处理顺序数据结构和计数计算: 递归也用于分而治之: for循环用于线性扫描: ...

  6. windows/Linux主机重启NetBackup服务和后台进程

    关闭并启动所有NetBackup服务和后台进程 要关闭并启动所有NetBackup服务和后台驻留程序,请从命令行输入以下命令: 在Windows上: 要关闭所有NetBackup服务: install ...

  7. Ray-AABB交叉检测算法

      最近在解决三维问题时,需要判断线段是否与立方体交叉,这个问题可以引申为:射线是否穿过立方体AABB.   在3D游戏开发中碰撞检测普遍采用的算法是轴对齐矩形边界框(Axially Aligned ...

  8. 第30章 ADC—电压采集—零死角玩转STM32-F429系列

    第30章     ADC—电压采集 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fireg ...

  9. 项目 XXX 受源代码管理。向源代码管理注册此项目时出错。建议不要对此项目进行任何修改

    原本带vss或者svn管理的项目独立复制出来后,如果出现下面问题 解决办法: 使用记事本打开,项目csproj文件删除图中

  10. orale 10g和11g中的自动统计任务

    orale 10g和11g中的自动统计任务 博客分类:  数据库相关/oracle   1)  先来看下oracle 10g中的自动统计任务的问题. 从Oracle Database 10g开始,Or ...