首页>>后端>>SpringBoot->SpringBoot + thymeleaf foreach踩坑记录

SpringBoot + thymeleaf foreach踩坑记录

时间:2023-11-30 本站 点击:0

话说自从前后端分离之后,前后端放在一起的场景就很少了,最近写个简单的后台,突然踩坑了,使用themeleaf模板渲染时,发现th:each来遍历生成表单数据,一直抛异常,提示Property or field 'xxx' cannot be found on null

接下来看一下这个问题到底是个什么情况

I. 项目搭建

1. 项目依赖

本项目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA进行开发

开一个web服务用于测试

<dependencies><!--邮件发送的核心依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency></dependencies>

配置文件application.yml

server:port:8080spring:thymeleaf:mode:HTMLencoding:UTF-8servlet:content-type:text/htmlcache:false

II. 问题复现与处理

1. 场景复现

一个最基础的demo,来演示一下问题

@ControllerpublicclassIndexController{publicMap<String,Object>newMap(Stringkey,Objectval,Object...kv){Map<String,Object>map=newHashMap<>();map.put(key,val);for(inti=0;i<kv.length;i+=2){map.put(String.valueOf(kv[i]),kv[i+1]);}returnmap;}@GetMapping(path="list")publicStringlist(Modelmodel){List<Map>list=newArrayList<>();list.add(newMap("user","yh","name","一灰"));list.add(newMap("user","2h","name","2灰"));list.add(newMap("user","3h","name","3灰"));model.addAttribute("list",list);return"list";}}

对应的html文件如下(注意,放在资源目录 templates 下)

<!DOCTYPEhtml><htmlxmlns:th="http://www.thymeleaf.org"><head><metacharset="UTF-8"></head><body><div><divth:each="item:${list}"><spanth:text="${item.user}"></span>&nbsp;&nbsp;<spanth:text="${item.name}"></span></div><hr/><pth:each="item:${list}"><pth:text="${item.user}"></p>&nbsp;&nbsp;<pth:text="${item.name}"></p></p></div></body></html>

注意上面的模板,有两个each遍历,出现问题的是第二个

2. 原因说明

上面提示user没有,那么是否是语法问题呢?将html改成下面这个时

<!DOCTYPEhtml><htmlxmlns:th="http://www.thymeleaf.org"><head><metacharset="UTF-8"></head><body><div><divth:each="item:${list}"><spanth:text="${item.user}"></span>&nbsp;&nbsp;<spanth:text="${item.name}"></span></div></div></body></html>

相同的写法,上面这个就可以,经过多方尝试,发现出现问题的原因居然是<p>这个标签

简单来讲,就是<p>标签不能使用th:each,测试一下其他的标签之后发现<img><input>标签也不能用

那么问题来了,为啥这几个标签不能使用each呢?

这个原因可能就需要去瞅一下实现逻辑了,有知道的小伙伴可以科普一下

III. 不能错过的源码和相关知识点

0. 项目

工程:https://github.com/liuyueyi/spring-boot-demo

源码:https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/

1. 微信公众号: 一灰灰Blog

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/SpringBoot/4398.html