首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

FreeMarker 模板引擎入門指南:核心概念、優缺點與常用指令實戰

     編輯:Java 綜合教學

FreeMarker 模板引擎入門指南:核心概念、優缺點與常用指令實戰

FreeMarker 是一款基於 Java 的模板引擎,遵循「模板 + 數據模型 = 輸出」原理,廣泛用於生成 HTML、郵件、配置文件、源代碼等文本輸出。它不依賴 Servlet 容器,可獨立運行於非 Web 環境。

核心優勢

  • 徹底分離表現與邏輯:模板無 Java 腳本,僅負責數據展示;業務邏輯封裝在數據模型構建層,維護性極佳。
  • 提高開發效率:無 JSP 編譯轉換開銷,修改模板即時生效;前後端並行開發,無需等待頁面原型。

主要缺點

  • 靜態化數據過期:生成靜態頁後模板變更需重新生成,否則用戶看到舊數據。
  • 不支持集群:為了方便將 Session/Request 放入數據模型,導致集群環境下序列化失效。

數據模型

樹狀結構,根節點為 Map<String, Object>,Key 必須為 String,Value 可為任意對象(List、Map、POJO、自定義指令等)。

Java API 快速上手

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);

FTL 模板常用指令速查

指令示例說明
插值${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">
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved