Thymeleaf模板渲染失败主因是数据未传入、键名错误或转义问题;Layui templet中漏写等号导致HTML被转义。

模板渲染失败,90%的情况不是引擎坏了,而是变量根本没传进去、传错了名、或者被转义了——先确认数据是否真的到达了模板,再查语法。
Thymeleaf中${user.name}为空?先看model.addAttribute()键名对不对
Spring Boot里model.addAttribute("user", userModel)和${user.name}才能匹配;如果写成model.addAttribute("person", userModel),那${user.name}永远是空。大小写也敏感:userModel.getUsername()返回值有效,但${userModel.Username}会报错或为空,因为Thymeleaf不识别Username这个属性名。
- 临时硬编码验证:在Controller里写
model.addAttribute("user", "test"),再刷新页面看是否显示test - 检查
UserModel是否真被注入:参数UserModel userModel不是自动绑定的登录用户,而是new出来的空对象,要用@AuthenticationPrincipal或SecurityContextHolder取真实用户 - 用浏览器“查看页面源代码”,搜索
user关键字,确认th:*指令是否被正确解析(未解析说明Thymeleaf未生效,可能是@Controller写成了@RestController)
Layui表格templet里被当文本显示?记得用{{= d.xxx}}而不是{{ d.xxx}}
Layui默认对templet内容做HTML转义,{{ d.status }}输出的是字符串<strong>active</strong>,而{{= d.status }}才真正渲染为加粗文本。漏掉等号是高频错误。
- 函数模板写法:
templet: '<div>{{= d.status }}</div>' - 脚本模板写法:
<script type="text/html" id="statusTpl">{{= d.status }}</script>,再配templet: '#statusTpl' - 如果
d.status本身含引号或,仍可能破坏DOM结构,建议服务端预处理或前端用<code>DOMPurify.sanitize()兜底
浏览器Elements里看到的DOM和你写的HTML不一致?别信源码,信Elements面板
浏览器会主动修复非法嵌套,比如<div><p>text</p></div>
立即学习“前端免费学习笔记(深入)”;
会被重排成<div><p>text</p></div>。这意味着你写的模板逻辑可能早被DOM重建覆盖了。
<table>、<code><ul></ul>、<select></select>内部不允许直接塞<div>,否则整段结构可能被拆散 <li>服务端模板(如Jinja2)里<code>{{ content | safe }}输出的HTML若含未闭合标签,也会触发浏览器修复,导致后续DOM错乱- 打开“查看页面源代码”对比Elements面板,若两者差异大,问题大概率出在服务端输出的HTML本身有语法错误
- 开发时统一用绝对路径:
/static/css/app.css(服务端可配spring.web.resources.static-locations) - 避免在模板里拼接路径,改用服务端注入的上下文路径变量,如Thymeleaf中
th:src="@{/static/img/logo.png}" - FreeMarker中用
再拼接,比硬编码更可靠
本地双击打开HTML时图片404?路径解析规则和服务器完全不同
本地文件协议下./static/css/app.css按当前HTML所在目录解析;而Spring Boot、Flask等服务端把/static/映射到类路径或指定目录,./和/行为不一致。
最常被忽略的一点:模板引擎不会告诉你“变量不存在”,它只会静默输出空字符串或原始占位符。所以看到空白或{{user.name}}原样显示,第一反应不该是“引擎配置错了”,而是“这个变量压根没传进来”。



















