Spring Boot 和 Thymeleaf - 删除严格的 HTML 错误检查

Posted

技术标签:

【中文标题】Spring Boot 和 Thymeleaf - 删除严格的 HTML 错误检查【英文标题】:Spring Boot & Thymeleaf - remove strict HTML error checking 【发布时间】:2015-10-26 03:03:59 【问题描述】:

我正在将 Spring Boot 用于 MVC 应用程序,我的视图技术是 Thymeleaf。我需要做的一件事是复制现有网站的 html(不是我做的......)并使用 Thymeleaf 呈现它。但是,一些网站的源 HTML 包含未闭合的 HTML 标签(例如<meta><link><input>),或者带有不被引号包围的元素的 HTML 标签,例如:

<div id=1></div>

而不是

<div id="1"></div>

当然在浏览器中这是可行的……但是 Thymeleaf 不允许这样做并且不提供页面。有什么办法可以允许更宽松的规则吗?我搜索了 Thymeleaf 的文档和 Spring Boot 参考,但没有找到答案。

只是为了澄清 - 我什至没有为 Thyemeleaf 配置我自己的 bean,只是通过 maven 将它作为 spring-boot-starter 之一添加到类路径中。所以现在这些是默认设置。

【问题讨论】:

【参考方案1】:

我知道我在很长一段时间后给出了答案,但如果它对任何人都有帮助,那就分享一下。 我在将一个属性 “spring,thymeleaf.mode”设置为“LEGACYHTML5”后解决了这个问题。

 spring.thymeleaf.mode=LEGACYHTML5

并在 pom.xml 中添加依赖:

<dependency>
  <groupId>net.sourceforge.nekohtml</groupId>
  <artifactId>nekohtml</artifactId>
  <version>1.9.21</version>
</dependency>

如果你想禁用 thymeleaf 的缓存,那么 thymeleaf 缓存

spring.thymeleaf.cache=false

【讨论】:

【参考方案2】:

Spring Boot 1.5.3 supportsThymeleaf 3。Thymeleaf 3 有 full html5 markup support.

将以下行添加到您的pom.xml 以覆盖 Spring boot 中的 Thymeleaf 版本,您将能够使用未关闭的标签。

<properties>
   <thymeleaf.version>3.0.6.RELEASE</thymeleaf.version>
   <thymeleaf-layout-dialect.version>2.2.1</thymeleaf-layout-dialect.version>
    ...
</properties>

【讨论】:

我认为最好的答案。注意粘贴在答案中的代码应该添加到 .【参考方案3】:

正如@mussdroid 所说,一切都需要使用有效的 XML。以下是 Thymeleaf 文档的一部分,解释了这方面的背景:http://www.thymeleaf.org/doc/articles/fromhtmltohtmlviahtml.html

另外,如果这是一个问题,我相信您可以打开 legacy-mode 以允许非 XML 模板,但如果可能的话,我更喜欢使用有效的 XML: http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#what-kind-of-templates-can-thymeleaf-process

我自己不知道如何更改模式,但我确信 DuckDuckGo 或此站点上的某个人会。

【讨论】:

在您提供的链接中,我可能正在寻找旧版 HTML。但是当我选择该选项时,我的 Angularjs 代码将停止工作......有什么想法吗? 是的,根据第二个链接,Thymeleaf 会在处理并输出之前修改您的 HTML 以使其成为有效的 XML。不确定,但我绝对可以想象这会把 Angular 搞砸。您可能能够以某种方式构建您的东西以使其工作,但如果不是太多工作,我可能只会让所有内容成为有效的 XML。 实际上没有错误 - 角度表达式、绑定等不起作用。我所做的是使用在线工具将html转换为xhtml。由于这些事情,我可能不得不放弃 Thymeleaf。不过,你确实回答了我的问题,所以我选择了你的答案:)。 k,谢谢。祝你好运!是不是全部都不起作用,还是其中一部分不起作用? 显然是所有这些。就好像我没有在 DOM 中包含 ng-app 元素一样。【参考方案4】:

一切都应该是 xthml 格式

例如;

HTML 链接

<link rel="stylesheet" type="text/css" href="mystyle.css">

THYMELEAF LINK 应该以“/>”结尾

 <link rel="stylesheet" href="print.css" media="print" type="text/css" />

HTML 元数据

<meta charset="UTF-8">

THYMELEAF META 应该以“/>”结尾

<meta charset="utf-8"/>

样本

<input type="text" name="lastname" disabled /> wrong 

<input type="text" name="lastname" disabled="disabled" /> correct

否则页面将不会显示,因为应用了 xhmtl 规则。

请看链接,避免此类错误 HTML and XHTML

另一方面,当页面返回浏览器时,您会看到 xhtml 规则再次转换为 html 格式。但是它在发送客户端 thymeleaf xhtml 规则之前在服务器上运行的实际页面被应用。

【讨论】:

以上是关于Spring Boot 和 Thymeleaf - 删除严格的 HTML 错误检查的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例

Spring Boot 中的 Thymeleaf 缓存和安全性

thymeleaf 和 spring-boot 丢失的复杂对象

Spring Boot整合Thymeleaf

Thymeleaf 模板 在spring boot 中的引用和应用

用于 Spring Boot + Thymeleaf 的 @WebAppConfiguration 和 @ContextConfiguration