本文将展示通过controller返回一个map,html页面上展示这个map里的内容,其中,map的key是用户(user)对象,map的value是该用户的多个订单(List<Order>)

一:首先引入freemarker的依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

二:创建2个文件夹和一个freemarker模板
1.在src/main/resources文件夹建立一个叫templates的文件夹,用来装freemarker的ftl文件
2.在src/main/resources/templates文件夹下创建一个叫index.ftl的文件
3.在src/main/resources文件夹建立一个叫static的文件夹,这个文件夹用来装静态资源,比如css,js,图片等等
三:配置freemarker(无须配置yml或者properties文件)
此处使用spring封装的freemarker,因为原生freemarker循环map的key只能是String类型,而我们的map的key是User类型,而不是String,spring封装过的就没问题,将该方法放到任意一个由spring管理的类中(多数都是启动类)

@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer fc = new FreeMarkerConfigurer();
fc.setTemplateLoaderPath("classpath:/templates/");
Properties pro = new Properties();
pro.setProperty("object_wrapper", "freemarker.ext.beans.BeansWrapper");
fc.setFreemarkerSettings(pro);
return fc;
}

四:创建用户类和订单类

public class User {
private String name;
public User(String name) {
this.name = name;
}
// 省略get set
}
public class Order {
private String number;
public Order(String number) {
this.number = number;
}
// 省略get set
}

五:创建controller

@Controller
public class NodesAndResourceGUIController {

@RequestMapping("myorders")
public ModelAndView currentNodes1() {
ModelAndView mav = new ModelAndView();
// ftl的文件名字,比如aaa.ftl,那么viewName就应该等于"aaa"
mav.setViewName("index");
// --------创建第1个用户,该用户拥有2个订单
User u1 = new User("人员1");
Order o11 = new Order("订单11");
Order o12 = new Order("订单12");
List<Order> list1 = Arrays.asList(o11, o12);
// --------创建第2个用户,该用户拥有2个订单
User u2 = new User("人员2");
Order o21 = new Order("订单21");
List<Order> list2 = Arrays.asList(o21);
//---------创建1个返回结果
Map<User, List<Order>> map = new HashMap<>();
map.put(u1, list1);
map.put(u2, list2);
mav.addObject("result", map);
return mav;
}

六:向index.ftl文件写入如下内容(index.ftl文件是步骤二创建的)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
// 此处是获取static(步骤二)文件夹下的css文件夹下的css.css文件
// 本文虽然没有用这个css,但是依然要记录下来,方便以后使用
<link rel="stylesheet" href="${springMacroRequestContext.getContextPath()}/css/css.css">
<link rel="stylesheet" href="${springMacroRequestContext.getContextPath()}/css/font.css">
</head>
// 因为freemarker对空限制的非常严格,所以如果你出现了错误,请先保证需要的值一定不为空,或者一定判断了空
// 下面的语义是:先判断controller返回的ModelAndView中的result是否为空
// 如果不为空,则循环,第一次循环,循环的是map,第二次循环,循环的是map
// 中每个元素的value,注意keySet(),这是步骤三中使用spring封装后的freemarker才有的方法
// 原生freemarker没有keySet()
<#if result??>
<#list result.keySet() as user>
${user.name}
<#list result.get(user) as order>
${order.number}
</#list>
</#list>
</#if>
</html>

七:打开浏览器访问localhost:xxxx/myorders