一、前言

本节我们将实际实现一个简单的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. 五环之歌之PHP分页

    根据以往的经验,对于很多初学者,分页功能实现起来还是有一定的困难的,为了帮大家解决这样的问题:特此献上五环之歌.从此分页功能便是如小岳岳唱歌一样简练,漂亮,精干.哈哈,不闲扯了.正式进入千锋PHP五环 ...

  2. C++ POD类型

    POD( Plain Old Data)概念: Arithmetic types (3.9.1), enumeration types, pointer types, and pointer to m ...

  3. 转载:手把手教你搭建 vue 环境

    以下内容转自: https://segmentfault.com/a/1190000008922234 第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安 ...

  4. UESTC 757 棋盘

    虽然是水题,但是还是很interesting的.(大概就是我最晚出这个题了... 博弈感觉就是靠yy能力啊.这题是对称性. 最后的必败态是白色格子对称的,一旦对称形成,对手怎么选,跟随就好,对手无法摆 ...

  5. PHPmailer群发Gmail的常见问题

    博主小白一枚,phpmailer只会一些基本的用法,就这样一个邮件的群发功能也难住了我一周,下面把我遇到的问题给大家总结一下 1.Could not authenticate 首先,如果你没有使用循环 ...

  6. Can Microsoft’s exFAT file system bridge the gap between OSes?

    转自:http://arstechnica.com/information-technology/2013/06/review-is-microsofts-new-data-sharing-syste ...

  7. R语言网络爬虫学习 基于rvest包

    R语言网络爬虫学习 基于rvest包 龙君蛋君:2015年3月26日 1.背景介绍: 前几天看到有人写了一篇用R爬虫的文章,感兴趣,于是自己学习了.好吧,其实我和那篇文章R语言爬虫初尝试-基于RVES ...

  8. Linux利用i节点删除乱码文件

    Linux删除乱码文件 当文件名为乱码的时候,无法通过键盘输入文件名,所以在终端下就不能直接利用rm,mv等命令管理文件了. 但是我们知道每个文件都有一个i节点号,我们可以考虑通过i节点号来管理文件. ...

  9. scrapy install

    csf@ubuntu:~$ sudo apt install python-scrapy

  10. C#静态成员和非静态成员

    一.C#静态成员和非静态成员 1. C#静态成员和非静态成员 当类中的某个成员使用static修饰符时,就会被声明为静态成员.类中的成员要么是静态成员,要么是非静态成员.一般情况下,静态成员属于整个类 ...