一、前言

本节我们将实际实现一个简单的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. Cholesky分解(Cholesky decomposition / Cholesky )

    Cholesky decomposition In linear algebra, the Cholesky decomposition or Cholesky is a decomposition ...

  2. EF写in

    qualityStatisticsInfoSql.Where(t => successStateArray.Contains(t.UploadReportFlag)); 如果写成 quality ...

  3. HTTP的三次握手

    在讲三次握手之前,希望大家理解一个概念,什么概念呢? 就是在我们的客户端和我们的服务器之间进行http请求,发送和返回的过程当中,我们是需要去创建一个tcp connection的东西,因为http是 ...

  4. nodejs使用MYSQL连接池,断线重连

    两种方式解决1.你可以配置mysql的连接池 var mysql = require('mysql'); var pool = mysql.createPool({ host: 'localhost' ...

  5. sz 命令

    sz命令 下载文件命令 sz  文件名

  6. 使用QT开发GoogleMap瓦片显示和下载工具(1)——QT开发环境准备

    由于是第一次使用qt,光是QT的安装和调试就费了好大功夫,汗一个,下面记录下过程和遇到的问题的解决方法吧. 下载QT 直接Google搜索“QT”,进入官网http://qt-project.org/ ...

  7. css隐藏元素的六类13种方法

    隐藏元素的方法 隐藏元素的方法可以总结为六类:直接隐藏.对溢出内容隐藏.对元素透明度进行调整.将元素移除当前屏幕.对元素的层级关系进行调整.对元素进行裁剪 只有对元素的透明度进行调整才可以点击,其余都 ...

  8. jQuery实现轮播切换以及将其封装成插件(1)

    我们在网上经常会看到一些轮播切换的效果.轮播切换,就是在一个有限的空间中定时的像走马灯一样去播放一组图片,当然也可以通过鼠标悬停在小按钮上来切换显示.下面我们将一步一步的实现这一效果. 为保证效果,请 ...

  9. 【Java】基础:常见修饰符(权限修饰符以及abstract、static、final等)与变量的描述

    1. 修饰符 public.protected.private.default abstract.static.final. abstract:抽象类.抽象方法 static:静态变量.静态方法.静态 ...

  10. ReactiveObjC框架的简单介绍

    最近在一直在学习RAC框架的Object-C版本ReactiveObjC(Swift版本为ReactiveSwift),这篇文章简单展示一下学习的成果!!!如果有什么地方理解错误,欢迎大家指正!!!互 ...