zoukankan      html  css  js  c++  java
  • 如果下次做模板,我就使用Nvelocity

    普通Replace模板做法

          很多人在做邮件模板、短信模板的时候,都是使用特殊标识的字符串进行占位,然后在后台代码中进行Replace字符串,如果遇到表格形式的内容,则需要在后台进行遍历数据集合,进行字符串的拼接,继而Replace模板中的占位符,示例代码就像是这样:

    <html>
    <head>
        <title>[title]</title>
    </head>
    <body>
         <h1>[title]</h1>
         <table>
             <tr><td>姓名</td><td>专业</td></tr>
             [TableContent]
         </table>
    </body>
    </html>
      string templateStr = "xxxxx"; //这里读取模板,从数据库或者从文件中
       StringBuilder sb=new StringBuilder();
       sb.Append("<tr><td>小明</td><td>计算机专业</td></tr>");
       sb.Append("<tr><td>小红</td><td>美术专业</td></tr>");
       templateStr = templateStr.Replace("[title]", "给你一个标题").Replace("[TableContent]", sb.ToString());
       return templateStr;

    Nvelocity介绍

          Nvelocity就像很多的模板引擎一样,以特定的语法编写好模板,然后为模板提供数据源,最终就会渲染生成出HTML,优点是模板与代码分离,很多的Nvelocity博文都是以html文件作为模板来进行的,但是我发现,也可以使用字符串模板来使用,这样你的模板就不必要存在html文件中了,存储在数据库中也可以,这应该更适合于大多数的项目。

    Nvelocity下载地址:http://www.castleproject.org/download/ 找到NVELOCITY这一项进行下载即可。

    一个简单示例揭开Nvelocity的面纱

          新建一个Application,在项目中添加Nvelocity的引用,然后添加新建项,选择一般处理程序,命名为basic.ashx,在ProcessRequest方法里填入下面代码

      public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/html";
                //创建一个模板引擎
                VelocityEngine vltEngine = new VelocityEngine();
                //文件型模板,还可以是 assembly ,则使用资源文件
                vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
                //模板存放目录
                vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("/template"));//模板文件所在的文件夹
                vltEngine.Init();
                //定义一个模板上下文
                VelocityContext vltContext = new VelocityContext();
                //传入模板所需要的参数
                vltContext.Put("Title", "标题"); //设置参数,在模板中可以通过$Title来引用
                vltContext.Put("Body", "内容");  //设置参数,在模板中可以通过$Body来引用
                vltContext.Put("Date", DateTime.Now); //设置参数,在模板中可以通过$Date来引用
                //获取我们刚才所定义的模板,上面已设置模板目录
                Template vltTemplate = vltEngine.GetTemplate("basic.html");
                System.IO.StringWriter vltWriter = new System.IO.StringWriter();
                //根据模板的上下文,将模板生成的内容写进刚才定义的字符串输出流中
                vltTemplate.Merge(vltContext, vltWriter);
                string html = vltWriter.GetStringBuilder().ToString();
                context.Response.Write(html);
            }

     然后在项目里,添加一个文件夹并且命名为template,作为存放模板的目录,这与上面代码里设置的模板目录要对应一致,然后添加新建项,选择HTML页,命名为basic.html,输入以下代码

    <html>
    <head>
        <title></title>
    </head>
    <body>
        <p>$Title</p>
        <p>$Date</p>
        <p>$Body</p>
    </body>
    </html>

     F5运行,看看效果

    直接运行HTML肯定只能看到模板的效果而已,我们工作的原理是,在一般处理程序ashx中读取模板来生成HTML,并且输出给客户端浏览器,所以我们要访问的应该是一般处理程序ashx。

    成功了,并且值都是代码中我们设置的值。

    以字符串为模板源,不必新建HTML页

    很多时候,我们的模板都是存放在数据库中的,而不是像上例那样以html文件的形式存放,Nvelocity也为我们提供这种形式的模板源,直接上代码就行了。

    public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/html";
    
                //字符串模板源,这里就是你的邮件模板等等的字符串
                string templateStr = "$Title,$Body,$Date";
    
                //创建一个模板引擎
                VelocityEngine vltEngine = new VelocityEngine();
                //文件型模板,还可以是 assembly ,则使用资源文件
                vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
                vltEngine.Init();
                //定义一个模板上下文
                VelocityContext vltContext = new VelocityContext();
                //传入模板所需要的参数
                vltContext.Put("Title", "标题"); //设置参数,在模板中可以通过$Title来引用
                vltContext.Put("Body", "内容");  //设置参数,在模板中可以通过$Body来引用
                vltContext.Put("Date", DateTime.Now); //设置参数,在模板中可以通过$Date来引用
                //定义一个字符串输出流
                StringWriter vltWriter = new StringWriter();
                //输出字符串流中的数据
                vltEngine.Evaluate(vltContext, vltWriter, null, templateStr);
                context.Response.Write(vltWriter.GetStringBuilder().ToString());
            }

    Nvelocity模板语法

          关于后台代码基本就是那样了,对于Nvelocity的重点应该是如何去编写适合需求的模板,上面的例子Put的时候,都是以字符串为例的,那么,假如Put一个对象、集合呢?Nvelocity都可以轻松解决,为了演示,下面的例子只贴出重点部分的代码。

    1、基本用法

    vltContext.Put("Title", "标题"); //设置参数,在模板中可以通过$Title来引用
    vltContext.Put("Body", "内容"); //设置参数,在模板中可以通过$Body来引用
    vltContext.Put("Date", DateTime.Now); //设置参数,在模板中可以通过$Date来引用

    <html>
    <body>
        <p>$Title</p>
        <p>$Date</p>
        <p>$Body</p>
    </body>
    </html>

    2、NVelocity中输出对象的属性

          如果只能像上面那样子的基本用法的话,那简直太渣了,还不如直接IO读取模版直接Replace,下面演示一些更加高级的用法,直接Put一个对象,然后在模版中引用其属性,那样子就更加碉堡了,Nvelocity还可以支持对象的属性是对象的调用方法,引用的时候就好比$p.Son.Name

    //定义一个模板上下文
    VelocityContext vltContext = new VelocityContext();
    Person p = new Person()
     {
         Name = "dotnetgeek",
         Age = 10
     };
     //传入模板所需要的参数
    vltContext.Put("p", p); //设置参数为对象,在模板中可以通过$p.Name 来引用
    <!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>
       姓名:$p.Name,年龄:$p.Age
    </body>
    </html>

    3、NVelocity对象的索引

     //定义一个模板上下文
     VelocityContext vltContext = new VelocityContext();
     Dictionary<string, string> dic = new Dictionary<string, string>();
     dic["dudu"] = "博客园";
     dic["Jimmy"] = "softcomz";
     //传入模板所需要的参数
     vltContext.Put("dic", dic); //设置参数为对象,在模板中可以通过$dic.dudu 来引用
    <html>
    <body>
        $dic.dudu
        $dic.Jimmy
    </body>
    </html>

     4、NVelocity中的ForEach遍历和If判断

     VelocityContext vltContext = new VelocityContext();
     List<string> lstSite = new List<string>(){"博客园","微博"};
     //传入模板所需要的参数
     vltContext.Put("lst", lstSite); 
    <html>
    <body>
        <ul>
            #foreach($s in $lst)
            <li>$s</li>
            #end
        </ul>
    
        #if(1==1)
        一等于一
        #else
        一不等于一
        #end
    </body>
    </html>

    在前台的模版中,有关后台代码的编写,如果以#开头,比如#foreach 、#if(condition),因为没有大括号的约束,所以结束时以#end为标识,ForEach和If还可以嵌套使用,就像平时我们写后台代码的那样,只是语法稍稍有点不同而已,有了这样的高级特性,这对于编写模版来说就能做很多的事情了。

     5、NVelocity中Parse和Include

    #parse("head.html")
    
    <p>$body</p>
    
    #include("footer.html")

    顾名思义,#include就是在模版中在将其他模版包括进来,就好比网站的头部,尾部,广告模版等等,这些内容都是相同的时候,就可以做成一个单独的模版供各处引用。

    #parse的用法跟#include相类似,如果将上面的代码改成#parse之后,效果是一样的,#parse的特殊功能在于,它可以解析Nvelocity元素,比如,body.html 模版使用Nvelocity变量$body ,如果使用#parse引用head.html和footer.html两个模版,则在head.html、footer.html模版中继续可以使用$body这个变量,而#include做不到,并且相关的Nvelocity元素(#foreach、#if)也不起效果,只能原样输出,所以#parse > #inclued

    6、前台声明变量使用#set

    在前台的Nvelocity代码中,根据需要,我们可以声明一个供前台使用的参数,这样就免得后台代码再次传递过来了,对于一些简单逻辑,我们可以这样实现

    #if(1<10)
    
    #set($nextnum=1+1+1+1)
    //下面的逻辑就可以使用
    nextnum这个变量了。
    #end

    建议使用匿名类来进行代码封装

         上面提过,对于Nvelocity我们的重点应该是放在编写适合需求的模板,后台的代码基本上是一次封装,多次调用即可了,只需要把要Put的对象做成一个可变参数,剩余的代码进行一个封装就行了,那么如何更好的调用,我建议使用匿名类,因为随着模板的编写,我们可能需要传递多种、多个数据,使用匿名类的好处就是,类属性自定义而不用像自定义一个类型那样,每次增加数据属性就得去修改一下类型,这样显得很优雅很随性简便。

      var model = new { ID = "dudu", PersonLaoPo = new Person() { Name = "冰冰", Age = 100 } };
      vltContext.Put("Model", model);

    Demo下载

  • 相关阅读:
    NS3网络仿真(3): NetAnim
    C++中explicit关键字作用
    JS实现页面跳转 浏览器地址栏保持不变
    凤凰岭一日游
    开发一个软件平台的一些心得体会
    对Jscript操作注册表接口的一点不解
    关于jacob支持BSTR类型的经验总结
    Java 开源博客 —— Solo 0.6.8 正式版发布了!
    Java 开源博客 —— Solo 0.6.8 正式版发布了!
    解决The requested resource is not available的办法
  • 原文地址:https://www.cnblogs.com/waynechan/p/3489136.html
Copyright © 2011-2022 走看看