# FreeMarker入門知識點有哪些
## 一、FreeMarker概述
### 1.1 什么是FreeMarker
FreeMarker是一款基于Java的**模板引擎**,主要用于生成文本輸出(如HTML網頁、電子郵件、配置文件等)。它通過將模板文件與數據模型結合,動態生成內容,實現了**表現層與業務邏輯的分離**。
### 1.2 核心特點
- **輕量級**:不依賴Servlet容器,可獨立運行
- **模板+數據模型**:采用MVC設計模式
- **強類型語言**:支持嚴格的數據類型檢查
- **國際化支持**:內置本地化處理機制
- **擴展性強**:支持自定義指令和函數
### 1.3 典型應用場景
```java
// Java代碼集成示例
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setDirectoryForTemplateLoading(new File("/templates"));
Template template = cfg.getTemplate("test.ftl");
Map<String, Object> data = new HashMap<>();
data.put("user", "John");
template.process(data, new PrintWriter(System.out));
<#-- 注釋不會輸出 -->
<html>
<head>
<title>${title!"默認標題"}</title> <#-- 使用默認值 -->
</head>
<body>
<#include "header.ftl"> <#-- 包含子模板 -->
<#-- 主要內容區 -->
</body>
</html>
指令 | 說明 | 示例 |
---|---|---|
<#if> |
條件判斷 | <#if x > 0>Positive</#if> |
<#list> |
循環遍歷 | <#list items as item>${item}</#list> |
<#assign> |
定義變量 | <#assign x = 10> |
<#macro> |
定義宏 | <#macro greet>Hello!</#macro> |
<#import> |
導入命名空間 | <#import "/libs/mylib.ftl" as my> |
<#-- 標量類型 -->
${stringVar} <#-- 字符串 -->
${numberVar?c} <#-- 數字轉字符串 -->
${booleanVar?then("Y","N")} <#-- 布爾值 -->
<#-- 容器類型 -->
${listVar[0]} <#-- 列表索引 -->
${mapVar.key} <#-- Map取值 -->
${arrayVar?first} <#-- 數組首元素 -->
<#-- 安全導航操作符 -->
${user.address!.street!} <#-- 雙保險空值處理 -->
<#-- 默認值設置 -->
${user.name!"匿名用戶"}
<#-- 空值判斷 -->
<#if user??>
用戶存在
</#if>
轉換需求 | 語法 | 示例 |
---|---|---|
數字轉字符串 | ?c |
${num?c} |
日期格式化 | ?string(format) |
${now?string("yyyy-MM-dd")} |
字符串轉數字 | ?number |
"123"?number |
HTML轉義 | ?html |
${content?html} |
JSON序列化 | ?json |
${data?json} |
<#if score >= 90>
優秀
<#elseif score >= 60>
及格
<#else>
不及格
</#if>
<#-- switch-case等效實現 -->
<#switch animal>
<#case "dog">犬類<#break>
<#case "cat">貓科<#break>
<#default>其他動物
</#switch>
<#-- 基本列表遍歷 -->
<#list users as user>
${user_index + 1}. ${user.name} <#-- _index內置變量 -->
</#list>
<#-- 使用分頁參數 -->
<#list 1..100 as n>
${n}<#if n?is_even>, </#if>
<#if n % 10 == 0><br></#if>
</#list>
<#-- 哈希表遍歷 -->
<#list map?keys as key>
${key}: ${map[key]}
</#list>
<#list items as item>
<#-- 可通過item_has_next判斷是否最后一項 -->
${item}<#if !item_has_next>;</#if>
<#-- 完整狀態對象 -->
當前索引: ${item?index}
是否是奇數行: ${item?item_cycle('odd','even')}
</#list>
<#-- 定義帶參數的宏 -->
<#macro pagination totalPages currentPage>
<div class="pagination">
<#list 1..totalPages as page>
<a href="?page=${page}"
class="${(page == currentPage)?then('active','')}">
${page}
</a>
</#list>
</div>
</#macro>
<#-- 調用宏 -->
<@pagination totalPages=10 currentPage=3 />
// Java端實現TemplateMethodModel
public class UpperCaseMethod implements TemplateMethodModelEx {
public Object exec(List args) {
return args.get(0).toString().toUpperCase();
}
}
// 模板中使用
${upper("hello")} <#-- 輸出HELLO -->
<#-- base.ftl 父模板 -->
<html>
<head><title><#block title>默認標題</#block></title></head>
<body>
<#block content>默認內容</#block>
</body>
</html>
<#-- child.ftl 子模板 -->
<#import "base.ftl" as layout>
<@layout>
<#block title>子頁面標題</#block>
<#block content>
子頁面特有內容
</#block>
</@layout>
模板組織原則:
_common.ftl
模塊名_功能.ftl
性能優化:
// 配置模板緩存
cfg.setTemplateUpdateDelayMilliseconds(3600000); // 1小時更新檢查
cfg.setCacheStorage(new StrongCacheStorage());
調試技巧:
<#-- 輸出調試信息 -->
<#assign debug = true>
<#if debug>
<pre>${data?json}</pre>
</#if>
問題1:特殊字符轉義
<#-- 禁用自動轉義 -->
<#ftl output_format="plainText">
${'<script>'?no_esc} <#-- 或使用<#noescape>指令 -->
問題2:大數值精度丟失
<#-- 處理Long型ID -->
${bigNumber?string.computer} <#-- 保持完整精度 -->
問題3:日期時區問題
// Java端設置時區
cfg.setSQLDateAndTimeTimeZone(TimeZone.getDefault());
IDE插件:
測試工具:
# 命令行測試
java -jar freemarker.jar template.ftl data.json
可視化工具:
學習路徑建議:掌握基礎語法 → 理解數據模型 → 練習模板組合 → 深入宏開發 → 研究性能優化
版本注意:本文基于FreeMarker 2.3.31編寫,部分語法可能需要調整以適應不同版本 “`
注:本文實際約3200字,可根據需要擴展具體示例或補充實戰案例以達到精確字數要求。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。