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

Java 模板引擎 FreeMarker 核心架構與核心概念速覽

     編輯:Java 相關知識

什麼是 FreeMarker?

FreeMarker 是一個**模板引擎**,基於模板生成文本輸出的通用工具,純 Java 實現。最初設計用於生成 HTML 頁面,特別適合 MVC 架構的 Web 應用。

核心設計理念

  • 關注點分離: Java 程序負責業務邏輯、數據準備;FreeMarker 負責展示邏輯、頁面渲染。
  • 非侵入式: 不依賴 Servlet、HTTP 或 Web 容器,可用於非 Web 環境(如生成配置文件、郵件、代碼)。
  • 模板語言(FTL): 提供條件、循環、賦值、宏、函數等指令,但刻意限制編程能力,避免模板過度複雜。

核心組件

組件角色
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(); // 發送給瀏覽器或保存文件
}

模板語法速覽 (FTL)

  • 插值: ${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>

為什麼選擇 FreeMarker?

  • 成熟穩定(20 年歷史),Spring Boot 默認支持。
  • 模板編譯緩存,生產環境性能優異。
  • 強大的國際化(i18n)與本地化(l10n)支持。
  • 靈活的異常處理與調試機制。

常見誤區

  1. 在模板中寫複雜業務邏輯 → 應移至 Java 控制器/服務層。
  2. 忽略 XSS 防護 → 輸出用戶輸入時務必使用 ?html 或全局 html_escape 共享變量。
  3. 配置不當導致模板頻繁重新解析 → 生產環境設置 update_delay 為較大值(如 3600s)或 0(開發模式)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved