溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

FreeMarker入門知識點有哪些

發布時間:2022-01-19 16:12:12 來源:億速云 閱讀:567 作者:iii 欄目:開發技術
# 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));

二、基礎語法

2.1 基本模板結構

<#-- 注釋不會輸出 -->
<html>
<head>
    <title>${title!"默認標題"}</title> <#-- 使用默認值 -->
</head>
<body>
    <#include "header.ftl"> <#-- 包含子模板 -->
    <#-- 主要內容區 -->
</body>
</html>

2.2 四種插值類型

  1. ${expression}:輸出表達式的值
  2. #{expression}:本地化數字輸出(已棄用)
  3. @{expression}:URL編碼輸出
  4. ~{expression}:不轉義輸出(慎用)

2.3 常用指令速查表

指令 說明 示例
<#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>

三、數據模型處理

3.1 數據類型詳解

<#-- 標量類型 -->
${stringVar} <#-- 字符串 -->
${numberVar?c} <#-- 數字轉字符串 -->
${booleanVar?then("Y","N")} <#-- 布爾值 -->

<#-- 容器類型 -->
${listVar[0]} <#-- 列表索引 -->
${mapVar.key} <#-- Map取值 -->
${arrayVar?first} <#-- 數組首元素 -->

3.2 空值處理策略

<#-- 安全導航操作符 -->
${user.address!.street!} <#-- 雙保險空值處理 -->

<#-- 默認值設置 -->
${user.name!"匿名用戶"}

<#-- 空值判斷 -->
<#if user??>
  用戶存在
</#if>

3.3 類型轉換方法

轉換需求 語法 示例
數字轉字符串 ?c ${num?c}
日期格式化 ?string(format) ${now?string("yyyy-MM-dd")}
字符串轉數字 ?number "123"?number
HTML轉義 ?html ${content?html}
JSON序列化 ?json ${data?json}

四、流程控制

4.1 分支結構

<#if score >= 90>
  優秀
<#elseif score >= 60>
  及格
<#else>
  不及格
</#if>

<#-- switch-case等效實現 -->
<#switch animal>
  <#case "dog">犬類<#break>
  <#case "cat">貓科<#break>
  <#default>其他動物
</#switch>

4.2 循環迭代

<#-- 基本列表遍歷 -->
<#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>

4.3 循環狀態變量

<#list items as item>
  <#-- 可通過item_has_next判斷是否最后一項 -->
  ${item}<#if !item_has_next>;</#if>
  
  <#-- 完整狀態對象 -->
  當前索引: ${item?index}
  是否是奇數行: ${item?item_cycle('odd','even')}
</#list>

五、高級特性

5.1 宏定義與調用

<#-- 定義帶參數的宏 -->
<#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 />

5.2 函數與自定義指令

// Java端實現TemplateMethodModel
public class UpperCaseMethod implements TemplateMethodModelEx {
    public Object exec(List args) {
        return args.get(0).toString().toUpperCase();
    }
}

// 模板中使用
${upper("hello")} <#-- 輸出HELLO -->

5.3 模板繼承機制

<#-- 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>

六、實戰技巧

6.1 最佳實踐

  1. 模板組織原則

    • 公共部分提取為_common.ftl
    • 按功能模塊分目錄存放
    • 命名規范:模塊名_功能.ftl
  2. 性能優化

    // 配置模板緩存
    cfg.setTemplateUpdateDelayMilliseconds(3600000); // 1小時更新檢查
    cfg.setCacheStorage(new StrongCacheStorage());
    
  3. 調試技巧

    <#-- 輸出調試信息 -->
    <#assign debug = true>
    <#if debug>
     <pre>${data?json}</pre>
    </#if>
    

6.2 常見問題解決方案

問題1:特殊字符轉義

<#-- 禁用自動轉義 -->
<#ftl output_format="plainText">
${'<script>'?no_esc} <#-- 或使用<#noescape>指令 -->

問題2:大數值精度丟失

<#-- 處理Long型ID -->
${bigNumber?string.computer} <#-- 保持完整精度 -->

問題3:日期時區問題

// Java端設置時區
cfg.setSQLDateAndTimeTimeZone(TimeZone.getDefault());

七、學習資源推薦

7.1 官方文檔

7.2 進階工具

  1. IDE插件

    • IntelliJ IDEA的FreeMarker支持
    • Eclipse的JBoss Tools插件
  2. 測試工具

    # 命令行測試
    java -jar freemarker.jar template.ftl data.json
    
  3. 可視化工具

    • FreeMarker GUI Designer

學習路徑建議:掌握基礎語法 → 理解數據模型 → 練習模板組合 → 深入宏開發 → 研究性能優化
版本注意:本文基于FreeMarker 2.3.31編寫,部分語法可能需要調整以適應不同版本 “`

注:本文實際約3200字,可根據需要擴展具體示例或補充實戰案例以達到精確字數要求。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女