SpringBoot集成Freemarker并使用layout模板

大家早上好鴨,今天又是周一了前酿,大家的周一綜合癥有沒有犯呢贼急,一起來摸魚吧(手動狗頭)

本文章最先發(fā)布于我的個人博客茅茂,簡書為同步發(fā)布,如有需要太抓,可以訪問腿短快跑的個人博客獲取更多內容

Freemarker簡介

FreeMarker 是一款 模板引擎: 即一種基于模板和要改變的數據空闲, 并用來生成輸出文本(HTML網頁,電子郵件走敌,配置文件碴倾,源代碼等)的通用工具。 它不是面向最終用戶的,而是一個Java類庫跌榔,是一款程序員可以嵌入他們所開發(fā)產品的組件异雁。

Freemarker和Thymeleaf對比

Freemarker和Thymeleaf都是一種模板渲染引擎,兩者各有優(yōu)缺點

Freemarker

  • 用Java語言編寫的模板引擎僧须,它基于模板來生成文本輸出
  • 與Web容器無關纲刀,即在運行時,它并不知道Servlet或HTTP
  • 不僅可以用作表現層的實現技術担平,而且還可以用于生成XML示绊,JSP或Java 等

優(yōu)點

  1. 不能編寫java代碼,可以實現嚴格的mvc分離
  2. 性能不錯
  3. 內置大量常用功能暂论,使用非常方便
  4. 支持表達式語言
  5. 支持宏定義(類似jsp標簽)
  6. 類似于jsp面褐,學習成本低,符合以前使用jsp的習慣

缺點

  1. 不是官方標準
  2. 使用</>這樣的語法取胎,就無法直接使瀏覽器渲染出原本頁面的樣子

Thymeleaf

  • 是個XML/XHTML/HTML5模板引擎盆耽,可以用于Web與非Web應用。
  • 主要目標是提供一種可被瀏覽器正確顯示的扼菠、格式良好的模板創(chuàng)建方式摄杂,因此也可以用作靜態(tài)建模。
  • 可擴展性非常棒:可以使用它定義自己的模板屬性集合循榆,這樣就可以計算自定義表達式并使用自定義邏輯析恢。

優(yōu)點

  1. 使用了標簽屬性做為語法,模版頁面直接用瀏覽器渲染秧饮,瀏覽器可以直接打開模板文件映挂,使得前端和后端可以并行開發(fā)
  2. 適合做服務器端渲染,通過服務器端模版渲染盗尸,客戶端收到的是在服務器端根據模版渲染后的html信息
  3. 可以支持前段瀏覽器渲染
  4. 可以作為模板引擎框架
  5. springboot官方推薦方案

缺點

  1. 模板必須符合xml規(guī)范柑船。js腳本必須加入<![CDATA[]]>標識,否則一個&符號就會導致后臺模板合成拋異常
  2. 錯誤信息不友好

為什么選擇Freemarker

上面我們對別了 Freemarker 和 Thymeleaf 的優(yōu)缺點泼各,其實在項目的最開始鞍时,我一直是使用 Thymeleaf 作為模板渲染引擎的,但是最近要用到 layout 模板功能扣蜻,Thymeleaf支持并不是很好逆巍,在網上也參考了很多博客的內容,但是沒有實現很完美的莽使,因此考慮到了使用 Freemarker

集成Freemarker

引入依賴

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

項目配置

spring:
  freemarker:
    # 請求重寫
    allow-request-override: false
    # session重寫
    allow-session-override: false
    # 緩存模板
    cache: false
    # 模板編碼
    charset: UTF-8
    check-template-location: true
    # 類型
    content-type: text/html
    expose-request-attributes: false
    expose-session-attributes: false
    # 模板后綴名
    suffix: .ftl
    # 模板目錄
    template-loader-path: classpath:/templates/

前端代碼

templates/index.ftl

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
    <div>大家好锐极,我是 ${name}</div>
</body>
</html>

后端代碼

IndexController.java

/**
 * @author C.W
 * @date 2022/5/10 15:28
 * @desc
 */
@Controller
public class IndexController {

    @GetMapping("/")
    public String index(Model model) throws IOException {
        model.addAttribute("name", "腿短快跑");
        return "index";
    }

}

效果展示

訪問 http://IP地址:端口/

image.png

可以看到,頁面正常展示芳肌,并且已經將數據渲染成功

layout 模板功能

為什么需要layout

對于一個網站來說灵再,基本的框架結構在每個頁面都是相似的肋层,如果框架結構在每個文件中都重寫一遍,重復工作量很大翎迁,且當需要修改框架模板時槽驶,每個文件都需要修改,重復且容易出錯

使用 layout 模板鸳兽,每個文件只需要引入模板即可達到效果

創(chuàng)建公用組件

templates/components/header.ftl

<div style="background-color: green; color: white">
    這是頭部
</div>

templates/components/footer.ftl

<div style="background-color: blue; color: white">
    這是尾部, @CopyRight 腿短快跑
</div>

創(chuàng)建layout布局

templates/layout.ftl

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<#macro css>
    <#nested>
</#macro>
<body>
    <!-- 引入header -->
    <#include "components/header.ftl">
    <!-- 布局  -->
    <#macro layout>
        <#nested>
    </#macro>
    <!-- 引入footer -->
    <#include "components/footer.ftl">
</body>
<#macro js>
    <#nested>
</#macro>
</html>

創(chuàng)建頁面

templates/index/index.ftl

<#include "../layout.ftl">

<@css>
    <style>
        .div {
            background-color: yellow;
        }
    </style>
</@css>

<@layout>
    <div class="div">
        大家好,我是 ${name}
    </div>
</@layout>

<@js>
    <script>
        alert('這是js')
    </script>
</@js>

頁面控制器

IndexController.java

/**
 * @author C.W
 * @date 2022/5/17 11:25
 * @desc 首頁
 */
@Controller
public class IndexController {

    @GetMapping("/")
    public String index(Model model) {
        model.addAttribute("name", "腿短快跑");
        return "index/index";
    }

}

結果展示

image.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末罕拂,一起剝皮案震驚了整個濱河市揍异,隨后出現的幾起案子,更是在濱河造成了極大的恐慌爆班,老刑警劉巖衷掷,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異柿菩,居然都是意外死亡戚嗅,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門枢舶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懦胞,“玉大人,你說我怎么就攤上這事凉泄□镂荆” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵后众,是天一觀的道長胀糜。 經常有香客問我,道長蒂誉,這世上最難降的妖魔是什么教藻? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮右锨,結果婚禮上括堤,老公的妹妹穿的比我還像新娘。我一直安慰自己绍移,他們只是感情好痊臭,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著登夫,像睡著了一般广匙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恼策,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天鸦致,我揣著相機與錄音潮剪,去河邊找鬼。 笑死分唾,一個胖子當著我的面吹牛抗碰,可吹牛的內容都是我干的。 我是一名探鬼主播绽乔,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弧蝇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了折砸?” 一聲冷哼從身側響起看疗,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睦授,沒想到半個月后两芳,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡去枷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年怖辆,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片删顶。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡竖螃,死狀恐怖,靈堂內的尸體忽然破棺而出逗余,到底是詐尸還是另有隱情斑鼻,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布猎荠,位于F島的核電站坚弱,受9級特大地震影響,放射性物質發(fā)生泄漏关摇。R本人自食惡果不足惜荒叶,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望输虱。 院中可真熱鬧些楣,春花似錦、人聲如沸宪睹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亭病。三九已至鹅很,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罪帖,已是汗流浹背促煮。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工邮屁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菠齿。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓佑吝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绳匀。 傳聞我的和親對象是個殘疾皇子芋忿,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容