模板引擎-NVelocity
2014-03-18 18:37
162 查看
Web开发的模板引擎是为了使界面、逻辑、数据分离,用它可以进行逻辑处理、数据填充,最终生成一个标准的HTML文档,然后以字符串形式返回给浏览器进行解析。模板引擎有很多种,这里介绍感觉使用很方便的NVelocity。
整个业务逻辑是这样的:NVelocity通过映射代码将数据(可以自定义,也可从数据库中取)扔给模板(一般有html页扮演即可)进行数据填充,渲染成标准的html页,然后返回纯html页字符串,交给HttpHandler,由它返回给客户端浏览器进行解析(所有逻辑判断由HttpHandler完成)。
NVelocity有使用很简便的模板语言,基本语法:关键字前都加#号(例如:#if…#end);变量前都加$(与JQuery相同,所以若同时用时不要使用简易符号$来代替jQuery。例如$Person表示引用变量Person)。其它语法,不做介绍,学习它的模板语言即可,可参考博文http://www.cnblogs.com/hxling/archive/2011/10/23/2221918.html
下面用实例,来体会模板引擎的功能,它的网站开发思路,以及与普通的aspx方式的区别。
使用NVelocity首先下载它的DLLhttp://www.castleproject.org/download/(倒数第4个),然后添加到项目中,并添加对它的引用。
view plaincopyprint?
<span style="color: rgb(0, 0, 102);"></span>
[csharp]
view plaincopyprint?
//用的时候考代码即可,只需改三个地方:模板所在文件夹、添加数据、设定模板
VelocityEngine vltEngine = new VelocityEngine();
vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹,例如我的模板为templates文件夹下的TestNV.html
vltEngine.Init();
VelocityContext vltContext = new VelocityContext();
vltContext.Put("dataName", person);//添加数据,在模板中可以通过$dataName来引用数据
vltContext.Put("dataName2", person);//可添加多个数据,基本支持所有数据类型,包括字典、数据、datatable等
Template vltTemplate = vltEngine.GetTemplate("TestNV.html");//设定模板
System.IO.StringWriter vltWriter = new System.IO.StringWriter();
vltTemplate.Merge(vltContext, vltWriter);
string html = vltWriter.GetStringBuilder().ToString();
context.Response.Write(html);//返回渲染生成的标准html代码字符串
[csharp]
view plaincopyprint?
public class TestNVelocity : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
//定义匿名类,并实例化对象person
var person = new { name="wzp",age=24 };
//用的时候考代码即可,只需改三个地方:模板所在文件夹、添加数据、设定模板
VelocityEngine vltEngine = new VelocityEngine();
vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹,例如我的模板为templates文件夹下的TestNV.html
vltEngine.Init();
VelocityContext vltContext = new VelocityContext();
vltContext.Put("zhipeng", person);//将person对象扔给模板TestNV.html
Template vltTemplate = vltEngine.GetTemplate("TestNV.html");//设定模板
System.IO.StringWriter vltWriter = new System.IO.StringWriter();
vltTemplate.Merge(vltContext, vltWriter);
string html = vltWriter.GetStringBuilder().ToString();
context.Response.Write(html);//返回渲染生成的标准html代码字符串
}
public bool IsReusable
{
get
{
return false;
}
}
}
新建模板html页TestNV.html,代码如下:
[html]
view plaincopyprint?
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form action='TestNVelocity.ashx'>
<!--取数据,并使用-->
我的姓名是:$zhipeng.name;<br />
我的年龄是:$zhipeng.age;<br />
</form>
</body>
</html>
然后用浏览器请求上述的TestNVelocity.ashx,即可看到效果:
[csharp]
view plaincopyprint?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace chuanzhiblog
{
public class Person
{
//定义属性,可读、可写
public string name { get; set; }
public int age {get;set; }
public Person father { get;set;}
}
}
添加标头模板head.html
[html]
view plaincopyprint?
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<h1 style="font-family:'Lucida Fax'">我是体育新闻网,欢迎光临</h1>
添加尾部模板foot.html
[html]
view plaincopyprint?
<h1>体育新闻网-版权所有©kobe</h1>
</body>
</html>
添加一般处理程序Login3.ashx:
[csharp]
view plaincopyprint?
public class Login3 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
//定义数据字典dict
Dictionary<string,string> dict=new Dictionary<string,string>();
dict["tom"]="伯宁顿";
dict["jim"]="家里蹲";
dict["wzp"]="哈弗";
//定义字符串数据
string[] strs = new string[] { "王志鹏","刘德华","阿信"};
//定义泛型(集合)对象数据
List<Person> persons = new List<Person>();
persons.Add(new Person {age=30,name="wzp" });
persons.Add(new Person { age = 10, name = "wex" });
persons.Add(new Person { age = 25, name = "ldh" });
//映射代码*************************************************************
VelocityEngine vltEngine = new VelocityEngine();
vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹
vltEngine.Init();
VelocityContext vltContext = new VelocityContext();
vltContext.Put("dict", dict);//填充数据,扔给模板(下面的login3.html)
vltContext.Put("mingren",strs);
vltContext.Put("men",persons);
vltContext.Put("age",30);
Template vltTemplate = vltEngine.GetTemplate("login3.html");
System.IO.StringWriter vltWriter = new System.IO.StringWriter();
vltTemplate.Merge(vltContext, vltWriter);
string html = vltWriter.GetStringBuilder().ToString();
context.Response.Write(html);
}
public bool IsReusable
{
get
{
return false;
}
}
}
添加模板文件Login3.html
[html]
view plaincopyprint?
<!--将标头模板文件包含进来,这样就不用自己定义标头了-->
#include("head.html")
<!--取字典dict里的wzp属性值-->
$dict.wzp;<br />
<!--遍历数据中的strs字符串数组,并显示-->
1:
<ul>
#foreach($mr in $mingren)
<li>$mr</li>
#end
</ul>
<!--遍历泛型(集合)对象persons,并显示-->
2:
<ul>
#foreach($m in $men)
<li>
姓名:$m.name 年龄:$m.age
</li>
#end
</ul>
<!--取数据中的age,并根据大小进行逻辑判断-->
<p>
#if($age>10)
....小于10
#else
....大于10
#end
</p>
<!--遍历泛型(集合)对象persons,并根据对象的年龄大小,进行逻辑处理-->
3.
<ul>
#foreach($m in $men)
#if($m.age<20)
<li style="color:red">我是$m.name,我的年龄小于20岁</li>
#else
<li style="color:green">我是$m.name,我的年龄大于20岁</li>
#end
#end
</ul>
<!--将尾部模板文件包含进来,这样就不用自己定义尾部了-->
#include("foot.html")
然后在浏览器中请求Login3.ashx,看显示效果:
当然这是自己的理解,上面的例子中的数据也都是自定义的一些字典、泛型、数组、匿名类等等的,还并未涉及到与数据库的交互,所以下篇文章会用NVelocity结合数据库增、删、改、查的例子看看如何实现传统的Web开发。
Web开发的模板引擎是为了使界面、逻辑、数据分离,用它可以进行逻辑处理、数据填充,最终生成一个标准的HTML文档,然后以字符串形式返回给浏览器进行解析。模板引擎有很多种,这里介绍感觉使用很方便的NVelocity。
整个业务逻辑是这样的:NVelocity通过映射代码将数据(可以自定义,也可从数据库中取)扔给模板(一般有html页扮演即可)进行数据填充,渲染成标准的html页,然后返回纯html页字符串,交给HttpHandler,由它返回给客户端浏览器进行解析(所有逻辑判断由HttpHandler完成)。
NVelocity有使用很简便的模板语言,基本语法:关键字前都加#号(例如:#if…#end);变量前都加$(与JQuery相同,所以若同时用时不要使用简易符号$来代替jQuery。例如$Person表示引用变量Person)。其它语法,不做介绍,学习它的模板语言即可,可参考博文http://www.cnblogs.com/hxling/archive/2011/10/23/2221918.html
下面用实例,来体会模板引擎的功能,它的网站开发思路,以及与普通的aspx方式的区别。
使用NVelocity首先下载它的DLLhttp://www.castleproject.org/download/(倒数第4个),然后添加到项目中,并添加对它的引用。
首先看Nvelocity的映射代码:(需要引入命名空间 NVelocity; NVelocity.App; NVelocity.Runtime;)
[csharp]view plaincopyprint?
<span style="color: rgb(0, 0, 102);"></span>
[csharp]
view plaincopyprint?
//用的时候考代码即可,只需改三个地方:模板所在文件夹、添加数据、设定模板
VelocityEngine vltEngine = new VelocityEngine();
vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹,例如我的模板为templates文件夹下的TestNV.html
vltEngine.Init();
VelocityContext vltContext = new VelocityContext();
vltContext.Put("dataName", person);//添加数据,在模板中可以通过$dataName来引用数据
vltContext.Put("dataName2", person);//可添加多个数据,基本支持所有数据类型,包括字典、数据、datatable等
Template vltTemplate = vltEngine.GetTemplate("TestNV.html");//设定模板
System.IO.StringWriter vltWriter = new System.IO.StringWriter();
vltTemplate.Merge(vltContext, vltWriter);
string html = vltWriter.GetStringBuilder().ToString();
context.Response.Write(html);//返回渲染生成的标准html代码字符串
//用的时候考代码即可,只需改三个地方:模板所在文件夹、添加数据、设定模板 VelocityEngine vltEngine = new VelocityEngine(); vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file"); vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹,例如我的模板为templates文件夹下的TestNV.html vltEngine.Init(); VelocityContext vltContext = new VelocityContext(); vltContext.Put("dataName", person);//添加数据,在模板中可以通过$dataName来引用数据 vltContext.Put("dataName2", person);//可添加多个数据,基本支持所有数据类型,包括字典、数据、datatable等 Template vltTemplate = vltEngine.GetTemplate("TestNV.html");//设定模板 System.IO.StringWriter vltWriter = new System.IO.StringWriter(); vltTemplate.Merge(vltContext, vltWriter); string html = vltWriter.GetStringBuilder().ToString(); context.Response.Write(html);//返回渲染生成的标准html代码字符串
然后看一个小例子:(Example1)
新建一般处理程序TestNVelocity.ashx,代码如下:[csharp]
view plaincopyprint?
public class TestNVelocity : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
//定义匿名类,并实例化对象person
var person = new { name="wzp",age=24 };
//用的时候考代码即可,只需改三个地方:模板所在文件夹、添加数据、设定模板
VelocityEngine vltEngine = new VelocityEngine();
vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹,例如我的模板为templates文件夹下的TestNV.html
vltEngine.Init();
VelocityContext vltContext = new VelocityContext();
vltContext.Put("zhipeng", person);//将person对象扔给模板TestNV.html
Template vltTemplate = vltEngine.GetTemplate("TestNV.html");//设定模板
System.IO.StringWriter vltWriter = new System.IO.StringWriter();
vltTemplate.Merge(vltContext, vltWriter);
string html = vltWriter.GetStringBuilder().ToString();
context.Response.Write(html);//返回渲染生成的标准html代码字符串
}
public bool IsReusable
{
get
{
return false;
}
}
}
public class TestNVelocity : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; //定义匿名类,并实例化对象person var person = new { name="wzp",age=24 }; //用的时候考代码即可,只需改三个地方:模板所在文件夹、添加数据、设定模板 VelocityEngine vltEngine = new VelocityEngine(); vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file"); vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹,例如我的模板为templates文件夹下的TestNV.html vltEngine.Init(); VelocityContext vltContext = new VelocityContext(); vltContext.Put("zhipeng", person);//将person对象扔给模板TestNV.html Template vltTemplate = vltEngine.GetTemplate("TestNV.html");//设定模板 System.IO.StringWriter vltWriter = new System.IO.StringWriter(); vltTemplate.Merge(vltContext, vltWriter); string html = vltWriter.GetStringBuilder().ToString(); context.Response.Write(html);//返回渲染生成的标准html代码字符串 } public bool IsReusable { get { return false; } } }
新建模板html页TestNV.html,代码如下:
[html]
view plaincopyprint?
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form action='TestNVelocity.ashx'>
<!--取数据,并使用-->
我的姓名是:$zhipeng.name;<br />
我的年龄是:$zhipeng.age;<br />
</form>
</body>
</html>
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form action='TestNVelocity.ashx'> <!--取数据,并使用--> 我的姓名是:$zhipeng.name;<br /> 我的年龄是:$zhipeng.age;<br /> </form> </body> </html>
然后用浏览器请求上述的TestNVelocity.ashx,即可看到效果:
下面看一个稍复杂点的例子(Example2)
添加Person类:[csharp]
view plaincopyprint?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace chuanzhiblog
{
public class Person
{
//定义属性,可读、可写
public string name { get; set; }
public int age {get;set; }
public Person father { get;set;}
}
}
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace chuanzhiblog { public class Person { //定义属性,可读、可写 public string name { get; set; } public int age {get;set; } public Person father { get;set;} } }
添加标头模板head.html
[html]
view plaincopyprint?
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<h1 style="font-family:'Lucida Fax'">我是体育新闻网,欢迎光临</h1>
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <h1 style="font-family:'Lucida Fax'">我是体育新闻网,欢迎光临</h1>
添加尾部模板foot.html
[html]
view plaincopyprint?
<h1>体育新闻网-版权所有©kobe</h1>
</body>
</html>
<h1>体育新闻网-版权所有©kobe</h1> </body> </html>
添加一般处理程序Login3.ashx:
[csharp]
view plaincopyprint?
public class Login3 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
//定义数据字典dict
Dictionary<string,string> dict=new Dictionary<string,string>();
dict["tom"]="伯宁顿";
dict["jim"]="家里蹲";
dict["wzp"]="哈弗";
//定义字符串数据
string[] strs = new string[] { "王志鹏","刘德华","阿信"};
//定义泛型(集合)对象数据
List<Person> persons = new List<Person>();
persons.Add(new Person {age=30,name="wzp" });
persons.Add(new Person { age = 10, name = "wex" });
persons.Add(new Person { age = 25, name = "ldh" });
//映射代码*************************************************************
VelocityEngine vltEngine = new VelocityEngine();
vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹
vltEngine.Init();
VelocityContext vltContext = new VelocityContext();
vltContext.Put("dict", dict);//填充数据,扔给模板(下面的login3.html)
vltContext.Put("mingren",strs);
vltContext.Put("men",persons);
vltContext.Put("age",30);
Template vltTemplate = vltEngine.GetTemplate("login3.html");
System.IO.StringWriter vltWriter = new System.IO.StringWriter();
vltTemplate.Merge(vltContext, vltWriter);
string html = vltWriter.GetStringBuilder().ToString();
context.Response.Write(html);
}
public bool IsReusable
{
get
{
return false;
}
}
}
public class Login3 : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; //定义数据字典dict Dictionary<string,string> dict=new Dictionary<string,string>(); dict["tom"]="伯宁顿"; dict["jim"]="家里蹲"; dict["wzp"]="哈弗"; //定义字符串数据 string[] strs = new string[] { "王志鹏","刘德华","阿信"}; //定义泛型(集合)对象数据 List<Person> persons = new List<Person>(); persons.Add(new Person {age=30,name="wzp" }); persons.Add(new Person { age = 10, name = "wex" }); persons.Add(new Person { age = 25, name = "ldh" }); //映射代码************************************************************* VelocityEngine vltEngine = new VelocityEngine(); vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file"); vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹 vltEngine.Init(); VelocityContext vltContext = new VelocityContext(); vltContext.Put("dict", dict);//填充数据,扔给模板(下面的login3.html) vltContext.Put("mingren",strs); vltContext.Put("men",persons); vltContext.Put("age",30); Template vltTemplate = vltEngine.GetTemplate("login3.html"); System.IO.StringWriter vltWriter = new System.IO.StringWriter(); vltTemplate.Merge(vltContext, vltWriter); string html = vltWriter.GetStringBuilder().ToString(); context.Response.Write(html); } public bool IsReusable { get { return false; } } }
添加模板文件Login3.html
[html]
view plaincopyprint?
<!--将标头模板文件包含进来,这样就不用自己定义标头了-->
#include("head.html")
<!--取字典dict里的wzp属性值-->
$dict.wzp;<br />
<!--遍历数据中的strs字符串数组,并显示-->
1:
<ul>
#foreach($mr in $mingren)
<li>$mr</li>
#end
</ul>
<!--遍历泛型(集合)对象persons,并显示-->
2:
<ul>
#foreach($m in $men)
<li>
姓名:$m.name 年龄:$m.age
</li>
#end
</ul>
<!--取数据中的age,并根据大小进行逻辑判断-->
<p>
#if($age>10)
....小于10
#else
....大于10
#end
</p>
<!--遍历泛型(集合)对象persons,并根据对象的年龄大小,进行逻辑处理-->
3.
<ul>
#foreach($m in $men)
#if($m.age<20)
<li style="color:red">我是$m.name,我的年龄小于20岁</li>
#else
<li style="color:green">我是$m.name,我的年龄大于20岁</li>
#end
#end
</ul>
<!--将尾部模板文件包含进来,这样就不用自己定义尾部了-->
#include("foot.html")
<!--将标头模板文件包含进来,这样就不用自己定义标头了--> #include("head.html") <!--取字典dict里的wzp属性值--> $dict.wzp;<br /> <!--遍历数据中的strs字符串数组,并显示--> 1: <ul> #foreach($mr in $mingren) <li>$mr</li> #end </ul> <!--遍历泛型(集合)对象persons,并显示--> 2: <ul> #foreach($m in $men) <li> 姓名:$m.name 年龄:$m.age </li> #end </ul> <!--取数据中的age,并根据大小进行逻辑判断--> <p> #if($age>10) ....小于10 #else ....大于10 #end </p> <!--遍历泛型(集合)对象persons,并根据对象的年龄大小,进行逻辑处理--> 3. <ul> #foreach($m in $men) #if($m.age<20) <li style="color:red">我是$m.name,我的年龄小于20岁</li> #else <li style="color:green">我是$m.name,我的年龄大于20岁</li> #end #end </ul> <!--将尾部模板文件包含进来,这样就不用自己定义尾部了--> #include("foot.html")
然后在浏览器中请求Login3.ashx,看显示效果:
总结
通过上面的两个例子,可以简单理解NVelocity的开发理念:NVelocity通过映射代码将数据扔给模板进行数据填充,渲染成标准的html页,交给HttpHandler,由它返回给客户端浏览器进行解析。当然这是自己的理解,上面的例子中的数据也都是自定义的一些字典、泛型、数组、匿名类等等的,还并未涉及到与数据库的交互,所以下篇文章会用NVelocity结合数据库增、删、改、查的例子看看如何实现传统的Web开发。
相关文章推荐
- 回忆:NVelocity--基于.NET的模板引擎
- ASP.Net 模板引擎 nVelocity使用语法
- Nvelocity模板引擎
- ASP.Net 模板引擎 nVelocity使用语法
- 聊聊使用NVelocity模板引擎来开发代码生成工具
- WebPart中使用Nvelocity模板引擎来进行呈现
- 模板引擎-NVelocity
- WebPart中使用Nvelocity模板引擎来进行呈现
- NVelocity 和Razor 模板引擎小Demo, WebForm模板引擎求教
- 一山容二虎,支持最新版Log4Net 的模板引擎-NVeloCity
- 使用NVelocity模板引擎构建ASP.NET网站
- NVelocity是Java模板引擎Velocity的.Net版本
- ASP.NET MVC Tip #19 – 使用 nVelocity 视图模板引擎
- asp.net 非常简易的新闻发布系统,结合了ajax,json,Nvelocity模板引擎,只完成了一部分功能,非常适合新手看,我以前是学java方向的,刚接触.net,做的不好的别喷哈
- 下载nVelocity 视图模板引擎的注意事项
- NVelocity模板引擎的学习
- WebPart中使用Nvelocity模板引擎来进行呈现
- nvelocity模板引擎
- asp.net模板引擎:一、NVelocity介绍
- 模板引擎-NVelocity