SpringBoot集成Freemarker并使用layout模板

大家早上好鸭,今天又是周一了,大家的周一综合症有没有犯呢,一起来摸鱼吧(手动狗头)

本文章最先发布于我的个人博客,简书为同步发布,如有需要,可以访问腿短快跑的个人博客获取更多内容

Freemarker简介

FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

Freemarker和Thymeleaf对比

Freemarker和Thymeleaf都是一种模板渲染引擎,两者各有优缺点

Freemarker

  • 用Java语言编写的模板引擎,它基于模板来生成文本输出
  • 与Web容器无关,即在运行时,它并不知道Servlet或HTTP
  • 不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等

优点

  1. 不能编写java代码,可以实现严格的mvc分离
  2. 性能不错
  3. 内置大量常用功能,使用非常方便
  4. 支持表达式语言
  5. 支持宏定义(类似jsp标签)
  6. 类似于jsp,学习成本低,符合以前使用jsp的习惯

缺点

  1. 不是官方标准
  2. 使用</>这样的语法,就无法直接使浏览器渲染出原本页面的样子

Thymeleaf

  • 是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用。
  • 主要目标是提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。
  • 可扩展性非常棒:可以使用它定义自己的模板属性集合,这样就可以计算自定义表达式并使用自定义逻辑。

优点

  1. 使用了标签属性做为语法,模版页面直接用浏览器渲染,浏览器可以直接打开模板文件,使得前端和后端可以并行开发
  2. 适合做服务器端渲染,通过服务器端模版渲染,客户端收到的是在服务器端根据模版渲染后的html信息
  3. 可以支持前段浏览器渲染
  4. 可以作为模板引擎框架
  5. springboot官方推荐方案

缺点

  1. 模板必须符合xml规范。js脚本必须加入<![CDATA[]]>标识,否则一个&符号就会导致后台模板合成抛异常
  2. 错误信息不友好

为什么选择Freemarker

上面我们对别了 Freemarker 和 Thymeleaf 的优缺点,其实在项目的最开始,我一直是使用 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 模板,每个文件只需要引入模板即可达到效果

创建公用组件

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>

创建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>

创建页面

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容