Velocity模板引擎详解


Velocity是一个基于java的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。它作为一款成熟的基于java的模板引擎,能够帮我们实现页面静态化,同时它将Java代码与网页分开,使网站在其生命周期内更加可维护,并为Java Server Pages(JSP)或PHP提供了可行的替代方案。

引擎

Velocity Engine

这是实现所有工作的实际模板引擎。(目前的版本是1.7)

Velocity Tools

项目包含使用Velocity引擎构建Web和非Web应用程序的工具和其他有用的基础设施。在此找到例如Struts集成的代码或独立的VelocityViewServlet。

语法

1. 基本语法


# 关键字

Velocity关键字都是使用#开头的,如#set、#if、#else、#end、#foreach等

$ 变量

Velocity变量都是使用$开头的,如:$name、$msg

{}变量

Velocity对于需要明确表示的Velocity变量,可以使用{}将变量包含起来。如在页面中,需要有$someoneName这种内容,此时为了让Velocity能够区分,可以使用${someone}Name。

!变量

如果某个Velocity变量不存在,那么页面中就会显示$xxx的形式,为了避免这种形式,可以在变量名称前加上!如页面中含有$msg,如果msg有值,将显示msg的值;如果不存在就会显示$msg。这是我们不希望看到的,为了把不存在的变量显示为空白,可以使用$!msg。

2. 变量

变量定义

#set($root = "www")  
#set($name = "index")  
#set($template = "$root/$name")  
$template

执行输出结果:

www/index

变量赋值

赋值的左边必须是一个变量,或者是属性的引用。右边可以是:变量引用、字面字符串、属性引用、方法引用、字面数字、数组

#set($name = $bill)   ##变量引用  
#set($name.pre = "monica")  ##字符串  
#set($name.last = $address.num) ##属性引用  
#set($name.mid = $hotel.find($web)) ##方法引用  
#set($name.num = 123) ##数字  
#set($name.say = ["yes",$my,"yes"]) ##数组

velocity会将属性解释为属性的get方法,如:

$foo.Bar   等同于 $foo.getBar()
$foo.User("join")  等同于 $foo.getUser("join")
$foo.Request.ServerName 等同于 $foo.getRequest().getServerName()

3. 转义字符'\'

#set($mail = "foo")  
$mail  
\$mail  
\\$mail  
\\\$mail

执行结果如下:

foo $mail \foo \$mail

4. 循环

语法定义如下:

#foreach( 单个元素名称 in 集合)  
         ....  
#end

例子如下:

#foreach( $num in [2..-2])  
    this is $num.</br>  
#end

执行结果如下:

this is 2.
this is 1.
this is 0.
this is -1.
this is -2

5. 条件

语法定义如下:

#if(condition)  
......
#elseif(condition)  
......
#else  
......
#end

6. 关系和逻辑操作符

&& 并且  || 或者   ! 取反

7. 注释


1. 单行注释##

##这里写注释

2. 多行注释#* *#

#*  
    这个写注释  可以写多行的注释
*#

8. 宏

语法定义如下:

#macro(宏的名称  $参数1  $参数2 .....)  
       语句体(即函数体)  
#end

宏调用如下:

#宏的名称 ($参数1  $参数2 .....)

例子

导入jar包:velocity-1.4.jar,velocity-dept.jar;log4j.jar

//test.java生成文件
public static void main(String[] args) {
    //获取模板引擎
    VelocityEngine ve = new VelocityEngine();
    //模板文件所在的路径
    String path = "D:/work/velocity/WebRoot";
    //设置参数
    ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
    //处理中文问题
    ve.setProperty(Velocity.INPUT_ENCODING, "GBK");
    ve.setProperty(Velocity.OUTPUT_ENCODING, "GBK");
    try {
        //初始化模板
        ve.init();
        //获取模板(hello.html)
        Template template = ve.getTemplate("hello.html");
        //获取上下文
        VelocityContext root = new VelocityContext();
        //把数据填入上下文
        root.put("name", "world");
        //输出路径
        String outpath = "e:/helloworld.html";
        //输出
        Writer mywriter = new PrintWriter(new FileOutputStream(new File(outpath)));

        template.merge(root, mywriter);
        mywriter.flush();
    } catch(Exception e) {
        e.printStackTrace();
    }
}
//example.html 模板文件

<table cellspacing="0" cellpadding="5" width="20%" >
<tr>
<td bgcolor="#eeeeee" align="center">
Names:
</td>
</tr>
#foreach($name in $theList)
<tr>
<td>
$name
</td>
</tr>
#end
</table>
//TestVelocityServlet.java
public class TestVelocityServlet extends VelocityServlet {
/**
*   由TestVelocityServlet.init()调用
*   在此找出模版的路径
*/
protected Properties loadConfiguration(ServletConfig config) throws IOException, FileNotFoundException {
    //配置模板路径
    Properties prop = new Properties();
    String path = config.getServletContext().getRealPath("/");
    prop.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
    return prop;
}
/**
*  Velocity主要的商业逻辑处理方法,由VelocityServlet自动调用
*  @param ctx 模板上下文            
*  @return Template 模板信息
*/  
protected Template handleRequest(Context ctx) throws Exception {
    //主要在此设置演示用的数据,开发中在此调用相应的业务处理流程,
    //并设置返回到页面的数据
    //待展示的列表数据
    String p1 = "first";
    String p2 = "second";
    Vector personList = new Vector();
    personList.addElement(new String(p1.getBytes()));
    personList.addElement(new String(p2.getBytes()));
    //定义模板
    Template outty = null;
    //设置数据,供页面模版替换成显示的数据
    ctx.put("theList", personList);
    try {
    //取模板
    outty = getTemplate("example.html");
    } catch (Exception e) {
    e.printStackTrace();
    }
    return outty;
    }
}
//web.xml
<servlet>
   <servlet-name>SampleServlet</servlet-name>
   <servlet-class>com.huang.servlet.TestVelocityServlet</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>SampleServlet</servlet-name>
   <url-pattern>/a</url-pattern>
</servlet-mapping>

总结

  1. Velocity将Java代码从Web 页面中分离出来,使用Web站点从长远看更容易维护,并且提供了一种可行的JavaServer Pages替代解决方案。

  2. Velocity是一种基于Java的模板引擎,但允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。

  3. Velocity就是MVC架构的一种实现,但它更多的是关注在Model和View之间,作为它们的桥梁。