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

FreeMarker 條件判斷指令 <#if> 完整使用指南與常見坑

     編輯:Java 綜合教學

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>

四、進階技巧

  1. 嵌套 if:支持多層嵌套,注意縮進可讀性,每層必須配對 ``。
  2. switch-case 替代:FreeMarker 無原生 switch,多條件用 `<#if>...<#elseif>...<#else>` 鏈或自定義方法。
  3. 在循環中判斷:
    <#list items as item>
                <#if item.isSpecial><span class="special">${item.name}</span>
                <#else>${item.name}</#if>
            </#list>
  4. 輸出 JavaScript 變量:布爾值用 `${flag?c}` 防止輸出 `true`/`false` 導致 JS 語法錯誤。

五、常見錯誤與調試

六、最佳實踐原則

  1. 模板中盡量少邏輯:複雜業務判斷在 Controller/Service 完成,模板只做「顯示/隱藏、格式化、遍歷」。
  2. 統一變量命名規範:如 `isXxx`、`hasXxx`、`canXxx` 表示布爾標誌,語義清晰。
  3. 關鍵判斷加註釋:`` 便於維護。
  4. 使用 IDE 插件:IntelliJ FreeMarker Plugin 提供語法高亮、自動補全、閉合標籤提示。

七、總結

FreeMarker `<#if>` 語法簡單但威力巨大,**閉合標籤 `` 是生命線**。掌握 `??` 空值防禦、`!default` 默認值、比較/邏輯/字串運算符、嵌套規範,配合「邏輯前置、模板純淨」原則,即可編寫健壯、可維護的模板代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤現象原因修正
漏寫閉合斜杠模板解析異常、輸出亂碼、後續內容不渲染寫成 `<#if>...` 而非 `<#if>...`**強制檢查每個 `<#if>` 必配 ``**
變量未定義拋 TemplateModelException模型中無該變量用 `??` 防禦:`<#if user??>...`
類型不匹配比較邏輯判斷錯誤數值與字串比較、日期比較需用 ?date 轉換統一類型後比較
HTML 編碼缺失XSS 風險直接輸出 `${userInput}`用 `${userInput?html}` 轉義