来自官网的简介
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。
这种方式通常被称为 MVC (模型 视图 控制器) 模式,对于动态网页来说,是一种特别流行的模式。 它帮助从开发人员(Java 程序员)中分离出网页设计师(HTML设计师)。设计师无需面对模板中的复杂逻辑, 在没有程序员来修改或重新编译代码时,也可以修改页面的样式。
而FreeMarker最初的设计,是被用来在MVC模式的Web开发框架中生成HTML页面的,它没有被绑定到 Servlet或HTML或任意Web相关的东西上。它也可以用于非Web应用环境中。
FreeMarker 是 免费的, 基于Apache许可证2.0版本发布。
一、创建项目
-
首先创建一个 Spring Boot 工程,引入 Freemarker 依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.junya</groupId> <artifactId>freemarker</artifactId> <version>0.0.1-SNAPSHOT</version> <name>freemarker</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <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> </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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
新建User实体类,此处用了lombok的@Data注解,可以自动给我们生成setter、getter、equals等方法。
package com.junya.freemarker.entity; import lombok.Data; /** * @author ZHANGCHAO * @date 2020/5/14 15:16 * @since 1.0.0 */ @Data public class User { private Long id; private String userName; private String address; private Integer gender; }
-
新建UserController类,增加user方法,返回视图名为user
package com.junya.freemarker.controller; import com.junya.freemarker.entity.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * @author ZHANGCHAO * @date 2020/5/14 15:21 * @since 1.0.0 */ @Controller public class UserController { @GetMapping("/user") public String user(Model model) { List<User> userList = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 10; i++) { User user = new User(); user.setId((long) i); user.setUserName("mayanhong - " + i); user.setAddress("www.baidu.com - " + i); user.setGender(random.nextInt(3)); // 0 男 1 女 其他未知 userList.add(user); } model.addAttribute("users", userList); return "user"; } }
-
在resources下的templates下新建user.ftl视图模版
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>user</title> </head> <body> <table border="1"> <tr> <td>编号</td> <td>用户名</td> <td>地址</td> <td>性别-if</td> <td>性别-switch</td> </tr> <#list users as user> <tr> <td>${user.id}</td> <td>${user.userName}</td> <td>${user.address}</td> <#-- 演示if用法 --> <td> <#if user.gender==0> 男 <#elseif user.gender==1> 女 <#else> 未知 </#if> </td> <#-- 演示switch用法 --> <td> <#switch user.gender> <#case 0>男<#break> <#case 1>女<#break> <#default >不知道 </#switch> </td> </tr> </#list> </table> </body> </html>
二、启动测试
启动项目,访问http://localhost:8080/user,发现报500错误:
查看源码,发现SpringBoot 2.2以后默认的Freemarker后缀已改为.ftlh,如下:
在application.properties中加个配置:
spring.freemarker.suffix=.ftl
重新启动项目,访问http://localhost:8080/user
ok,一切正常了!页面已经渲染出数据!
三、其他配置
我们还可以在 application.properties 中进行自定义配置,如默认模版位置等:
spring.freemarker.allow-request-override=false
spring.freemarker.allow-session-override=false
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.suffix=.ftl
spring.freemarker.template-loader-path=classpath:/templates/
- HttpServletRequest的属性是否可以覆盖controller中model的同名项
- HttpSession的属性是否可以覆盖controller中model的同名项
- 是否开启缓存
- 模板文件编码
- 是否检查模板位置
- Content-Type的值
- 是否将HttpServletRequest中的属性添加到Model中
- 是否将HttpSession中的属性添加到Model中
- 模板文件后缀
- 模板文件位置
总结
在SpringBoot中整合Freemarker与以前的SSM相比还是非常简单的,因为SpringBoot已经默认给我们整合了很多配置,我们只需要简单修改下就可以了。