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