FreeMarker 條件判斷指令 <#if> 完整使用指南與常見坑
FreeMarker 作為老牌 Java 模板引擎,其 `<#if>` 指令是模板邏輯控制的核心。本文詳細講解語法、運算符、嵌套、空值處理、以及**最易犯的閉合標籤遺漏**錯誤。
一、基礎語法
<#if condition>
<!-- 條件為真輸出 -->
<#elseif condition2>
<!-- 多條件分支 -->
<#else>
<-- 條件均假輸出 -->
</#if> <!-- **關鍵:必須有閉合標籤,包含斜杠** -->
二、條件表達式詳解
| 類別 | 運算符/函數 | 說明 | 示例 |
| 比較 | ==, !=, >, >=, <, <= | 數值/字串/日期比較 (字串按字典序) | user.age >= 18 |
| 邏輯 | && (and), || (or), ! (not) | 短路求值 | user.active && user.age > 18 |
| 空值判斷 | ??, !default | ?? 判斷非 null/非空字串/非空集合;!default 提供默認值 | user.nickname ??, user.nickname ! "匿名" |
| 集合/序列 | ?size, ?is_empty() | 獲取長度、判斷空 | list?size > 0 |
| 字串 | ?contains("sub"), ?starts_with("pre"), ?matches("regex") | 字串包含/前綴/正則匹配 | url?starts_with("https") |
| 布爾轉換 | ?c | 布爾值轉 "true"/"false" 字串 (用於 JS 輸出) | flag?c |
三、實戰案例:保單通知函模板
<p CLASS="p2">尊敬的${appntName}${appntSex}:</p>
<P>您好!感謝您申請投XX公司的XX產品。經認真審核,本公司對您的本次申請作出以下決定:</p>
<#if letterStatus == '3'>
<P>因主險被XX人${insurName}存在${postponeReason},本次申請的所有產品暫時不予接受,${postponePeriod}後如果您仍有購買意願,請您重新申請。</p>
<#else>
<P>因${insurName}存在${declineReason},本次申請的所有不予通過。</P>
</#if>
<p>再次感謝您的支持。</p>
四、進階技巧
- 嵌套 if:支持多層嵌套,注意縮進可讀性,每層必須配對 `#if>`。
- switch-case 替代:FreeMarker 無原生 switch,多條件用 `<#if>...<#elseif>...<#else>` 鏈或自定義方法。
- 在循環中判斷:
<#list items as item>
<#if item.isSpecial><span class="special">${item.name}</span>
<#else>${item.name}</#if>
</#list>
- 輸出 JavaScript 變量:布爾值用 `
${flag?c}` 防止輸出 `true`/`false` 導致 JS 語法錯誤。
五、常見錯誤與調試
| 錯誤 | 現象 | 原因 | 修正 |
| 漏寫閉合斜杠 | 模板解析異常、輸出亂碼、後續內容不渲染 | 寫成 `<#if>...#if>` 而非 `<#if>...#if>` | **強制檢查每個 `<#if>` 必配 `#if>`** |
| 變量未定義 | 拋 TemplateModelException | 模型中無該變量 | 用 `??` 防禦:`<#if user??>...` |
| 類型不匹配比較 | 邏輯判斷錯誤 | 數值與字串比較、日期比較需用 ?date 轉換 | 統一類型後比較 |
| HTML 編碼缺失 | XSS 風險 | 直接輸出 `${userInput}` | 用 `${userInput?html}` 轉義 |
六、最佳實踐原則
- 模板中盡量少邏輯:複雜業務判斷在 Controller/Service 完成,模板只做「顯示/隱藏、格式化、遍歷」。
- 統一變量命名規範:如 `isXxx`、`hasXxx`、`canXxx` 表示布爾標誌,語義清晰。
- 關鍵判斷加註釋:`` 便於維護。
- 使用 IDE 插件:IntelliJ FreeMarker Plugin 提供語法高亮、自動補全、閉合標籤提示。
七、總結
FreeMarker `<#if>` 語法簡單但威力巨大,**閉合標籤 `#if>` 是生命線**。掌握 `??` 空值防禦、`!default` 默認值、比較/邏輯/字串運算符、嵌套規範,配合「邏輯前置、模板純淨」原則,即可編寫健壯、可維護的模板代碼。
- 上一篇文章: Spring MVC 返回 JSON 遇 406 錯誤?FastJson 配置全解析
- 下一篇文章: Java 設計模式精講:模板方法模式——定義算法骨架,延遲子類實現
Copyright ©
程式碼之家 All Rights Reserved