FreeMarker動態模板
目錄- FreeMarker動態模板
- 前言
- 準備作業
- FreeMarker
- 代碼構建
- 專案結構
- 創建 Configuration 實體
- 呼叫
- 模板檔案
- 呼叫結果
- Tips
前言
當我們開發功能時,不僅要考慮當前,也要考慮之后的迭代.
對于郵件正文內容,有時候需要配置HTML格式,所以選擇了FreeMarker
準備作業
- FreeMarker的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- 其余Spring相關依賴
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
FreeMarker
官方檔案 http://freemarker.foofun.cn/
最簡單的模板通常是普通的HTML檔案,當然也可以用來寫word,pdf之類
對于FreeMarker的模板語言,和動態sql有些相似既然是動態模板,那么是要傳入資料的
http://freemarker.foofun.cn/dgui_datamodel_types.html
常用的傳參型別有List,Map,自定義物件 在上方的官方檔案中你可以查看支持的全部型別
代碼構建
專案結構

創建 Configuration 實體
參考官方檔案中步驟 http://freemarker.foofun.cn/pgui_quickstart.html
package com.lizi.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import javax.annotation.PostConstruct;
import java.util.Locale;
/**
* @author lizi
* @description FreeMarkerUtil
* @date 2022/01/01
*/
@Component
@Slf4j
public class FreeMarkerUtil {
private static Configuration configuration = null;
@PostConstruct
public void init() {
if (null == configuration) {
// 設定版本號
configuration = new Configuration(Configuration.VERSION_2_3_23);
// ”/template“為模板檔案來源
configuration.setClassForTemplateLoading(FreeMarkerTemplateUtils.class, "/template");
// 設定編碼格式
configuration.setEncoding(Locale.CHINA, "UTF-8");
}
}
/**
* @param file template檔案路徑
* @param data 資料
* @return String
*/
public static String getResult(String file, Object data) {
String result = "";
try {
// 獲取通用模板
Template template = configuration.getTemplate(file);
// 通過模板創建動態資料
result = FreeMarkerTemplateUtils.processTemplateIntoString(template, data);
} catch (Exception e) {
log.error("processTemplateIntoString error : {} ", e.getMessage());
}
return result;
}
}
呼叫
package com.lizi.controller;
import com.lizi.Entity.Pokemon;
import com.lizi.util.FreeMarkerUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* @author lizi
* @description FreeMarkerController
* @date 2022/01/01
*/
@RestController
public class FreeMarkerController {
@PostMapping("/getTemplate")
public String getTemplate() {
// 創建資料模型
Map<String, Object> dataMap = new HashMap<>(16);
Map<String, Object> map = new HashMap<>(16);
map.put("珍珠", "pearl");
map.put("鉆石", "diamond");
Pokemon pokemon=new Pokemon();
pokemon.setName("ground_dragon");
pokemon.setRace("108,130,95,80,85,102");
dataMap.put("strong",pokemon);
dataMap.put("pokemon", map);
dataMap.put("ground_dragon","108,130,95,80,85,102");
return FreeMarkerUtil.getResult("template.ftl", dataMap);
}
}
模板檔案
對于模板語言,可以更多的去參考官方檔案,
<html>
<#-- 傳入型別是Map ${ground_dragon} 表示對Map.get("ground_dragon") -->
<td>${ground_dragon}</td>
<#-- 我傳入的型別是Map 這里pokemon 表示Map.get("pokemon")之后獲取的value 代碼中也是一個Map -->
<#if pokemon?exists>
<#-- list,表示遍歷 -->
<#list pokemon?keys as key>
<tr>
<td>${key}</td>
<td>${pokemon[key]}</td>
</tr>
</#list>
</#if>
<#-- Map.get("strong") 是一個自定義類 訪問屬性可以直接用.的方式獲取 -->
<td>${strong.name}</td>
<td>${strong.race}</td>
</body>
</html>
呼叫結果
<html>
<td>108,130,95,80,85,102</td>
<tr>
<td>鉆石</td>
<td>diamond</td>
</tr>
<tr>
<td>珍珠</td>
<td>pearl</td>
</tr>
<td>ground_dragon</td>
<td>108,130,95,80,85,102</td>
</body>
</html>
Tips
- 對于傳入的資料模型,需要用Map做一層包裝,不然會出錯
- 如果物件可能不存在,需要做一層判斷,不然會出錯
本文來自博客園,作者:貍子橘花茶,轉載請注明原文鏈接:https://www.cnblogs.com/yusishi/p/15935281.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/441925.html
標籤:其他
上一篇:【JavaWeb-Servlet】筆記(2)--- Http狀態碼;多個Servlet之間呼叫規則;重定向解決方案;請求轉發解決方案
