深色模式
转义的元素属性
为了避免模板中某些可能以其他模式处理的部分产生交互冲突(例如 HTML 模板中嵌套的文本模式内联代码),Thymeleaf 3.0 允许对其文本语法中元素的属性进行反向转义(unescaped)。具体规则如下:
TEXT模板模式下的属性:会执行 HTML 反向转义(将 HTML 转义字符还原为原始字符);JAVASCRIPT模板模式下的属性:会执行 JavaScript 反向转义;CSS模板模式下的属性:会执行 CSS 反向转义。
因此,下面这段代码在 TEXT 模式模板中是完全合法的(注意其中的 >):
text
[# th:if="${120<user.age}"]
Congratulations!
[/]当然,在纯文本模板中使用 < 本身没有实际意义,但如果我们在 HTML 模板中通过 th:inline="text" 块包含上述代码时,这么做就很有必要了——它能确保我们在静态打开模板文件作为原型时,浏览器不会把 <user.age 误认为是某个开始标签的名称(避免静态预览时的 HTML 解析错误)。
关键补充说明
核心目的: 这里的「转义属性」本质是先转义、再反向转义的过程:
- 编写模板时用 HTML 转义字符(如
<代替<),避免浏览器静态解析 HTML 时误判标签; - Thymeleaf 处理文本模式代码时,会自动将
<还原为<,保证表达式${120<user.age}能正常执行。
- 编写模板时用 HTML 转义字符(如
场景举例: 若直接在 HTML 模板的
th:inline="text"块中写<,静态预览时浏览器会把${120<user.age}中的<当作 HTML 标签开始,导致页面解析错乱:html<!-- 静态预览会出错:浏览器将 <user.age 识别为标签 --> <div th:inline="text"> [# th:if="${120<user.age}"] Congratulations! [/] </div> <!-- 正确写法:用 < 转义,静态预览正常,动态处理时还原 --> <div th:inline="text"> [# th:if="${120<user.age}"] Congratulations! [/] </div>反向转义的自动性: Thymeleaf 会根据当前模板模式自动匹配反向转义规则,无需手动配置——比如 JS 模式下会还原
\u00E1为á,CSS 模式下还原\为空格。
总结
- Thymeleaf 3.0 为文本语法的元素属性提供了「按模式自动反向转义」的能力,避免跨模式处理的冲突;
- 在 HTML 模板嵌套文本模式代码时,用 HTML 转义字符(如
<代替<)编写表达式,既能保证静态原型预览正常,又不影响动态处理时的表达式执行; - 反向转义规则与模板模式绑定(TEXT→HTML、JS→JS、CSS→CSS),是兼顾原生模板友好性的重要设计。
