SpringBoot-Freemarker与SpringBoot集成

本文将展示通过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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值