FreeMarker是一款模板引擎:即基于模板和数据源生成输出文本(html网页,配置文件,电子邮件,源代码)的通用工具。它是一个java类库。
FreeMarker最初被设计用来在MVC模式的Web开发框架中生成HTML页面,它没有被绑定到Servlet或HTML或任意Web相关的东西上。也可以用于非Web应用环境中。
模板编写使用FreeMarker Template Language(FTL)。使用方式类似JSP的EL表达式。模板中专注于如何展示数据,模板之外可以专注于要展示什么数据。
官网显示的使用图解:
当然,在非HTML场景下的模板使用也可以用如下图进行解释:
FreeMarker是基于Java的模板引擎,最初专注于使用MVC软件体系结构进行动态网页生成。使用Freemarker的主要优点是将表示层和业务层完全分开。
开发人员可以处理应用程序代码,而设计人员可以处理html页面设计。最终,使用freemarker可以将它们组合在一起以给出最终的输出页面。
总结一下优势就是:FreeMarker可将业务逻辑与表现层分离,有利于分工合作,提高开发效率。同时有利于提高访问速度,提升并发量,对SEO也更加友好。
在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/