Velocity是由Apache軟件組織提供的一項開放源碼項目,它是一個基於Java的模板引擎。
經過Velocity模板語言(Velocity Template Language,VTL)定義模板(Template),而且在模板中不包含任何Java程序代碼。
Java開發人員編寫程序代碼來設置上下文(Context),它包含了用於填充模板的數據。
Velocity引擎可以把模板和上下文合併起來,生成相關內容。
Velocity是一種後臺代碼和前臺展現分離的一種設計。html
velocity由如下幾部分組成:前端
(1)指定runtime.log對應的日誌文件(可選),Velocity.init()中使用;
(2)建立模板文件。默認以.vm結尾(模板的內容也能夠寫在代碼中),由生成org.apache.velocity.Template對象的org.apache.velocity.app.Velocity.getTemplate(templateFile)使用;
Tips:模板文件要放在項目根目錄下,不然不能正常加載
(3)模板中須要使用的動態數據。存放在org.apache.velocity.VelocityContext對象中,VelocityContext中使用map存放數據;
(4)輸出最終生成的內容,javaapp和javaweb中不一樣java
java app中web
使用org.apache.velocity.Template.merge(...,context.., writer),這個方法有多個重載方法.其中writer是實現writer接口的io對象apache
/*
* Now have the template engine process your template using the
* data placed into the context. Think of it as a 'merge'
* of the template and the data to produce the output stream.
*/瀏覽器
javaweb中app
訪問servlet返回org.apache.velocity.Template對象,便可在瀏覽器中展現(能夠認爲是一個前端頁面,內容瀏覽器傳動解析)ide
其它:
使用log4j來輸出velocity的日誌:ui
import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.log.Log4JLogChute; import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; /** * Simple example class to show how to use an existing Log4j Logger * as the Velocity logging target. */ public class Log4jLoggerExample { public static String LOGGER_NAME = "velexample"; public static void main( String args[] ) throws Exception { /* * configure log4j to log to console */ BasicConfigurator.configure(); Logger log = Logger.getLogger(LOGGER_NAME); log.info("Hello from Log4jLoggerExample - ready to start velocity"); /* * now create a new VelocityEngine instance, and * configure it to use the logger */ VelocityEngine ve = new VelocityEngine(); ve.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.Log4JLogChute"); ve.setProperty(Log4JLogChute.RUNTIME_LOG_LOG4J_LOGGER, LOGGER_NAME); ve.init(); log.info("this should follow the initialization output from velocity"); } }
Velocity模板使用的賦值及流程控制語法:
VTL:
註釋:
單行註釋的前導符爲「##」;多行註釋則採用「#*」和「*#」符號
引用:
在VTL中有3種類型的引用:變量、屬性和方法
變量引用的簡略標記是由一個前導「$」字符後跟一個VTL標識符「Identifier」組成的。一個VTL標識符必須以一個字母開始(a...z或A...Z),剩下的字符將由如下類型的字符組成:
a.字母(a...z,A...Z)
b.數字(0...9)
c.連字符("-")
d.下劃線("_")
給變量賦值有兩種方法,
經過java代碼給Context賦值,而後由Velocity引擎將Context與Template結合;
經過#set指令給變量賦值;
正式引用符(Formal Reference Notation):示例 ${purchaseMoney}this
正式引用符多用在引用變量和普通文件直接鄰近的地方
當Velocity遇到一個未賦值的引用時,會直接輸出這個引用的名字。若是但願在沒有賦值時顯示空白,則能夠使用安靜引用符(Quiet Reference Notation)繞過Velocity的常規行爲,以達到但願的效果。安靜引符的前導字符爲「$!變量名」
1.變量定義
變量名的有效字符集:
$ [ ! ][ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ][ } ]
Examples:
http://www.cnblogs.com/netcorner/archive/2008/07/11/2912125.htmlVelocity中加載vm文件的三種方式
velocitypropertiespath
Velocity中加載vm文件的三種方式:
方式一:加載classpath目錄下的vm文件
Properties p =
new
Properties();
p.put(
"file.resource.loader.class"
,
"org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"
);
Velocity.init(p);
...
Velocity.getTemplate(templateFile);
方式二:根據絕對路徑加載,vm文件置於硬盤某分區中,如:d:
//tree.vm
Properties p =
new
Properties();
p.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH,
"d://"
);
Velocity.init(p);
...
Velocity.getTemplate(
"tree.vm"
);
方式三:使用文本文件,如:velocity.properties,配置以下:
#encoding
input.encoding=UTF-
8
output.encoding=UTF-
8
contentType=text/html;charset=UTF-
8
不要指定loader.
再利用以下方式進行加載
Properties p =
new
Properties();
p.load(
this
.getClass().getResourceAsStream(
"/velocity.properties"
));
Velocity.init(p);
...
Velocity.getTemplate(templateFile);
package
com.study.volicity;
import
java.io.IOException;
import
java.io.StringWriter;
import
java.util.Properties;
import
org.apache.velocity.app.Velocity;
import
org.apache.velocity.Template;
import
org.apache.velocity.VelocityContext;
public
class
Test {
public
static
void
main(String args[])
throws
IOException {
Properties pros =
new
Properties();
pros.load(Test.
class
.getClassLoader().getResourceAsStream(
"velocity.properties"
));
Velocity.init(pros);
VelocityContext context =
new
VelocityContext();
context.put(
"name"
,
"Velocity"
);
context.put(
"project"
,
"Jakarta"
);
/* lets render a template 相對項目路徑 */
Template template = Velocity.getTemplate(
"/view/header.vm"
);
StringWriter writer =
new
StringWriter();
/* lets make our own string to render */
template.merge(context, writer);
System.out.println(writer);
}
}
package velocity; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.apache.velocity.app.VelocityEngine; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.Properties; /** * Created by 10159705 on 16-3-28. */ public class VelocityDemo { public static void main(String[] args) throws IOException { VelocityContext context = new VelocityContext(); context.put("name", "VName"); context.put("project", "JakProject"); String path = VelocityDemo.class.getResource("/velocity/").getPath();//example2.vm System.out.println(path); Properties p = new Properties(); p.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, path); Velocity.init(p); Template template = Velocity.getTemplate("example2.xml", "GBK"); Writer writer = new BufferedWriter(new FileWriter("result.xml")); template.merge(context, writer); writer.flush(); writer.close(); } }
example2.xml
<?xml version="1.0" encoding="GB2312"?><root>Hello from ${name} in the $!project project.</root>