FreeMarker 是一款基於 Java 的模板引擎,遵循「模板 + 數據模型 = 輸出」原理,廣泛用於生成 HTML、郵件、配置文件、源代碼等文本輸出。它不依賴 Servlet 容器,可獨立運行於非 Web 環境。
樹狀結構,根節點為 Map<String, Object>,Key 必須為 String,Value 可為任意對象(List、Map、POJO、自定義指令等)。
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setDirectoryForTemplateLoading(new File("templates"));
Map<String, Object> root = new HashMap<>();
root.put("name", "張三");
root.put("random", new Random().nextInt(100));
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> m = new HashMap<>();
m.put("name", "A1"); list.add(m);
m = new HashMap<>(); m.put("name", "A2"); list.add(m);
root.put("listMap", list);
Template tpl = cfg.getTemplate("a.ftl");
Writer out = new OutputStreamWriter(System.out); // 或寫文件
tpl.process(root, out);
| 指令 | 示例 | 說明 |
|---|---|---|
| 插值 | ${name} | 輸出變量值 |
| 條件 | <#if name=="張三">...</#if> | 支持 gt/gte/lt/lte/==/!= |
| 多條件 | <#if x gte 90>...<#elseif x gte 80>...<#else>...</#if> | if-else if-else |
| 循環 | <#list listMap as m>${m.name}</#list> | 遍歷 List/Map |
| 引入 | <#include "inc.ftl"> | 引入片段模板 |
| 宏定義 | <#macro m1>...</#macro> <@m1/> | 可帶參 <#macro m2 a b>${a}-${b}</#macro> <@m2 a="1" b="2"/> |
| 嵌套 | <#macro border><table><#nested></table></#macro> <@border>內容</@border> | 包裝片段 |
| 命名空間 | <#import "b.ftl" as bb> <@bb.copyright date="2024"/> ${bb.mail} | 模塊化復用 |
| 賦值 | <#assign x=1> / <#assign x=2 in bb> | 當前/指定命名空間 |
a.ftl
你好 ${name} 歡迎學習FreeMarker
<#if name=="張三">張三</#if>
<#if random gt 60> ${random}: 及格 <#else> ${random}: 不及格 </#if>
<#if random gte 90> ${random}:優秀!
<#elseif random gte 80> ${random}:良好!
<#else> ${random}: 一般! </#if>
<#list listMap as map> <b>${map.name}</b> <br/> </#list>
<#include "index.ftl" />
<#macro m1> <b>aaabbbccc</b> <b>dddeeefff</b> </#macro> <@m1 />
<#macro m2 a b c> ${a}--${b}--${c} </#macro> <@m2 a="老高" b="老張" c="老馬" />
<#macro border> <table border=4><tr><td><#nested></td></tr></table> </#macro> <@border>表格內容!</@border>
<#import "b.ftl" as bb /> <@bb.copyright date="2010-2011" /> ${bb.mail}
<#assign mail="my@163.com" /> ${mail}
<#assign mail="my@126.com" in bb /> ${bb.mail}
b.ftl
<#macro copyright date> <p>Copyright (C) ${date} 北京尚學堂.</p> </#macro>
<#assign mail = "bjsxt@163.com">
index.ftl
<#macro copyright date> <p>Copyright (C) ${date}</p> </#macro>
<#assign mail = "bjsxt@163.com">