本章节将介绍 Spring Boot 怎样集成 FreeMarker 模板引擎。
FreeMarker 是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
在项目的 pom.xml 文件中添加如下依赖:
<!-- freemarker 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <!-- spring boot web依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
在 application.properties 或 application.yml 文件中添加 FreeMarker 配置,如下:
## Freemarker # 指定 HttpServletRequest 的属性是否可以覆盖 controller 中与 model 同名项 spring.freemarker.allow-request-override=false # 是否开启模版缓存 spring.freemarker.cache=true # 是否检查模版路径是否存在 spring.freemarker.check-template-location=true # 设定模版编码 spring.freemarker.charset=utf-8 # 设定Content-Type spring.freemarker.content-type=text/html # 设定所有request的属性在merge到模板的时候,是否要都添加到model中 spring.freemarker.expose-request-attributes=false # 设定所有HttpSession的属性在merge到模板的时候,是否要都添加到model中 spring.freemarker.expose-session-attributes=false # 设定是否以springMacroRequestContext的形式暴露RequestContext给Spring’s macrolibrary使用 spring.freemarker.expose-spring-macro-helpers=false # 设定freemarker模板的前缀 spring.freemarker.prefix= # 指定RequestContext属性的名 spring.freemarker.request-context-attribute=freemarker # 设定模板的后缀 spring.freemarker.suffix=.ftl # 设定模板的加载路径,多个以逗号分隔,默认: ["classpath:/templates/"] spring.freemarker.template-loader-path=classpath:/templates/
在 resources/template/ 目录中创建 index.ftl 模板文件,模板内容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Spring Boot Freemarker</title>
<style type="text/css">
table { background: #F0F0F0; }
table th {padding: 8px;}
table td {background: #FFF;padding: 8px; }
</style>
</head>
<body>
<h1>${title}</h1>
<hr>
<div>
<table cellspacing="1">
<caption>${sysUser}</caption>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>User Name</th>
</tr>
</thead>
<tbody>
<#list userList as user>
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.phone}</td>
</tr>
</#list>
</tbody>
</table>
</div>
</body>
</html>创建一个 UserDomain 实例,该实体用来构造数据。如下:
public class UserDomain implements Serializable {
private int id;
private String name;
private String phone;
// 忽略 getter 和 setter
}在 IndexController 控制器中创建 index() 方法,该方法将返回前面创建的模板(index.ftl)。并且,创建一个 List<UserDomain>,该列表存放多个 UserDomain 对象。如下:
@Controller
public class IndexController {
private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
@RequestMapping("/")
public String index(Map<String, Object> result) {
logger.info("#### index()");
result.put("title", "Spring Boot Freemarker");
result.put("sysUser", "administrator");
List<UserDomain> userList = new ArrayList<>();
userList.add(new UserDomain(100, "Helen", "182 8766 5665"));
userList.add(new UserDomain(200, "Bill", "188 7878 7766"));
userList.add(new UserDomain(300, "Mary", "178 7887 4455"));
userList.add(new UserDomain(400, "Alia", "182 2332 4545"));
result.put("userList", userList);
return "index";
}
}运行程序,效果图如下:
