Spring Boot 整合 FreeMarker 例項

村雨遙發表於2021-11-30

前言

在之前的文章Spring Boot 整合 Thymeleaf中,我們學習瞭如何將模板 Thymeleaf 整合到 Spring Boot 中,那今天我們就來看看,另一個老牌的開源免費模板引擎 - FreeMarker!

FreeMarker 簡介

FreeMarker 是一款模板引擎:即一種基於模板和要改變的資料,並用來生成輸出文字(HTML網頁,電子郵件,配置檔案,原始碼等)的通用工具。 它不是面向終端使用者的,而是一個Java類庫,是一款程式設計師可以嵌入他們所開發產品的元件。

以上就是出自 FreeMarker 的官方定義,我們通過使用 FreeMarker,可以將我們所需的模板何資料渲染成 HTML,從而實現我們想要的效果。通過將模板與資料分開,讓分工更加明確,模板方面則專注於如何將資料進行展現,而在資料方面,我們就可以專注於展示何種資料,下圖就是我們以上所描述的 FreeMarker 的功能。

那接下來,我們就來看看,如何將 FreeMarker 像 Thymeleaf 一樣整合到我們的 Spring Boot 中,讓我們的開發更加簡單。

準備工作

環境準備

正式開始之前,依然給出本文所基於的環境,避免環境問題可能給大家帶來的影響。

  • JDK 17(理論上推薦不低於 1.8 版本)
  • IDEA
  • SpringBoot 2.x

新增 FreeMarker 依賴

開始之前,我們需要新增 FreeMarker 的相關依賴,同樣這裡我們可以選擇兩種方式。一種是在建立專案時就新增上,另一種則是建立專案後在專案 pom.xml 檔案中手動新增,接下來我們分別來看看兩種不同的方式應該如何新增。如果還不清楚如何建立 Spring Boot 專案,可以參照我之前的一篇文章:建立 Spring Boot 專案的 3 種方式

  1. 第一種

在使用 IDEA 建立 Spring Boot 新專案時,新增依賴時將模板引擎中的 Apache FreeMarker 勾選上。

2.第二種

如果在建立時未新增 FreeMarker 模板引擎依賴,或者在專案開始建立之初並未有此需求,但後續過程中又增加了該需求,則此時可以直接在專案 pom.xml 中手動新增 FreeMarker 依賴即可。

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

新增 FreeMarker 相關配置

新增依賴後,我們需要在專案配置檔案 application.yml 中新增 FreeMarker 的相關配置。

spring:
  freemarker:
    # 模板字尾名
    suffix: .ftl
    # 文件型別
    content-type: text/html
    # 頁面編碼
    charset: UTF-8
    # 頁面快取
    cache: false
    # 模板路徑
    template-loader-path: classpath:/templates/

編寫實體類和 Controller

編寫實體類

建立一個 User 類,並將其各種 settergetter、構造方法等完成,這裡我依然使用了 Lombok 外掛,以便簡化我們的程式碼。關於該外掛的更多用法,可以參照我之前的文章:Lombok 的安裝及使用指南

package com.cunyu.springbootfreemarkerdemo.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : zhangliang
 * @version : 1.0
 * @project : java-learning
 * @package : com.cunyu.springbootfreemarkerdemo.entity
 * @className : User
 * @createTime : 2021/11/30 21:55
 * @email : 747731461@qq.com
 * @公眾號 : 村雨遙
 * @website : https://cunyu1943.github.io
 * @description :
 */

@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int age;
    private String name;
    private String email;
}

編寫 Controller

這裡我們建立一個 User 物件,然後設定其年齡、Email、姓名等相關資訊,然後將其加到屬性中,方便傳輸到前端進行展示。

package com.cunyu.springbootfreemarkerdemo.controller;

import com.cunyu.springbootfreemarkerdemo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : zhangliang
 * @version : 1.0
 * @project : java-learning
 * @package : com.cunyu.springbootfreemarkerdemo.controller
 * @className : UserController
 * @createTime : 2021/11/30 22:04
 * @email : 747731461@qq.com
 * @公眾號 : 村雨遙
 * @website : https://cunyu1943.github.io
 * @description :
 */
@Controller
public class UserController {
    @GetMapping("/index")
    public String index(Model model) {
        User user = new User();
        user.setAge(26);
        user.setEmail("747731461@qq.com");
        user.setName("村雨遙");
        model.addAttribute("user", user);
        return "index";
    }
}

資料渲染

當完成實體類和 Controller 編寫後,我們就可以利用模板來進行展示了。我們在專案的 resources/templates 路進行新建一個 index.ftl 檔案,注意這裡檔名要保持和 Controller 中 index 方法所返回的字串一致。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>FreeMarker 實驗</title>
</head>
<body>
    <table>
        <tr>
            <td>姓名</td>
            <td>年齡</td>
            <td>Email</td>
        </tr>
        <tr>
            <td>${user.name}</td>
            <td>${user.age}</td>
            <td>${user.email}</td>
        </tr>
    </table>
</body>
</html>

測試

將我們的專案啟動起來,然後在瀏覽器中訪問如下路徑:

http://localhost:8080/index

如果顯示如下圖中的資訊,那麼就說明我們此次的整合工作順利完成!

總結

以上就是 Spring Boot 整合 FreeMarker 的具體過程了,可以結合之前的文章:Spring Boot 整合 Thymeleaf 例項共同閱讀,對比 Thymeleaf 和 FreeMarker 在整合過程中的一些共同點和不同點,相信你會有更多的收穫。

最後,關於本文案例程式碼,我已經上傳到 Github,有需要的小夥伴可以自取:傳送門

相關文章