Velocity快速入門

Velocity 介紹

Velocity是一個基於java的模板引擎。它容許任何人使用簡單但功能強大的模板語言引用Java代碼中定義的對象。java

當Velocity用於web開發時,web設計人員能夠與Java程序員並行工做,根據模型-視圖-控制器(MVC)模型開發web站點,這意味着web頁面設計人員能夠只專一於建立看起來不錯的站點,而程序員能夠只專一於編寫一流的代碼。Velocity將Java代碼從web頁面中分離出來,使web站點在其生命週期內更具可維護性,併爲Java服務器頁面(jsp)或PHP提供了一個可行的替代方案。程序員

Velocity的功能遠遠超出了web的範圍;例如,它能夠用來從模板生成SQL、PostScript和XML。它既能夠做爲生成源代碼和報告的獨立實用程序使用,也能夠做爲其餘系統的集成組件使用。例如,Velocity爲各類web框架提供模板服務,使它們可以使用視圖引擎,以便根據真正的MVC模型開發web應用程序。web

Velocity 主要使用場景

  1. Web 應用:開發者在不使用 JSP 的狀況下,能夠用 Velocity 讓 HTML 具備動態內容的特性。
  2. 源代碼生成:Velocity 能夠被用來生成 Java 代碼、SQL 或者 PostScript。
  3. 自動 Email:不少軟件的用戶註冊、密碼提醒或者報表都是使用 Velocity 來自動生成的。
  4. 轉換 xml。

VTL語法使用

在 Velocity 中全部的關鍵字都是以#開頭的,而全部的變量則是以$開頭。Velocity 的語法相似於 JSP 中的 JSTL,甚至能夠定義相似於函數的宏,下面來看看具體的語法規則。apache

1、變量

和咱們所熟知的其餘編程語言同樣,Velocity 也能夠在模板文件中有變量的概念。編程

變量定義

#set($name =「velocity」)api

等號後面的字符串 Velocity 引擎將從新解析,例如出現以$開始的字符串時,將作變量的替換。服務器

#set($hello =「hello $name」)app

上面的這個等式將會給 $hello 賦值爲「hello velocity」框架

變量的使用

在模板文件中使用$name 或者 ${name} 來使用定義的變量。推薦使用 ${name} 這種格式,由於在模板中同時可能定義了相似$name 和 $names 的兩個變量,若是不選用大括號的話,引擎就沒有辦法正確識別 $names 這個變量。jsp

#set($name =「ricky」)
Welcome $name to velocity\.com

2、循環

在 Velocity 中循環語句的語法結構以下:

#foreach($element in $list)
 This is $element
 $velocityCount
#end

Velocity 引擎會將 list 中的值循環賦給 element 變量,同時會建立一個 $velocityCount 的變量做爲計數,從 1 開始,每次循環都會加 1

3、條件語句

條件語句的語法以下:

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

4、關係操做符

Velocity 引擎提供了 AND、OR 和 NOT 操做符,分別對應&&、||和! 例如:

#if($foo && $bar)
#end

5、宏

Velocity 中的宏能夠理解爲函數定義。定義的語法以下:

#macro(macroName arg1 arg2 …)
#end

調用這個宏的語法是:

#macroName(arg1 arg2 …)

這裏的參數之間使用空格隔開,下面是定義和使用 Velocity 宏的例子:

#macro(sayHello $name)
hello $name
#end

#sayHello(「velocity」)

輸出的結果爲 hello velocity

6、#parse 和 #include

#parse 和 #include 指令的功能都是在外部引用文件,而二者的區別是:#parse 會將引用的內容當成相似於源碼文件,會將內容在引入的地方進行解析,#include 是將引入文件當成資源文件,會將引入內容原封不動地以文本輸出。分別看如下例子:

foo.vm 文件:
#set($name =「velocity」)

parse.vm:
#parse(「foo.vm」)

輸出結果爲:velocity

include.vm:
#include(「foo.vm」)

輸出結果爲:#set($name =「velocity」)

API實戰

  1. Singleton Model
    使用 org.apache.velocity.app.Velocity類
package com.bytebeats.velocity.sample;

import java.io.StringWriter;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.MethodInvocationException;

public class SingletonModelDemo {

    public static void main(String[] args) {

        Velocity.init();

        VelocityContext context = new VelocityContext();
        context.put("name", "Velocity");

        Template template = null;
        try {
            template = Velocity.getTemplate("mytemplate.vm");
        } catch( ResourceNotFoundException e ) {
            // couldn't find the template
        } catch( ParseErrorException pee ) {
            // syntax error: problem parsing the template
        } catch( MethodInvocationException mie ) {
            // something invoked in the template
            // threw an exception
        } catch( Exception e ) {

        }

        StringWriter sw = new StringWriter();
        template.merge(context, sw);

        System.out.println("content:"+sw.toString());
    }
}
  1. Separate Instance
    使用org.apache.velocity.app.VelocityEngine,以下:
package com.bytebeats.velocity.sample;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import java.io.StringWriter;

public class SeparateInstanceDemo {

    public static void main(String[] args) {

        //1. create a new instance of the engine
        VelocityEngine ve = new VelocityEngine();

        //2. configure the engine
        ve.setProperty(VelocityEngine.RESOURCE_LOADER, "classpath");

        //3. initialize the engine
        ve.init();

        VelocityContext context = new VelocityContext();
        context.put("name", "Velocity");
        
        Template template = ve.getTemplate("foo.vm");
        StringWriter sw = new StringWriter();
        template.merge(context, sw);

        System.out.println("content:"+sw.toString());
    }
}

還有另一種方式來配置:

Properties props = new Properties();
props.load(this.getClass().getResourceAsStream("/vm.properties"));
VelocityEngine ve = new VelocityEngine(props);
ve.init();

官方文檔:http://velocity.apache.org/

相關文章
相關標籤/搜索