java模板引擎:velocity

超頻化石魚發表於2018-12-05

在java中,同型別的模組程式碼結構往往是相似的。以Spring為例,一個工程都會包含controller,service,dao,modal等型別的程式碼。而dao用於資料庫的訪問,不同的表所對應的dao類都會有get,set,select,delete等操作,若手動編寫dao,則這些dao有很多程式碼是類似的。於是希望自動生成這部分程式碼
一個非常直觀的思路就是:寫一個String模板,然後使用字串替換的方式,將該模板中的某些預留字串替換為具體值。這樣就得到了目標檔案的內容。然後將這個替換後的String寫入到目標檔案中即可。
velocity的功能就是讀入一個模板,然後執行替換操作,從而生成目標String。

引入velocity

<!--velocity模板引擎依賴-->
<dependency>
	<groupId>org.apache.velocity</groupId>
	<artifactId>velocity</artifactId>
	<version>1.7</version>
</dependency>

編寫一個模板檔案

模板檔案使用vm檔案。在main/resources/下建立一個vm資料夾,然後在下面新增一個controller.java.vm檔案:

package ${package}.controller;

public class ${className}Controller {
    public void get${Object}() {
    }
    public void set${Object}() {
    }
}

其中使用${}包裹的內容為變數,在後面會被替換。未被包裹的內容維持不變,包括空格,Tab和換行。

使用

首先需要定義並初始化VelocityEngine:

VelocityEngine ve = new VelocityEngine();
// 設定資源路徑
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
// 初始化
ve.init();

然後將模板載入到一個Template物件中:

// 載入模板
Template t = ve.getTemplate("vm/controller.java.vm");

使用VelocityContext定義替換的規則:

VelocityContext ctx = new VelocityContext();
ctx.put("package", "com.spring.template");
ctx.put("className", "test");
ctx.put("Object", "Value");

VelocityContext也可以直接接收一個Map物件:

Map contextMap = new HashMap();
contextMap.put("package", "com.spring.template");
contextMap.put("className", "test");
contextMap.put("Object", "Value");
VelocityContext ctx = new VelocityContext(contextMap);

定義一個StringWriter來儲存合併後的結果:

StringWriter sw = new StringWriter();
t.merge(ctx, sw);
String r = sw.toString();

執行該程式碼,最終生成結果為:

package com.spring.template.controller;

@Mapper
public interface testController {
    public void getValue() {
    }
    public void setValue() {
    }
}

關於資料庫自動生成

類似MyBatis那樣,從資料庫直接對映出對應的Dao,xml與model類。
關鍵點在於需要使用select語句查詢出指定表的結構。有了表結構,就可以動態生成增刪改查的sql語句,同樣也可以使用vm來動態生成model類。
vm僅僅作為模板,替換模板中的變數後,生成的內容可以寫到各種型別的檔案中,例如.java,.xml,.properties等。

相關文章