FreeMarker简介

FreeMarker是一款模板引擎:即基于模板和数据源生成输出文本(html网页,配置文件,电子邮件,源代码)的通用工具。它是一个java类库。

FreeMarker最初被设计用来在MVC模式的Web开发框架中生成HTML页面,它没有被绑定到Servlet或HTML或任意Web相关的东西上。也可以用于非Web应用环境中。

模板编写使用FreeMarker Template Language(FTL)。使用方式类似JSP的EL表达式。模板中专注于如何展示数据,模板之外可以专注于要展示什么数据。

freemarker

官网显示的使用图解:

freemarker

当然,在非HTML场景下的模板使用也可以用如下图进行解释:

FreeMarker的特性

FreeMarker是基于Java的模板引擎,最初专注于使用MVC软件体系结构进行动态网页生成。使用Freemarker的主要优点是将表示层和业务层完全分开。

开发人员可以处理应用程序代码,而设计人员可以处理html页面设计。最终,使用freemarker可以将它们组合在一起以给出最终的输出页面。

FreeMarker的功能

  • 强大的模板语言:条件块,迭代,赋值,字符串和算术运算和格式,宏和函数(包括其他模板),默认转义(可选)等。
  • 多用途,轻量级:零依赖性,任何输出格式,可以从任何位置加载模板(可插拔),许多配置选项。
  • 国际化/本地化意识:区域设置敏感的数字和日期/时间格式,本地化的模板变体。
  • XML处理功能:将XML DOM放入数据模型并遍历它们,甚至进行声明式处理。
  • 通用的数据模型:Java对象通过可插拔适配器以变量树的形式暴露给模板,该适配器决定了模板如何使用。

总结一下优势就是:FreeMarker可将业务逻辑与表现层分离,有利于分工合作,提高开发效率。同时有利于提高访问速度,提升并发量,对SEO也更加友好。

SpringBoot集成

在pom文件中引入freemarker,当然在SpringBoot中是通过引入SpringBoot已经提供好的starter。完整的pom依赖引入如下:

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

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

其中spring-boot-starter-freemarker便是SpringBoot提供的starter,其间接引入了:

<dependency>
  <groupId>org.freemarker</groupId>
  <artifactId>freemarker</artifactId>
  <version>2.3.28</version>
  <scope>compile</scope>
</dependency>
freemarker

如果是通过Idea创建项目,可直接在创建时勾选。

这里大家需要注意的是此示例使用的SpringBoot版本不是2.2.2,而是2.1.5,至于为什么,后面章节会提到。这里我们先演示具体功能。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starters</artifactId>
    <version>2.2.2.RELEASE</version>
</parent>

整个项目的目录结构如下:

├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── secbro2
│   │   │           ├── SpringbootFreemarkerApplication.java
│   │   │           ├── controller
│   │   │           │   └── StudentController.java
│   │   │           └── entity
│   │   │               └── Student.java
│   │   └── resources
│   │       ├── application.properties
│   │       ├── static
│   │       └── templates
│   │           ├── biz
│   │           └── student.ftl

创建实体类:

@Data
public class Student {

    private String idNo;

    private String name;
}

创建Controller类并提供请求方法:

@Controller
public class StudentController {

    @GetMapping("/")
    public String getStudents(Model model) {

        List<Student> list = new ArrayList<>();

        Student s1 = new Student();
        s1.setIdNo("No1");
        s1.setName("Tom");
        list.add(s1);

        Student s2 = new Student();
        s2.setIdNo("No2");
        s2.setName("David");
        list.add(s2);

        model.addAttribute("students", list);
        return "student";
    }
}

这里返回了一个列表。页面相应的处理如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学生列表</title>
</head>
<body>
<table border="1">
    <tr>
        <td>学生编号</td>
        <td>学生名称</td>
    </tr>
    <#list students as student>
        <tr>
            <td>${student.idNo}</td>
            <td>${student.name}</td>
        </tr>
    </#list>
</table>
</body>
</html>

访问对应的请求返回结果如下:

freemarker

至此,关于Springboot集成freemarker的工作已经完成,所有配置均采用默认配置。

如果想进行定制化配置,还可以通过application.properties中进行配置。

# HttpServletRequest的属性是否可以覆盖controller中model的同名项
spring.freemarker.allow-request-override=false
# HttpSession的属性是否可以覆盖controller中model的同名项
spring.freemarker.allow-session-override=false
# 是否开启缓存
spring.freemarker.cache=false
# 模板文件编码
spring.freemarker.charset=UTF-8
# 是否检查模板位置
spring.freemarker.check-template-location=true
# Content-Type的值
spring.freemarker.content-type=text/html
# 是否将HttpServletRequest中的属性添加到Model中
spring.freemarker.expose-request-attributes=false
# 是否将HttpSession中的属性添加到Model中
spring.freemarker.expose-session-attributes=false
# 模板文件后缀
spring.freemarker.suffix=.ftl
# 模板文件位置
spring.freemarker.template-loader-path=classpath:/templates/

SpringBoot技术视频

CSDN学院:《SpringBoot 视频教程全家桶》

SpringBoot2.x系列教程(二十六)Springboot集成freemarker插图4
公众号:程序新视界


SpringBoot2.x系列教程(二十六)Springboot集成freemarker插图5

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2020/01/12/springboot2-x-springboot-freemarker/