---
# System prepended metadata

title: Free Marker 模板教學
tags: [Java, FreeMarker]

---

# Free Marker 模板教學

### 簡介
&nbsp;&nbsp;是一種以 Java 語言編寫的模板引擎，它使用一種稱為 FreeMarker Template Language (簡稱：FTL) 的專用語言來根據模板和數據生成文本輸出，如 HTML 網頁、電子郵件或程式碼。

## 實作
### 加入依賴
Free Marker Maven ：https://mvnrepository.com/artifact/org.freemarker/freemarker
``` xml=
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.34</version>
</dependency>
```

### 環境配置
application.properties
``` properties=
# 模版後綴名 默認為ftl
spring.freemarker.suffix=.ftl
# 文件編碼
spring.freemarker.charset=UTF-8
# 模版讀取的目錄位子
spring.freemarker.template-loader-path=classpath:/templates/freeMarker
```

### 建立模板
在resources/templates/freeMarker底下建置一個`檔名.ftl`的檔案，這邊範例我建置為`helloworld.ftl`
``` ftl=
<html>
<head>
  <title>index</title>
</head>
<body>
    <p>你好，${userName}</p>
</body>
</html>
```

### 建立Controller
``` Java=
@Controller
public class HelloWorld {
    @GetMapping("hello")
    public String hello(Model model) {
        model.addAttribute("userName","大帥哥");
        return "helloworld";
    }
}
```

### ftl語法補充說明
``` ftl=
<!--撰寫語法補充說明-->
${...} <!--填入值。前面有提過，POJO 物件中「get」開頭的方法，其回傳值可填入模板。-->

<#list ...></#list> <!--對集合欄位做 for each。寫法為 集合名稱 as 元素區域變數名稱。-->

?counter <!--集合元素的序數，會從 1 開始。-->

<#if ...><#else></#if> <!--條件判斷，視條件選擇要使用的 tag。-->

<#include "..."> <!--引入其他的模板，例如頁首頁尾的 Logo 圖片、公司名稱或聯絡方式等，達到重複利用。-->

?has_content <!--字串或集合是否為 null 或空值。-->
```

### 資料來源
FreeMarker官網：https://freemarker.apache.org/index.html
`Chikuwa`作者大大的【Spring Boot】整合 FreeMarker 產生 HTML 內容：https://ithelp.ithome.com.tw/m/articles/10330996

