一、前言

本节我们将实际实现一个简单的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. "COM Surrogate 已停止工作"解决方案(windows7 64位及32位)

    根据图示步骤,将以下文件添加至“数据执行保护”的例外列表中. 64位:C:Windows\SysWOW64\dllhost.exe 32位:C:\Windows\System32\dllhost.ex ...

  2. Ubuntu Deb包安装<个人笔记>

    安装 删除 卸载 Deb 包文件   图形界面: 安装deb 直接双击图标,输入密码后就可自动安装. 卸载deb 1. 菜单-系统->系统管理->新立得软件包管理器 或 Alt+F2(运行 ...

  3. CRM WebClient UI和Hybris里工作中心跳转的url生成逻辑

    CRM WebClient UI 把Work center的navigation target在client side不可见:在Chrome development tool里看不到,而是点击了Wor ...

  4. bzoj4943 [Noi2017]蚯蚓排队

    题面:http://www.lydsy.com/JudgeOnline/upload/Noi2017D1.pdf 正解:字符串$hash$. 我在考场上写了个$map$的$hash$被卡成$40$分, ...

  5. The service command supports only basic LSB actions (start, stop, restart, try-restart, reload,force-reload, status)

    # service iptables save The service command supports only basic LSB actions (start, stop, restart, t ...

  6. 二叉索引树,LA2191,LA5902,LA4329

    利用了二进制,二分的思想的一个很巧妙的数据结构,一个lowbit(x):二进制表示下的最右边的一个1开始对应的数值. 那么如果一个节点的为x左孩子,父亲节点就是 x + lowbit(x),如果是右孩 ...

  7. css3之Media Queries 媒体查询

    一.初步了解 Media Queries是CSS3新增加的一个模块功能,其最大的特点就是通过css3来查询媒体,然后调用对应的样式. 了解Media Queries之前需要了解媒体类型以及媒体特性: ...

  8. c#winform初学习

    不用思维导图了直接拍照笔记吧..参考视频:传智播客.net第十四天,参考图书c#图解教程第四版(人民邮电出版社) 对对象初始化赋值 工具箱中的每一个控件都相当于一个类 在窗体中拖一个控件就相当于new ...

  9. OpenCV自带dnn的Example研究(5)— segmentation

    这个博客系列,简单来说,今天我们就是要研究 https://docs.opencv.org/master/examples.html下的 6个文件,看看在最新的OpenCV中,它们是如何发挥作用的. ...

  10. python3 安装turtle tkitnter 报错

    导入tkinter模块后,运行出现No module named _tkinter, please install the python-tk package ubuntu运行tkinter错误   ...