Velocity简介

Velocity简介
原文引自:http://www.3doing.net/forums/dispbbs.asp?boardID=57&ID=593&page=1

Velocity 是一个开放源吗的模版引擎,由apache.org小组负责开发,现在最新的版本是Velocity1.3.1
http://jakarta.apache.org/velocity/index.html 可以了解Velocity的最新信息。
    Velocity允许我们在模版中设定变量,然后在运行时,动态的将数据 插入到模版中,替换这些变量。
    例如:

  1.     <HTML >
  2.         <BODY>
  3.             HELLO $CUSTOMERNAME
  4.         </BODY>
  5.     </HTML >


    我们可以在运行时得到客户的名 字,然后把它插入到这个模版中替换变量$CUSTOMERNAME,整个替换过程是由Velocity进行控制的,而且java的调用代码也非常简单
    如 我们可以在java代码中这样调用

  1.     //这个文件中设定了Velocity使用的log4j的配置和Velocity的模版文件所在的目录
  2.     Velocity.init("D:\\Template\\resource\\jt.properties" );
  3.     //模版文件名,模版文件所在的路径在上一条语句中已经设置了
  4.     Template template =Velocity.getTemplate("hello.vm" , "gb2312" );  
  5.     //实例化一个Context
  6.     VelocityContext context = new VelocityContext();    
  7.     //把模版变量 的值设置到context中
  8.     context.put("CUSTOMERNAME" , "My First Template Engine ---- Velocity." );        
  9.     //开始模版的替换
  10.     template.merge(context, writer);
  11.     //写到文件中
  12.     PrintWriter filewriter = new PrintWriter (new FileOutputStream (outpath),true );
  13.     filewriter.println(writer.toString());
  14.     filewriter.close();


    这就是整个java的 代码,非常的简单。如果我们有多个模版变量,我们仅需要把这些模版变量的值设置到context中。
    
    下面我们简单的分析 一下,Velocity引擎读取模板文件时,它直接输出文件中所有的文本,但以$字符开头的除外,$符号标识着一个模版变量位 置,context.put("CUSTOMERNAME", "My First Template Engine ---- Velocity.");当Velocity模板引擎解析并输出模板的结果时,模板中所有出现$CUSTOMERNAME的地方都将插入客户的名字,即被 加入到VelocityContext的对象的toString()方法返回值将替代Velocity变量(模板中以$开头的变量)。
    模 板引擎中最强大、使用最频繁的功能之一是它通过内建的映像 (Reflection)引擎查找对象信息的能力。这个映像引擎允许用一种方便的 Java“.”类似的操作符,提取任意加入到VelocityContext的对象的任何公用方法的值,或对象的任意数据成员。映像引擎还带来了另外一个 改进:快速引用JavaBean的属性。使用JavaBean属性的时候,我们可以忽略get方法和括号。请看下面这个模板的例子。

  1.     <HTML >
  2.         <BODY>
  3.             Name :         $Customer.Name ()
  4.             Address:    $Customer.Address()
  5.             Age:        $Customer.Age()
  6.         </BODY>
  7.     </HTML >


    java的代码:    

  1.     //设置客户信 息
  2.     Customer mycustomer = new Customer();
  3.     mycustomer.setName("Velocity" );
  4.     mycustomer.setAddress("jakarta.apache.org/velocity/index.html" );
  5.     mycustomer.setAge(2);
  6.     
  7.     //这个文件中设定了 Velocity使用的log4j的配置和Velocity的模版文件所在的目录
  8.     Velocity.init("D:\\Template\\resource\\jt.properties" );
  9.     //模版文件名,模版文件所在的路径在上一条语句中已经设置了
  10.     Template template =Velocity.getTemplate("hello.vm" , "gb2312" );  
  11.     //实例化一个Context
  12.     VelocityContext context = new VelocityContext();    
  13.     //把模版变量 的值设置到context中
  14.     context.put("Customer" , mycustomer);    
  15.     //开始模版的替换
  16.     template.merge(context, writer);
  17.     //写到文件中
  18.     PrintWriter filewriter = new PrintWriter (new FileOutputStream (outpath),true );
  19.     filewriter.println(writer.toString());
  20.     filewriter.close();


    输出结果:

  1.     <HTML >
  2.         <BODY>
  3.             Name :        Velocity
  4.             Address:    jakarta.apache.orgvelocityindex.html
  5.             Age:        2
  6.         </BODY>
  7.     </HTML >


    除 了替换变量之外,象Velocity高级引擎还能做其他许多事情,它们有用来比较和迭代的内建指令,通过这些指令我们可以完成程序语言中的条件判断语句和 循环语句等
    
    例如,我们想要输出年龄等于2的所有客户的信息,我们可以这样定义我们的模版
    模版:

  1.     <HTML >
  2.         <BODY>
  3.             <table>
  4.                 <tr>
  5.                     <td> 名称</td><td>地址</td><td>年龄</td>
  6.                 </tr>
  7.                 #foreach ($Customer in $allCustomer)
  8.                     #if ($Customer.Age()=="2" )
  9.                     <tr>
  10.                         <td>$Customer.Name ()</td>
  11.                         <td>$Customer.Address()</td>
  12.                         <td>$Customer.Age()</td>
  13.                     </tr>
  14.                     #end
  15.                 #end
  16.             </table>
  17.         </BODY>
  18.     </HTML >

    

    java的代 码:    

  1.     //设置客户信息
  2.     ArrayList allMyCustomer = new ArrayList ();
  3.     
  4.     //客户1
  5.     Customer mycustomer1 = new Customer();
  6.     mycustomer1.setName("Velocity" );
  7.     mycustomer1.setAddress("jakarta.apache.org/velocity/index.html" );
  8.     mycustomer1.setAge(2);
  9.     
  10.     //客户2
  11.     Customer mycustomer2 = new Customer();
  12.     mycustomer2.setName("Tomcat" );
  13.     mycustomer2.setAddress("jakarta.apache.org/tomcat/index.html" );
  14.     mycustomer2.setAge(3);
  15.     
  16.     //客户3
  17.     Customer mycustomer3 = new Customer();
  18.     mycustomer3.setName("Log4J" );
  19.     mycustomer3.setAddress("jakarta.apache.org/log4j/docs/index.html" );
  20.     mycustomer3.setAge(2);
  21.     
  22.     //添加到 allMyCustomer(ArrayList)中.
  23.     allMyCustomer.add(mycustomer1);
  24.     allMyCustomer.add(mycustomer2);
  25.     allMyCustomer.add(mycustomer3);
  26.     
  27.     //这个文件中设定了 Velocity使用的log4j的配置和Velocity的模版文件所在的目录
  28.     Velocity.init("D:\\Template\\resource\\jt.properties" );
  29.     //模版文件名,模版文件所在的路径在上一条语句中已经设置了
  30.     Template template =Velocity.getTemplate("hello.vm" , "gb2312" );  
  31.     //实例化一个Context
  32.     VelocityContext context = new VelocityContext();    
  33.     /**
  34.      * 注意这里我们仅仅需要给一个模版变量负值
  35.      */
  36.     context.put("allCustomer" , allMyCustomer);    
  37.     //开始模版的替换
  38.     template.merge(context, writer);
  39.     //写到文件中
  40.     PrintWriter filewriter = new PrintWriter (new FileOutputStream (outpath),true );
  41.     filewriter.println(writer.toString());
  42.     filewriter.close();

    
    结果:

  1.     <HTML >
  2.         <BODY>
  3.             <table>
  4.                 <tr>
  5.                     <td> 名称</td><td>地址</td><td>年龄</td>
  6.                 </tr>
  7.                 <tr>                
  8.                     <td>Velocity</td>
  9.                     <td>jakarta.apache.orgvelocityindex.html</td>
  10.                     <td>2</td>
  11.                 </tr>
  12.                 <tr>                
  13.                     <td>Log4J</td>
  14.                     <td>jakarta.apache.orglog4jdocsindex.html</td>
  15.                     <td>2</td>
  16.                 </tr>
  17.             </table>
  18.         </BODY>
  19.     </HTML >


    #IF 语句完成逻辑判断,这个我想不用多说了。
    allCustomer对象包含零个或者多个Customer对象。由于 ArrayList(List,HashMap,HashTable,Iterator,Vector等)属于Java Collections Framework的一部分,我们可以用#foreach指令迭代其内容。我们不用担心如何定型对象的类型——映像引擎会为我们完成这个任 务。#foreach指令的一般格式是“#foreach in ”。#foreach指令迭代list,把list中的每个元素放入item参数,然后解析#foreach块内的内容。对于list内的每个元 素,#foreach块的内容都会重复解析一次。从效果上看,它相当于告诉模板引擎说:“把list中的每一个元素依次放入item变量,每次放入一个元 素,输出一次#foreach块的内容”。
    
    MVC设计模型:
    使用模板引擎最大的好处在于,它分离了代码 (或程序逻辑)和表现(输出)。由于这种分离,你可以修改程序逻辑而不必担心邮件消息本身;类似地,你(或公关部门的职员)可以在不重新编译程序的情况 下,重新编写客户列表。 实际上,我们分离了系统的数据模式(Data Model,即提供数据的类)、控制器(Controller,即客户列表程序)以及视图(View,即模板)。这种三层体系称为Model-View- Controller模型(MVC)。如果遵从MVC模型,代码分成三个截然不同的层,简化了软件开发过程中所有相关人员的工作。 结合模板引擎使用的数据模式可以是任何Java对象,最好是使用Java Collection Framework的对象。控制器只要了解模板的环境(如VelocityContext),一般这种环境都很容易使用。一些关系数据库的“对象-关系” 映射工具能够和模板引擎很好地协同,简化JDBC操作;对于EJB,情形也类似。 模板引擎与MVC中视图这一部分的关系更为密切。模板语言的功能很丰富、强大,足以处理所有必需的视图功能,同时它往往很简单,不熟悉编程的人也可以使用 它。模板语言不仅使得设计者从过于复杂的编程环境中解脱出来,而且它保护了系统,避免了有意或无意带来危险的代码。例如,模板的编写者不可能编写出导致无 限循环的代码,或侵占大量内存的代码。不要轻估这些安全机制的价值;大多数模板编写者不懂得编程,从长远来看,避免他们接触复杂的编程环境相当于节省了你 自己的时间。 许多模板引擎的用户相信,在采用模板引擎的方案中,控制器部分和视图部分的明确分离,再加上模板引擎固有的安全机制,使得模板引擎足以成为其他内容发布系 统(比如JSP)的替代方案。因此,Java模板引擎最常见的用途是替代JSP也就不足为奇了。
    HTML处理 :
    由于 人们总是看重模板引擎用来替换JSP的作用,有时他们会忘记模板还有更广泛的用途。到目前为止,模板引擎最常见的用途是处理HTML Web内容。但我还用模板引擎生成过SQL、email、XML甚至Java源代码。

你可能感兴趣的:(apache,编程,log4j,mvc,velocity)