VS Extension+NVelocity系列(一)——构建一个简单的NVelocity解析环境
一、前言
本节我们将实际实现一个简单的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解析环境的更多相关文章
- [Android5 系列—] 1. 构建一个简单的用户界面
前言 安卓应用的用户界面是构建在View 和ViewGroup 这两个物件的层级之上的. View 就是一般的UI组件.像button,输入框等. viewGroup 是一些不可见的view的容器,用 ...
- gRPC初探——概念介绍以及如何构建一个简单的gRPC服务
目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...
- 利用 Docker 构建一个简单的 java 开发编译环境
目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...
- 从零构建一个简单的 Python Web框架
为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何 ...
- 用Qt写软件系列三:一个简单的系统工具(上)
导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...
- [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)
[0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...
- struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb
在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...
- 【Android Developers Training】 3. 构建一个简单UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)
构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study ...
随机推荐
- 五环之歌之PHP分页
根据以往的经验,对于很多初学者,分页功能实现起来还是有一定的困难的,为了帮大家解决这样的问题:特此献上五环之歌.从此分页功能便是如小岳岳唱歌一样简练,漂亮,精干.哈哈,不闲扯了.正式进入千锋PHP五环 ...
- C++ POD类型
POD( Plain Old Data)概念: Arithmetic types (3.9.1), enumeration types, pointer types, and pointer to m ...
- 转载:手把手教你搭建 vue 环境
以下内容转自: https://segmentfault.com/a/1190000008922234 第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安 ...
- UESTC 757 棋盘
虽然是水题,但是还是很interesting的.(大概就是我最晚出这个题了... 博弈感觉就是靠yy能力啊.这题是对称性. 最后的必败态是白色格子对称的,一旦对称形成,对手怎么选,跟随就好,对手无法摆 ...
- PHPmailer群发Gmail的常见问题
博主小白一枚,phpmailer只会一些基本的用法,就这样一个邮件的群发功能也难住了我一周,下面把我遇到的问题给大家总结一下 1.Could not authenticate 首先,如果你没有使用循环 ...
- 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 ...
- R语言网络爬虫学习 基于rvest包
R语言网络爬虫学习 基于rvest包 龙君蛋君:2015年3月26日 1.背景介绍: 前几天看到有人写了一篇用R爬虫的文章,感兴趣,于是自己学习了.好吧,其实我和那篇文章R语言爬虫初尝试-基于RVES ...
- Linux利用i节点删除乱码文件
Linux删除乱码文件 当文件名为乱码的时候,无法通过键盘输入文件名,所以在终端下就不能直接利用rm,mv等命令管理文件了. 但是我们知道每个文件都有一个i节点号,我们可以考虑通过i节点号来管理文件. ...
- scrapy install
csf@ubuntu:~$ sudo apt install python-scrapy
- C#静态成员和非静态成员
一.C#静态成员和非静态成员 1. C#静态成员和非静态成员 当类中的某个成员使用static修饰符时,就会被声明为静态成员.类中的成员要么是静态成员,要么是非静态成员.一般情况下,静态成员属于整个类 ...