Spring - Spring Boot - Thymeleaf - textual 模式踩坑
-
概述
- thymeleaf 的 text 模式简单使用
- 过程会比较啰嗦, 需要结论的同学, 可以直接到底部去寻找
-
背景
-
想尝试做一个简单的 模板工具
-
目的
- 自动生成一些简单的 重复文本
-
思路
- 尽量简单
- 使用 json 装填数据
- 这个可能会调整
- 用 restful 方式, 提交给 server
- spring-boot 集成, 很方便
- json 解析
- jackson 看了看, 还行
- 使用 模板 生成内容
- thymeleaf 应该能满足要求
- spring-boot 集成很方便
- 返回 模板生成内容
- 这个 第4步 顺手就做了
- 使用 json 装填数据
- 尽量简单
-
-
不过我比较生疏
- jackson 基本没用过
- 不过还算顺利
- thymeleaf 之前也是基本没用过
- 只会传最简单的 静态参数
- 本人前端苦手, 看见 html, js, css 就头晕
- jackson 基本没用过
-
-
环境
-
os
- win10
-
ide
- idea 2018.1
-
依赖
- jdk
- 1.8
- spring-boot
- 2.2.2
- maven
- 3.6
- jdk
-
1. 准备
-
spring-boot 创建 maven 工程
- 略
-
spring-boot 创建 restful 服务
- 略
-
thymeleaf 模板与传参
- 知道传到 那个模板
- 知道参数写在哪, 怎么取
2. 尝试1: 使用 thymeleaf 的 text 模式尝试
-
controller
-
model
-
添加属性
model.addAttribute("var1", "value1");
-
-
view
-
视图
return "test";
-
-
-
test.html
[(${var1})]
-
结果
- 成功展示
3. 尝试2: 尝试循环
-
controller
List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); model.addAttribute("list", list);
-
test.html
[# th:each="item : ${list}"] - [(${item})] [/]
-
结果
- 失败
- 直接原文显示
- 失败
-
疑问: 为啥会失败了呢?
- 问题
- 代码基本是 官网复制过来的
- 之前也没啥问题, 怎么会失败呢?
- 问题
4. 尝试3: 在 test.html 添加 尝试1 里的代码
-
结果
- var1 成功展示
- 后面的 循环, 还是没有成功
-
疑问: 为啥会是这种呢
- 感觉像是 循环的语法, 没有被 正确识别的样子
- 语法识别, 是跟 模式 相关吗?
5. 尝试4: 设置模式
-
发现
-
thymeleaf 可以定义 html5 严格模式
spring.thymeleaf.mode=LEGACYHTML5
-
其他的模式, 也是可以设置的
- ref2
-
-
配置文件 application.properties
-
添加内容
spring.thymeleaf.mode=TEXT
-
-
结果
- 还是不行
-
疑问
- 忽然发现, 官网的例子, 举的都是 邮件, js, css
- 我用的是 html, 会不会跟这个有关
- 忽然发现, 官网的例子, 举的都是 邮件, js, css
6. 尝试5; 换 模板文件
-
疑问
- thymeleaf 默认会给 模板名称结尾, 加上一个 .html
-
处理
-
去掉 .html 的默认后缀
-
application.properties
spring.thymeleaf.suffix=
-
-
重命名 模板
- 改名为 "test"
-
重启服务器
-
-
尝试
- ok
-
后续
-
尝试1: 去掉 模式定义 的语句
- 又不能解析了
-
尝试2: 将 模板名称, 改回 "test.html"
- 还是不行
-
7. 结论
-
想要使用 text 模式, 需要做以下操作
-
application.properties
spring.thymeleaf.mode=TEXT spring.thymeleaf.suffix=
-
模板
- 使用 text 模式的专用语法
-
如果其他地方, 想用 html
- 在 controller 方法的 返回值里, 使用 x.html 类似的视图名称
-
-
过程, 感觉有点曲折
- 之前没怎么接触
- 真的想不到, 这个工作模式, 还会跟 模板的后缀名 做一个挂钩
- 而且还有一个开关
- 感觉这种盲猜真的很麻烦
- 照着官网抄都超不对, 体验真实差到了极点, 很容易收到打击...
- 不知道经验老到的同学, 在这块会不会遇到这种新手问题...前前后后, 花了个把小时, 感觉浪费很多时间的样子...
- 或者换个角度, thymeleaf 的开发者, 就不想在这种场景, 让用户使用 text 模式
- 这个角度也是收到了留言小伙伴的启发...
8. 猜测
-
text 模式语法
- 语法本身, 是 inline 模式
- html 支持部分 inline 模式的语法
- 支持变量提取
- 不支持 each
-
模板解析
- 根据 模板的后缀, 选择合适的 解析器
- 每种解析器, 只能解析 有限的语法
- 解析 html 的解析器, 无法解析 text 模式的 each
ps
-
ref
-
- 官网 文档
- 本身比较详细, 但是 textual 模式, 却说得比较略
- 官网 文档
-
Thymeleaf 3 ten-minute migration guide
- 官网 文档
- 讲了些 spring 的代码配置
- 可惜版本是 spring4 的
- 我用的是 spring5, 可能会有点出入
- 大体结构是这样
- viewResolver: 视图解析器
- templateEngine: 模板引擎
- templateResolver: 模板解析器
- templateEngine: 模板引擎
- viewResolver: 视图解析器
- 但是后面具体的调用机制, 我就不太熟悉了
- 讲了些 spring 的代码配置
- 官网 文档
-
thymeleaf3-template-modes-example
- 官网 例子
-
大概给了三套
- 视图解析器, 模板引擎, 模板解析器
-
具体什么机制, 也没说明白
- 或者说, 我没看明白
- 比如说
- 这些 解析器, 什么时候调用哪个?
- 盲猜
- 根据 controller 视图的后缀, 来确定使用哪个 模板解析器
- 具体机制, 还没深入了解
-
- 官网 例子
-
-
怎么说呢?
- 还是喜欢那种, 先学习, 后使用 的工作模式
- 这种 边用边查资料 的模式, 我不太喜欢
- 做东西太赶
- 做了前面, 容易给后面埋坑
- 学东西太着急
- 容易造成理解问题
- 做东西太赶
- 不过这种方式, 应该是大多数公司的日常工作模式吧
- 反正我接触的, 基本是这样...
- 想想还有点难受
- 这种 边用边查资料 的模式, 我不太喜欢
- 还是喜欢那种, 先学习, 后使用 的工作模式
-
如果用 其他模板引擎 做同样的事, 会有这么麻烦吗?
- jsp
- Velocity
- freemarker
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出