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 中全部的關鍵字都是以#開頭的,而全部的變量則是以$開頭。Velocity 的語法相似於 JSP 中的 JSTL,甚至能夠定義相似於函數的宏,下面來看看具體的語法規則。apache
和咱們所熟知的其餘編程語言同樣,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
在 Velocity 中循環語句的語法結構以下:
#foreach($element in $list) This is $element $velocityCount #end
Velocity 引擎會將 list 中的值循環賦給 element 變量,同時會建立一個 $velocityCount 的變量做爲計數,從 1 開始,每次循環都會加 1
條件語句的語法以下:
#if(condition) #elseif(condition) #else #end
Velocity 引擎提供了 AND、OR 和 NOT 操做符,分別對應&&、||和! 例如:
#if($foo && $bar) #end
#macro(macroName arg1 arg2 …) #end
#macroName(arg1 arg2 …)
#macro(sayHello $name) hello $name #end #sayHello(「velocity」)
輸出的結果爲 hello velocity
#parse 和 #include 指令的功能都是在外部引用文件,而二者的區別是:#parse 會將引用的內容當成相似於源碼文件,會將內容在引入的地方進行解析,#include 是將引入文件當成資源文件,會將引入內容原封不動地以文本輸出。分別看如下例子:
foo.vm 文件:
#set($name =「velocity」)
parse.vm:
#parse(「foo.vm」)
輸出結果爲:velocity
include.vm:
#include(「foo.vm」)
輸出結果爲:#set($name =「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()); } }
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();