FreeMarker是一个非常古老的模板引擎,可以用在Web环境或者非Web环境中。
与Thymeleaf不同,FreeMarker需要经过解析才能够在浏览器中展示出来。FreeMarker不仅可以用来配置HTML页面模板,也可以作为电子邮件模板、配置文件模板以及源码模板等。
Spring Boot中对FreeMarker整合也提供了很好的支持,主要整合步骤如下:
1. 创建项目,添加依赖首先创建Spring Boot项目,然后添加spring-boot-starter-web和spring-boot-starter-freemarker依赖,代码如下:
<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>
配置FreeMarker
Spring Boot对FreeMarker也提供了自动化配置类FreeMarkerAutoConfiguration,相关的配置属性在FreeMarkerProperties中,从该默认配置中可以看到,FreeMarker默认模板位置和Thymeleaf一样,都在classpath:/templates/中,默认文件后缀是.ftl。
开发者可以在application.properties中对这些默认配置进行修改,部分常见配置如下:
#HttpservletRequest的属性是否可以覆盖contorller中的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
#ContentType的值
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/
server.port=8099
配置控制器
Product.java
package com.shrimpking.pojo;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/3 12:33
*/
public class Product
{
private int id;
private String name;
private String factory;
public Product()
{
}
public Product(int id, String name, String factory)
{
this.id = id;
this.name = name;
this.factory = factory;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getFactory()
{
return factory;
}
public void setFactory(String factory)
{
this.factory = factory;
}
@Override
public String toString()
{
return "Product{" + "id=" + id + ", name='" + name + '\'' + ", factory='" + factory + '\'' + '}';
}
}
ProductController.java
package com.shrimpking.controller;
import com.shrimpking.pojo.Product;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.ArrayList;
import java.util.List;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/3 12:34
*/
@Controller
public class ProductController
{
@GetMapping("/product")
public ModelAndView product()
{
//新建列表
List<Product> products = new ArrayList<Product>();
//创建商品
Product p1 = new Product();
p1.setId(1);
p1.setName("桂花糕");
p1.setFactory("河南中裕食品厂");
Product p2 = new Product(2,"椰树椰汁","海南椰树椰汁有限公司");
products.add(p1);
products.add(p2);
//创建回传视图
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("products",products);
//设置前端视图页面名称
modelAndView.setViewName("product");
return modelAndView;
}
}
创建视图按照配置文件,在resources/templates目录下创建product.ftl文件,内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>freemarker</title>
</head>
<body>
<table border="1">
<tr>
<th>商品编号</th>
<th>商品名称</th>
<th>商品生产方</th>
</tr>
<#if products ??&&(products?size>0)>
<#list products as product>
<tr>
<td>${product.id}</td>
<td>${product.name}</td>
<td>${product.factory}</td>
</tr>
</#list>
</#if>
</table>
</body>
</html>
运行截图