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


前言

在現在的開發當中,代碼生成已經是必不可少的一個功能,每個公司都會有自己的一套定制的項目骨架,而實現代碼自動生成,模板引擎是必不可少的,所以在這篇博客中,將會講解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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM