模板引擎-NVelocity

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 plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="color:#000066;"></span>  
[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //用的时候考代码即可,只需改三个地方:模板所在文件夹、添加数据、设定模板  
  2. VelocityEngine vltEngine = new VelocityEngine();  
  3. vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");  
  4. vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹,例如我的模板为templates文件夹下的TestNV.html  
  5. vltEngine.Init();  
  6.   
  7. VelocityContext vltContext = new VelocityContext();  
  8. vltContext.Put("dataName", person);//添加数据,在模板中可以通过$dataName来引用数据   
  9. vltContext.Put("dataName2", person);//可添加多个数据,基本支持所有数据类型,包括字典、数据、datatable等  
  10. Template vltTemplate = vltEngine.GetTemplate("TestNV.html");//设定模板  
  11. System.IO.StringWriter vltWriter = new System.IO.StringWriter();  
  12. vltTemplate.Merge(vltContext, vltWriter);  
  13.   
  14. string html = vltWriter.GetStringBuilder().ToString();  
  15. context.Response.Write(html);//返回渲染生成的标准html代码字符串  

然后看一个小例子:(Example1)


  新建一般处理程序TestNVelocity.ashx,代码如下:

  

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class TestNVelocity : IHttpHandler  
  2. {  
  3.   
  4.     public void ProcessRequest(HttpContext context)  
  5.     {  
  6.         context.Response.ContentType = "text/html";  
  7.         //定义匿名类,并实例化对象person  
  8.         var person = new { name="wzp",age=24 };  
  9.   
  10.         //用的时候考代码即可,只需改三个地方:模板所在文件夹、添加数据、设定模板  
  11.         VelocityEngine vltEngine = new VelocityEngine();  
  12.         vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");  
  13.         vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹,例如我的模板为templates文件夹下的TestNV.html  
  14.         vltEngine.Init();  
  15.   
  16.         VelocityContext vltContext = new VelocityContext();  
  17.         vltContext.Put("zhipeng", person);//将person对象扔给模板TestNV.html  
  18.         Template vltTemplate = vltEngine.GetTemplate("TestNV.html");//设定模板  
  19.         System.IO.StringWriter vltWriter = new System.IO.StringWriter();  
  20.         vltTemplate.Merge(vltContext, vltWriter);  
  21.   
  22.         string html = vltWriter.GetStringBuilder().ToString();  
  23.         context.Response.Write(html);//返回渲染生成的标准html代码字符串  
  24.     }  
  25.   
  26.     public bool IsReusable  
  27.     {  
  28.         get  
  29.         {  
  30.             return false;  
  31.         }  
  32.     }  
  33. }  


  新建模板html页TestNV.html,代码如下:

  

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!DOCTYPE html>  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  
  5.     <title></title>  
  6. </head>  
  7. <body>  
  8.     <form action='TestNVelocity.ashx'>  
  9.         <!--取数据,并使用-->  
  10.         我的姓名是:$zhipeng.name;<br />  
  11.         我的年龄是:$zhipeng.age;<br />  
  12.     </form>  
  13. </body>  
  14. </html>  

  然后用浏览器请求上述的TestNVelocity.ashx,即可看到效果:


  

下面看一个稍复杂点的例子(Example2)


添加Person类:

  

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5.   
  6. namespace chuanzhiblog  
  7. {  
  8.     public class Person  
  9.     {  
  10.         //定义属性,可读、可写  
  11.         public string name { getset; }  
  12.         public int age {get;set; }  
  13.   
  14.         public Person father { get;set;}  
  15.     }  
  16. }  

添加标头模板head.html

  

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!DOCTYPE html>  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  
  5.     <title></title>  
  6. </head>  
  7. <body>  
  8.     <h1 style="font-family:'Lucida Fax'">我是体育新闻网,欢迎光临</h1>  

添加尾部模板foot.html

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.     <h1>体育新闻网-版权所有©kobe</h1>  
  2. </body>  
  3. </html>  

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

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class Login3 : IHttpHandler  
  2. {  
  3.   
  4.     public void ProcessRequest(HttpContext context)  
  5.     {  
  6.         context.Response.ContentType = "text/html";  
  7.         //定义数据字典dict  
  8.         Dictionary<string,string> dict=new Dictionary<string,string>();  
  9.         dict["tom"]="伯宁顿";  
  10.         dict["jim"]="家里蹲";  
  11.         dict["wzp"]="哈弗";  
  12.         //定义字符串数据  
  13.         string[] strs = new string[] { "王志鹏","刘德华","阿信"};  
  14.         //定义泛型(集合)对象数据  
  15.         List<Person> persons = new List<Person>();  
  16.         persons.Add(new Person {age=30,name="wzp" });  
  17.         persons.Add(new Person { age = 10, name = "wex" });  
  18.         persons.Add(new Person { age = 25, name = "ldh" });  
  19.         //映射代码*************************************************************  
  20.         VelocityEngine vltEngine = new VelocityEngine();  
  21.         vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");  
  22.         vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹  
  23.         vltEngine.Init();  
  24.   
  25.         VelocityContext vltContext = new VelocityContext();  
  26.         vltContext.Put("dict", dict);//填充数据,扔给模板(下面的login3.html)  
  27.         vltContext.Put("mingren",strs);  
  28.         vltContext.Put("men",persons);  
  29.         vltContext.Put("age",30);  
  30.   
  31.         Template vltTemplate = vltEngine.GetTemplate("login3.html");  
  32.         System.IO.StringWriter vltWriter = new System.IO.StringWriter();  
  33.         vltTemplate.Merge(vltContext, vltWriter);  
  34.   
  35.         string html = vltWriter.GetStringBuilder().ToString();  
  36.         context.Response.Write(html);  
  37.   
  38.     }  
  39.   
  40.     public bool IsReusable  
  41.     {  
  42.         get  
  43.         {  
  44.             return false;  
  45.         }  
  46.     }  
  47. }  

添加模板文件Login3.html

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!--将标头模板文件包含进来,这样就不用自己定义标头了-->  
  2. #include("head.html")  
  3. <!--取字典dict里的wzp属性值-->  
  4. $dict.wzp;<br />  
  5. <!--遍历数据中的strs字符串数组,并显示-->  
  6. 1:  
  7. <ul>  
  8.     #foreach($mr in $mingren)  
  9.     <li>$mr</li>  
  10.     #end  
  11. </ul>  
  12. <!--遍历泛型(集合)对象persons,并显示-->  
  13. 2:  
  14. <ul>  
  15.     #foreach($m in $men)  
  16.     <li>  
  17.         姓名:$m.name  年龄:$m.age  
  18.     </li>  
  19.     #end  
  20. </ul>  
  21. <!--取数据中的age,并根据大小进行逻辑判断-->  
  22. <p>  
  23.     #if($age>10)  
  24.     ....小于10  
  25.     #else  
  26.     ....大于10  
  27.     #end  
  28. </p>  
  29. <!--遍历泛型(集合)对象persons,并根据对象的年龄大小,进行逻辑处理-->  
  30. 3.  
  31. <ul>  
  32.     #foreach($m in $men)  
  33.         #if($m.age<20)  
  34.         <li style="color:red">我是$m.name,我的年龄小于20岁</li>  
  35.         #else  
  36.         <li style="color:green">我是$m.name,我的年龄大于20岁</li>  
  37.         #end  
  38.     #end  
  39. </ul>  
  40. <!--将尾部模板文件包含进来,这样就不用自己定义尾部了-->  
  41. #include("foot.html")  

然后在浏览器中请求Login3.ashx,看显示效果:


总结

  通过上面的两个例子,可以简单理解NVelocity的开发理念:NVelocity通过映射代码将数据扔给模板进行数据填充,渲染成标准的html页,交给HttpHandler,由它返回给客户端浏览器进行解析。

  当然这是自己的理解,上面的例子中的数据也都是自定义的一些字典、泛型、数组、匿名类等等的,还并未涉及到与数据库的交互,所以下篇文章会用NVelocity结合数据库增、删、改、查的例子看看如何实现传统的Web开发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值