FreeMarker 是一個**模板引擎**,基於模板生成文本輸出的通用工具,純 Java 實現。最初設計用於生成 HTML 頁面,特別適合 MVC 架構的 Web 應用。
| 組件 | 角色 |
|---|---|
| Configuration | 全局配置單例:模板加載路徑、編碼、共享變量、緩存策略 |
| Template | 已解析的模板對象,關聯一個 Configuration,線程安全可復用 |
| Environment | 模板執行上下文:數據模型、輸出流、運行時設置、錯誤處理 |
| Data Model | 數據容器:Root 變量、共享變量、內建變量(如 .now、.locale) |
// 1. 初始化 Configuration(應用啟動時一次)
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setDirectoryForTemplateLoading(new File("/templates"));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
// 2. 獲取模板
Template template = cfg.getTemplate("user_profile.ftl");
// 3. 準備數據模型
Map<String, Object> model = new HashMap<>();
model.put("user", userService.getById(123));
model.put("permissions", authService.getPermissions());
// 4. 渲染輸出
try (StringWriter out = new StringWriter()) {
template.process(model, out);
String html = out.toString(); // 發送給瀏覽器或保存文件
}
${user.name}、${user.age?string("0")}(內建函數格式化)<#if user.vip>...<#else>...</#if><#list orders as order>${order.id}</#list><#macro renderButton label>...</#macro>、<@renderButton "提交" /><#include "header.ftl">、<#import "lib.ftl" as lib>?html 或全局 html_escape 共享變量。update_delay 為較大值(如 3600s)或 0(開發模式)。