實現一個程式碼自動生成(一):模板引擎Freemarker

Ching.K發表於2019-07-22

前言

在現在的開發當中,程式碼生成已經是必不可少的一個功能,每個公司都會有自己的一套定製的專案骨架,而實現程式碼自動生成,模板引擎是必不可少的,所以在這篇部落格中,將會講解freemarker在程式碼生成中所扮演的角色,以及介紹如何在Java專案中使用它!

模板引擎FreeMarker

模板引擎是什麼?

模板引擎一般指將通用程式碼和業務資料分離開來的技術,該技術有多種實現,如置換型、解釋型、編譯型,如JSP就是其中一種應用非常廣泛的模板引擎技術(其本質是一個Servlet,用來生成Html檔案)

FreeMarker是什麼?

官方文件:

FreeMarker 是一款 模板引擎: 即一種基於模板和要改變的資料, 並用來生成輸出文字(HTML網頁,電子郵件,配置檔案,原始碼等)的通用工具。 它不是面向終端使用者的,而是一個Java類庫,是一款程式設計師可以嵌入他們所開發產品的元件。
模板編寫為FreeMarker Template Language (FTL)。它是簡單的,專用的語言, 不是 像PHP那樣成熟的程式語言。 那就意味著要準備資料在真實程式語言中來顯示,比如資料庫查詢和業務運算, 之後模板顯示已經準備好的資料。在模板中,你可以專注於如何展現資料, 而在模板之外可以專注於要展示什麼資料。

簡單來講就是FreeMarker把目標文字分解成了Model、View,然後引擎自身充當了Controller,也就是常見的MVC模式。
FreeMarker通過預先定義好的模板檔案(ftl檔案),再把如Java物件中的屬性進行填充,最後輸出目標檔案。

FreeMarker如何使用?

FreeMarker不像JSP,需要繫結Servlet才能使用,在Java中我們只需要匯入對應的Jar包就可以使用了!接下來會介紹在Maven專案中如何使用FreeMarker。

加入依賴

首先我們先在pom.xml中加入FreeMarker的依賴:

<dependency>   
    <groupId>org.freemarker</groupId>    
    <artifactId>freemarker</artifactId>    
    <version>2.3.23</version>
</dependency>

建立Configuration例項

// step1 建立freemarker.template.Configuration配置例項
Configuration configuration = new Configuration(Configuration.VERSION_2_3_22);

建立資料模型

我們可以使用一個String,或者以下的型別的例項充當資料模型,在這裡使用了一個自定義的Bean

使用 java.lang.String 來構建字串。
使用 java.lang.Number 來派生數字型別。
使用 java.lang.Boolean 來構建布林值。
使用 java.util.List 或Java陣列來構建序列。
使用 java.util.Map 來構建雜湊表。
使用自定義的bean類來構建雜湊表,bean中的項和bean的屬性對應。比如, product 的 price 屬性 (getProperty())可以通過 product.price 獲取。(bean的action也可以通過這種方式拿到; 要了解更多可以參看 這裡)

//建立一個root hash物件,用來裝載資料物件
Map<String, Object> root = new HashMap<>();
//將資料物件裝載入hash中
root.put("user", new User("Joe",17));

使用到的自定義的User類

//User
public class User {  
    private String name;
    private int age;
    
    public String getName()
    {    
        return name;
    }
    public int getAge()
    {    
        return age;
    }
    
    User(String name, int age) {
    this.age = age;
    this.name = name;
    }
 }

建立一個模板檔案(.ftl檔案)

<--! demo.ftl -->
<user>
    <name>user.name</name>
    <age>user.age</age>
</user>

獲取模板

獲取之前我們建立的demo.ftl模板檔案

Template temp = cfg.getTemplate("demo.ftl");

合併模板和資料

我們在瞭解FreeMarker的開始就知道,資料模型+模板=目標輸出,在最後,我們只需要將獲取到的模板,和自定義的root hash物件進行繫結,這裡會使用到Template的process()方法;

//建立輸出流,定義輸出的檔案
File docFile = new File("demo.xml");
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
//process方法將資料與模板進行繫結,輸出到out輸出流
temp.process(root, out);

最後我們成功地新建了demo.xml檔案!

<--! demo.ftl -->
<user>
    <name>Joe</name>
    <age>17</age>
</user>

整合程式碼

// 建立freemarker.template.Configuration配置例項
Configuration configuration = new Configuration(Configuration.VERSION_2_3_22);
//建立一個root hash物件,用來裝載資料物件
Map<String, Object> root = new HashMap<>();
//將資料物件裝載入hash中
root.put("user", new User("Joe",17));
//獲取模板
Template temp = cfg.getTemplate("demo.ftl");
//建立輸出流,定義輸出的檔案
File docFile = new File("demo.xml");
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
//process方法將資料與模板進行繫結,輸出到out輸出流
temp.process(root, out);

相關文章