您的位置:首页 > 其它

模板引擎-NVelocity

2014-11-26 08:14 204 查看
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
plaincopy





<span style="color:#000066;"></span>

[csharp] view
plaincopy





//用的时候考代码即可,只需改三个地方:模板所在文件夹、添加数据、设定模板

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
plaincopy





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
plaincopy





<!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
plaincopy





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
plaincopy





<!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
plaincopy





<h1>体育新闻网-版权所有©kobe</h1>

</body>

</html>

添加一般处理程序Login3.ashx:

[csharp] view
plaincopy





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
plaincopy





<!--将标头模板文件包含进来,这样就不用自己定义标头了-->

#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开发。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: