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