Version: Next

Freemarker模板引擎

官方文档

SpringBoot整合Freemarker

  • Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
  • application.yaml
    • 配置缓存
    • 配置前端页面文件后缀名
    • 配置编码
    • 配置前端页面在SpringBoot项目中的路径
spring:
freemarker:
cache: false # 缓存配置 开发阶段应该配置为false 因为经常会改
suffix: .html # 模版后缀名 默认为ftl / 还是用ftl吧,html没freemarker语法提示
charset: UTF-8 # 文件编码
template-loader-path: classpath:/templates/

测试

  • pojo

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
    private String username;
    private int age;
    private String sex;
    }
  • Controller

    @RequestMapping("/t2")
    public String test2(Model model) {
    //classpath:/templates/test.html
    List<User> users = new ArrayList<>();
    users.add(new User("名字1",18,"男"));
    users.add(new User("名字2",28,"女"));
    users.add(new User("名字3",18,"男"));
    model.addAttribute("users", users);
    return "testFreemarker";
    }
  • testFreemarker.ftl

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>测试freemarker</title>
    </head>
    <body>
    <table class="">
    <tr>
    <td>作者</td>
    <td>教程名称</td>
    <td>内容</td>
    </tr>
    <#list users as u>
    <tr>
    <td>${u.username}</td>
    <td>${u.age}</td>
    <td>${u.sex}</td>
    </tr>
    </#list>
    </table>
    </body>
    </html>

Freemarker语法简介

${}

Freemarker将会输出真实内容来替换大括号内的表达式,这样的表达方式被称为插值

FTL标签 <#...>

与HTML标签有一些相似之处,但是他们是Freemarker指令,不会在输出中打印。FTL标签以#开头

注释 <!-- -->

与HTML的注释相同

?? (isExist方法)

使用??询问一个变量是否存在,相当于isExist方法

如果存在user,则打印欢迎信息

<#if user??><h1>Welcome ${user}!</h1></#if>

基本指令

if指令

  • if决定部分内容是否呈现
<h1>
Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if>!
</h1>
  • if、elif、else
<#if animals.python.price < animals.elephant.price>
Pythons are cheaper than elephants today.
<#elseif animals.elephant.price < animals.python.price>
Elephants are cheaper than pythons today.
<#else>
Elephants and pythons cost the same today.
</#if>

list指令

  • 基本用法

    <tr>
    <td>作者</td>
    <td>教程名称</td>
    <td>内容</td>
    </tr>
    <#list users as u>
    <tr>
    <td>${u.username}</td>
    <td>${u.age}</td>
    <td>${u.sex}</td>
    </tr>
    </#list>
  • 如果集合内元素数量为0,避免输出无效的html标签,可以用items指令

    <#list misc.fruits>
    <ul>
    <#items as fruit>
    <li>${fruit}
    </#items>
    </ul>
    </#list>
  • 行内遍历时,用sep指令指定分隔符

    <p>Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, </#sep></#list>
    <!-- 输出 -->
    <p>Fruits: orange, banana
  • 指定分隔符时,如果集合元素为零,那么设置不显示分隔符,else修饰的部分,只有当元素个数为0时才执行

    <p>Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, <#else>None</#list>
  • 分隔符的简写方式,类似三目运算符

    <p>Fruits: ${fruits?join(", ", "None")}
  • 联合使用listitemssepelse

    <#list misc.fruits>
    <p>Fruits:
    <ul>
    <#items as fruit>
    <li>${fruit}<#sep> and</#sep>
    </#items>
    </ul>
    <#else>
    <p>We have no fruits.
    </#list>

include指令

例如,单独写一个版权信息页面copyright_footer.html,在所有页面的最下面插入它来显示版权信息

<hr>
<i>
Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>,
<br>
All Rights Reserved.
</i>

使用include指令插入版权信息页脚

<html>
<head>
<title>Test page</title>
</head>
<body>
<h1>Test page</h1>
<p>Blah blah...
<#include "/copyright_footer.html">
</body>
</html>

内建函数

image-20200429131233579