FreeMarker 是一款流行的 Java 模板引擎,廣泛用於生成文本輸出(如 HTML、郵件、代碼、配置文件等)。在項目中,我們經常需要將數據填充到預定義的模板中生成最終字符串。為了簡化這一過程,封裝一個通用的 FreeMarkerUtil 工具類是非常有必要的。本文將通過完整的代碼示例,展示如何構建並使用該工具類。
該工具類封裝了 FreeMarker 的配置初始化、模板加載與數據處理邏輯,提供靜態方法 geneFileStr 直接返回渲染後的字符串。
package pers.kangxu.datautils.utils;
import java.io.File;
import java.io.StringWriter;
import java.util.Map;
import pers.kangxu.datautils.common.Constants;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
* FreeMarker 模板工具類
* @author kangxu
*/
public class FreeMarkerUtil {
/**
* 根據模板文件和數據生成字符串
* @param fltFile 模板文件名 (如 sms.flt)
* @param templatePath 模板文件路徑 (如 src/template)
* @param datas 數據模型 Map
* @return 渲染後的字符串,失敗返回 null
*/
public static String geneFileStr(String fltFile, String templatePath, Map<String, Object> datas) {
Configuration cfg = new Configuration();
try {
// 設置模板加載目錄
cfg.setDirectoryForTemplateLoading(new File(templatePath));
// 獲取模板,指定編碼
Template template = cfg.getTemplate(fltFile, Constants.ENCODING);
template.setEncoding(Constants.ENCODING);
// 使用 StringWriter 接收輸出
StringWriter out = new StringWriter();
template.process(datas, out);
out.flush();
out.close();
return out.getBuffer().toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
模板文件採用 FreeMarker 語法,${code} 表示佔位符,將由數據模型中的 code 鍵值替換。
您的驗證碼是:${code}。請不要把驗證碼洩露給其他人。
編寫測試類驗證工具類功能,模擬生成短信驗證碼場景。
package pers.kangxu.datautils.test;
import java.util.HashMap;
import java.util.Map;
import pers.kangxu.datautils.common.verifycode.BuildVerifyCode;
import pers.kangxu.datautils.utils.FreeMarkerUtil;
public class FreeMarkerUtilTester {
public static void main(String[] args) {
Map<String, Object> datas = new HashMap<>();
// 假設 BuildVerifyCode 生成 4 位驗證碼
datas.put("code", BuildVerifyCode.generateVerifyCode(4));
// 調用工具類生成字符串
String result = FreeMarkerUtil.geneFileStr("sms.flt", "template", datas);
System.out.println(result);
}
}
控制台輸出類似如下內容,證明模板渲染成功:
您的驗證碼是:A1B2。請不要把驗證碼洩露給其他人。

通過封裝 FreeMarkerUtil,我們將模板引擎的初始化與處理細節隱藏起來,業務代碼只需關注「模板名」、「路徑」和「數據」,極大地提高了開發效率並降低了出錯概率。這種模式在生成靜態頁面、郵件通知、代碼生成器等場景中極為實用。