前言
SpringMVC和Thymeleaf组合在一起的问题,比较冷门,一般遇到的也比较少。因为大家在SSM阶段技术选型的时候,一般会选用jsp,学校老师也是这么教的。
一般在SpringBoot阶段用到Thymeleaf模板引擎比较多,而且SpringBoot还有专门的Thymeleaf的启动器,帮我们省去了不少配置。
但是我在搭建个人博客时,想练习一下SSM,又想摒弃jsp技术,就结合了一下Thymeleaf。但是发现了不少的问题:
一、如何编写SpringMVC的配置文件?
这里对xml进行讨论,笔者用的是xml配置。
一开始我是照着《Spring实战(第四版)》进行配置,书上是这么说的:
首先看到这里使用了p命名空间,p命名空间注入的特点是使用属性而不是子元素的形式配置Bean的属性,从而简化了配置代码。
要使用p命名空间,要在xml的开头添加约束:
xmlns:p=“http://www.springframework.org/schema/p”
但是照着这段代码敲完后,出现的第一个问题是新版本的Spring(Spring5),不认识ServletContextTemplateResolver。
而且解析页面现了中文乱码的问题,所有中文都变成了问号(?)。经过网上多方寻求解决方案,最终确定了如下配置:
代码如下:
<!--
Spring对thymeleaf支持 Spring实战第四版 P192
前提:导入pom.xml关于thymeleaf的坐标 而且别忘了加上版本号!!!!!
-->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"
p:templateEngine-ref="templateEngine"
p:characterEncoding="UTF-8"
/>
<bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine"
p:templateResolver-ref="templateResolver"/>
<!--
下面这个bean不能完全照着Spring实战配 会出问题.我搜了一下网上的大神有解决方案:
解决方案我已经收藏在csdn的收藏夹里面了
https://blog.csdn.net/qq_31782587/article/details/73550504
然后又冒出了一个巨大的坑,卡了我2小时! 就是thymeleaf集成springMVC, 走controller之后会出现中文乱码!!
看https://www.cnblogs.com/zhi-leaf/p/10594353.html 解决方案在这里面
其实就是配置2次 p:characterEncoding="UTF-8" (自己搜索这句话,在哪里配置了2次)
-->
<bean id="templateResolver" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"
p:prefix="/WEB-INF/pages/"
p:suffix=".html"
p:templateMode="HTML5"
p:characterEncoding="UTF-8"
/>
二、启动服务器之后,页面html的代码显示不全
问题的描述是,我的一个页面,启动之后发现页面内容显示不全,右键查看网页源代码,发现源代码根本就没显示完全,而是从中间截断了,只显示了三分之一不到的行数,拉进度条死活拉不下去了。
如下图所示,在浏览器中查看源代码,发现显示到这就到此为止了。
后来我通过注释掉一些代码,精准找到了问题的原因:
在idea中代码是这样的:
<div class="ui inverted link list">
<a class="item m-text-lined" th:each="newBlog,iter:${newBlogs}" th:href="@{'/page_blog/'+${newBlog.getId()}}" th:text="${newBlog.getTitle()}">博客1</a>
</div>
到浏览器时,代码却是这样的:
发现里面的a标签以及里面的 th:(thymeleaf相关代码)居然被浏览器给吃了?!
那么问题就迎刃而解了,其实是Thymeleaf的报错,这个th字段里面的东西出错了,编译器也报红了,我没注意,所以就出现了这么个奇葩问题。
总结
使用冷门技术栈组合难免会遇到各种各样的问题,不过大都是配置上的,之前用SpringBoot给我们屏蔽掉太多配置细节了,换回SSM的方式,简直是配置地狱。不过解决这些问题之后,业务代码的开发流程和SpringBoot别无二致。