本章节将介绍 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"; } }
运行程序,效果图如下: