[Java實戰]Spring Boot 整合 Freemarker (十一)

[Java實戰]Spring Boot 整合 Freemarker (十一)

引言

Apache FreeMarker 作為一款高性能的模板引擎,憑借其簡潔語法卓越性能靈活擴展性,在 Java Web 開發中占據重要地位。結合 Spring Boot 的自動化配置能力,開發者能快速構建動態頁面、生成報表或定制代碼。本文將系統講解整合流程、實戰技巧、性能優化方案,并針對企業級場景提供深度解決方案。

一、Freemarker 核心優勢與適用場景

1. 為什么選擇 Freemarker?

特性說明
高性能編譯型模板引擎,執行效率優于傳統 JSP
語法簡潔類似 Python 的直觀語法,學習成本低
強類型支持嚴格的類型檢查,減少運行時錯誤
多場景適用支持 HTML、XML、JSON、純文本等多種輸出格式

2. 與 Thymeleaf 對比

維度FreemarkerThymeleaf
模板類型非自然模板(需渲染后查看)自然模板(瀏覽器直接預覽)
性能更高(適合高并發場景)中等
功能擴展支持自定義指令、宏依賴方言擴展
集成復雜度簡單需額外配置布局方言

二、Spring Boot 整合 Freemarker 全流程

1. 環境準備

  • JDK 1.8+(推薦 LTS 版本)
  • Spring Boot 2.x(本文基于 2.1.8)
  • Maven/Gradle(本文使用 Maven)

2. 添加依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

3. 基礎配置(application.yml)

spring:freemarker:enabled: true                   # 啟用 Freemarkertemplate-loader-path: classpath:/templates/  # 模板路徑suffix: .ftl                    # 模板文件后綴charset: UTF-8                  # 編碼格式cache: false                    # 開發環境關閉緩存settings:                       # Freemarker 全局配置classic_compatible: true      # 兼容舊版本語法number_format: 0.##           # 數字格式化datetime_format: yyyy-MM-dd HH:mm:ss

三、Freemarker 實戰案例

案例 1:基礎數據渲染

Controller
@Controller
public class ProductController {@GetMapping("/product")public String productDetail(Model model) {Product product = new Product("iPhone 15", 7999.00, 100);model.addAttribute("product", product);model.addAttribute("discount", 0.15);return "product";}
}
模板(product.ftl)
<!DOCTYPE html>
<html>
<head><title>商品詳情</title>
</head>
<body><h1>${product.name}</h1><p>價格: ${product.price?string.currency}</p><p>庫存: <#if product.stock &gt; 0><span style="color: green;">有貨</span><#else><span style="color: red;">缺貨</span></#if></p><p>折后價: ${(product.price * (1 - discount))?string.currency}</p>
</body>
</html>

在這里插入圖片描述

案例 2:分頁功能實現

分頁工具類
public class Page<T> {private List<T> data;private int currentPage;private int totalPages;// Getter/Setter
}
分頁模板(list.ftl)
<table><#list page.data as item><tr><td>${item.name}</td></tr></#list>
</table><div class="pagination"><#if page.currentPage &gt; 1><a href="/list?page=${page.currentPage - 1}">上一頁</a></#if><span>${page.currentPage}/${page.totalPages}</span><#if page.currentPage < page.totalPages><a href="/list?page=${page.currentPage + 1}">下一頁</a></#if>
</div>

四、高階技巧與性能優化

1. 自定義指令(實現數據脫敏)

public class MaskDirective implements TemplateDirectiveModel {@Overridepublic void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) {String content = params.get("content").toString();int keepLength = Integer.parseInt(params.get("keep").toString());String masked = content.substring(0, keepLength) + "****";env.getOut().write(masked);}
}
注冊指令
@Configuration
public class FreemarkerConfig {@Beanpublic FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration() {FreeMarkerConfigurationFactoryBean config = new FreeMarkerConfigurationFactoryBean();config.setTemplateLoaderPath("classpath:/templates");Map<String, Object> variables = new HashMap<>();variables.put("mask", new MaskDirective());config.setFreemarkerVariables(variables);return config;}
}
模板中使用
<p>手機號: <@mask content="13812345678" keep=3 /></p>

2. 性能優化策略

spring:freemarker:cache: true  # 生產環境開啟緩存settings:template_update_delay: 3600  # 模板更新檢查間隔(秒)localized_lookup: false      # 關閉本地化查找提升性能

3. 集成其他模板引擎(多引擎共存)

@Configuration
public class MultiTemplateConfig {@Beanpublic ViewResolver freeMarkerViewResolver() {FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();resolver.setPrefix("");resolver.setSuffix(".ftl");resolver.setOrder(1);  # 優先級高于 Thymeleafreturn resolver;}
}

五、常見問題與解決方案

1. 模板文件未找到(404)

  • 檢查點
    • 文件是否位于 src/main/resources/templates
    • 模板名是否與 Controller 返回的視圖名一致
    • 文件后綴是否為 .ftl

2. 變量解析失敗

  • 錯誤示例Expression product.name is undefined
  • 解決
    • 確保 Controller 中通過 model.addAttribute() 添加變量
    • 檢查變量名拼寫(Freemarker 區分大小寫)
    • 使用 ?? 判空:${product.name!''}

3. 靜態資源加載問題

  • 正確引用方式
    <link href="/css/style.css" rel="stylesheet">
    <script src="/js/app.js"></script>
    
  • 確保路徑配置:靜態資源位于 src/main/resources/static

六、企業級應用擴展

1. 生成 PDF/Word 文檔

利用 Freemarker 模板生成 HTML,再通過 Flying SaucerApache POI 轉換為 PDF/Word:

Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
Template template = cfg.getTemplate("report.ftl");
String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
// 轉換為 PDF
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
renderer.layout();
renderer.createPDF(outputStream);

2. 集群環境模板熱更新

結合 Spring Cloud Config 或 Nacos 實現模板動態加載:

@Scheduled(fixedRate = 60000)  # 每分鐘檢查更新
public void reloadTemplate() {configuration.clearTemplateCache();
}

七、總結

通過 Spring Boot 整合 Freemarker,開發者能夠快速構建高效、靈活的動態頁面系統。關鍵點包括:

  1. 快速整合:依賴配置與基礎語法
  2. 高階擴展:自定義指令與多引擎共存
  3. 性能優化:緩存策略與集群方案
  4. 企業級應用:文檔生成與動態更新

擴展思考:如何結合 Freemarker 與前端框架(如 React)實現服務端渲染(SSR)?歡迎評論區交流!

附錄

  • Freemarker 官方手冊
  • Spring Boot 模板引擎配置指南

希望本教程對您有幫助,請點贊??收藏?關注支持!歡迎在評論區留言交流技術細節!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80788.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80788.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80788.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek:開啟能源領域智能化變革新時代

目錄 一、DeepSeek 與能源領域變革的邂逅1.1 DeepSeek 在人工智能領域的地位與特點1.2 能源行業面臨的挑戰與變革需求1.3 DeepSeek 在能源領域應用的重要性和意義 二、能源政策解讀與科普新助手2.1 能源政策解讀的深度變革2.2 能源科普的創新使者 三、能源項目可行性分析新利器…

uniapp設置 overflow:auto;右邊不顯示滾動條的問題

設置了overflow&#xff1a;auto;或者其它overflow的屬性不顯示滾動條是因為在uniapp中默認隱藏了滾動條 解決方法&#xff1a; //強制顯示滾動條 ::-webkit-scrollbar {width: 8px !important;background: #ccc !important;display: block !important;}//設置滾動條顏色.cu-…

hyper-v安裝ubuntu后時磁盤空間擴容

使用hyper-v創建虛擬機Ubuntu 22.04&#xff0c;直接使用的是磁盤鏡像&#xff0c;原磁盤空間只有12GB&#xff0c;明顯不夠用呀&#xff0c;現在想要擴展到50GB&#xff0c;準備開始。 1、先關閉Ubuntu&#xff0c;再hyper-v管理器中調整磁盤容量到50GB 2、進入虛擬機 3、準備…

Prometheus 的介紹與部署(入門)

一、什么是Prometheus&#xff1b; 1.介紹 Prometheus 是一個功能強大的監控工具&#xff0c;適用于各種環境。通過簡單的安裝和配置&#xff0c;可以快速實現對系統和服務的監控。無論是單機環境、容器化環境還是 Kubernetes 集群&#xff0c;Prometheus 都能提供靈活…

Angular 知識框架

一、Angular 基礎 1. Angular 簡介 Angular 是什么&#xff1f; 基于 TypeScript 的前端框架&#xff08;Google 維護&#xff09;。 適用于構建單頁應用&#xff08;SPA&#xff09;。 核心特性 組件化架構 雙向數據綁定 依賴注入&#xff08;DI&#xff09; 模塊化設計…

注解和 XML 兩種方式有什么區別?

注解和 XML 是兩種常見的配置方式&#xff08;尤其在 Java 開發中&#xff0c;如 Spring 框架&#xff09;&#xff0c;它們的主要區別體現在配置方式、代碼耦合性、可讀性、維護性等方面。以下是兩者的對比&#xff1a; 1. 配置方式 注解&#xff08;Annotation&#xff09; 在…

Python爬蟲實戰:研究攔截器,實現逆向解密

1. 案例背景與研究目標 1.1 研究背景 在數字化時代,網絡數據成為重要資源。許多網站通過加密技術保護數據傳輸,如電商平臺的價格信息常以加密形式存在。爬蟲技術與逆向工程的結合,為合法獲取和分析此類數據提供了解決方案。 1.2 研究目標 開發完整的 Python 爬蟲系統,實現…

Math工具類全面指南

Math工具類全面指南 前言一、Math 類的基礎特性1.1 類的聲明與常量1.2 數據類型支持 二、基礎算術運算2.1 絕對值運算2.2 取整運算2.2.1 floor()&#xff1a;向下取整2.2.2 ceil()&#xff1a;向上取整2.2.3 round()&#xff1a;四舍五入取整 2.3 最大值與最小值 三、三角函數與…

嵌入式C語言中指針的不同類型及其特點分析

在 C 語言中,指針的類型主要可以分為以下幾類: 1.1 基本類型指針 基本類型指針是指指向基礎數據類型的指針,通常用于存儲變量的地址。它們的類型與指向的變量類型相同。常見的基本類型指針包括: 整型指針:int *p,p是一個指向整型數據的指針。字符型指針:char *p,p是…

gd32e230c8t6 keil6工程模板

下載固件gd32e230c8t6固件官方下載&#xff08;需登錄&#xff09; 或 藍奏云 新建一個文件夾&#xff0c;把固件壓縮包里的里的Firmware和Template拖進去 keil新建gd32e230c8工程 必須勾選CMSIS-CORE 新建一個文件夾&#xff0c;雙擊任意改名 點擊manage project it…

SQL看最多的數據,但想從小到大排列看趨勢

SQL 查詢&#xff1a;從 test 表中獲取本月的數據&#xff0c;并對數量最多的前10個流程按數量升序排序 假設表結構 test 表包含請求信息。workflow_base 包含流程的基本信息。 CREATE TABLE test (requestid INT, -- 請求IDworkflowid INT, -- 流程IDcurr…

WebGL知識框架

一、WebGL 基礎概念 1. WebGL 簡介 是什么&#xff1f; 基于 OpenGL ES 的瀏覽器 3D 圖形 API&#xff0c;直接操作 GPU 渲染。 核心特點 底層、高性能、需手動控制渲染管線。 依賴 JavaScript 和 GLSL&#xff08;著色器語言&#xff09;。 與 Three.js 的關系 Three.js…

LabVIEW電渦流傳感器自動校準系統

在工業生產中&#xff0c;尤其是大型旋轉機械的運行監測環節&#xff0c;電渦流傳感器的精準校準極為關鍵。傳統手動校準方式存在諸多弊端&#xff0c;如人工參與度高、操作重復、效率低下等&#xff0c;難以滿足現代工業快速發展的需求。基于 LabVIEW 開發的電渦流傳感器自動校…

HCIP-BGP綜合實驗

一&#xff1a;拓撲圖 二&#xff1a;需求分析 1&#xff0c;AS1存在兩個環回&#xff0c;一個地址為192.168.1.0/24該地址不能在任何協議中宣告&#xff0c;AS3中存在倆個環回&#xff0c;一個地址為192.168.2.0/24該地址不能在任何協議中宣告&#xff0c;最終要求這兩個環回…

嵌入式STM32學習——繼電器

繼電器模塊引腳說明 VCC&#xff08;&#xff09;&#xff1a; 供電正極。連接此引腳到電源&#xff08;通常是直流電源&#xff09;&#xff0c;以提供繼電器線圈所需的電流。 GND&#xff08;-&#xff09;&#xff1a; 地。連接此引腳到電源的負極或地。 IN&#xff08;或…

03_樸素貝葉斯分類

描述 樸素貝葉斯分類器與線性模型非常相似的一種分類器&#xff0c;但它的訓練速度往往更快。這種高效率所付出的代價是&#xff0c;樸素貝葉斯模型的泛化能力要比線性分類器&#xff08;如LogisticRegression 和 LinearSVC&#xff09;稍差。 樸素貝葉斯模型高效的原因&…

Cabot:開源免費的 PagerDuty 替代品,讓系統監控更簡單高效

在當今復雜的IT環境中,及時發現并解決系統問題至關重要。而Cabot作為一款開源免費的監控工具,為開發和運維團隊提供了強大而簡單的解決方案。本文將詳細介紹Cabot的核心功能、優勢以及快速部署方法,幫助你更好地保障系統穩定性。 Cabot簡介 Cabot是一個功能類似PagerDuty的開…

AI-02a5a5.神經網絡-與學習相關的技巧-權重初始值

權重的初始值 在神經網絡的學習中&#xff0c;權重的初始值特別重要。實際上&#xff0c;設定什么樣的權重初始值&#xff0c;經常關系到神經網絡的學習能否成功。 不要將權重初始值設為 0 權值衰減&#xff08;weight decay&#xff09;&#xff1a;抑制過擬合、提高泛化能…

TCP首部格式及三次握手四次揮手

TCP協議詳解&#xff1a;首部格式與連接管理 一、TCP首部格式 TCP首部最小20字節&#xff0c;最大60字節&#xff0c;包含以下字段&#xff1a; | 源端口號(16bit) | 目的端口號(16bit) | | 序列號(32bit) | | 確認號(32bit) | | 數據偏移(4bit)| 保留(6bit) |U|A|P|R|S|…

Pytorch的Dataloader使用詳解

PyTorch 的 DataLoader 是數據加載的核心組件&#xff0c;它能高效地批量加載數據并進行預處理。 Pytorch DataLoader基礎概念 DataLoader基礎概念 DataLoader是PyTorch基礎概念 DataLoader是PyTorch中用于加載數據的工具&#xff0c;它可以&#xff1a;批量加載數據&#xf…