SpringBoot2.x系列教程(二十六)Springboot集成freemarker
FreeMarker简介
FreeMarker是一款模板引擎:即基于模板和数据源生成输出文本(html网页,配置文件,电子邮件,源代码)的通用工具。它是一个java类库。
FreeMarker最初被设计用来在MVC模式的Web开发框架中生成HTML页面,它没有被绑定到Servlet或HTML或任意Web相关的东西上。也可以用于非Web应用环境中。
模板编写使用FreeMarker Template Language(FTL)。使用方式类似JSP的EL表达式。模板中专注于如何展示数据,模板之外可以专注于要展示什么数据。

官网显示的使用图解:

当然,在非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>

如果是通过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>
访问对应的请求返回结果如下:

至此,关于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 视频教程全家桶》


关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:http://folen.top/2020/01/12/springboot2-x-springboot-freemarker/