Thymeleaf 模板未在条件内呈现参数值
Posted
技术标签:
【中文标题】Thymeleaf 模板未在条件内呈现参数值【英文标题】:Thymeleaf Template not rendering param value inside th if condition 【发布时间】:2020-12-13 07:58:56 【问题描述】:我正在为我的 Spring Boot 应用程序使用 thymeleaf 模板。在主页下方,
<div th:replace="content :: content"></div>
和内部内容片段,
<div th:fragment="content">
<h4 th:if="$param.val== 'abc'">SOME-TEXT</h4> // not working
<h4 th:if="$param.val== 'abc'" th:text="$param.val"></h4> // not working
<h4 th:text="$param.val"></h4> // working and value is abc
<h4 th:unless="$param.val== 'abc'" th:text="$param.val"></h4> // working - value in html text is abc
<h4 th:unless="$param.val== 'abc'">SOME-TEXT</h4> // Working, value is SOME-TEXT
</div>
URL: domain/?val=abc
如果 param.val == 'abc',我想在 html 中显示:SOME-TEXT。 值“abc”进入 th:text。但是在里面:如果失败了。
似乎在 param.val 中添加了一些隐藏的额外字符串? 有什么建议吗?
【问题讨论】:
th:if 只负责决定是否包含那个 。如果您仍然希望将“SOME-TEXT”替换为“abc”,则还需要使用 th:text:<h4 th:if="$param.val== 'abc'" th:text="$param.val">
是的。但有点 th;如果使用 param.val 检查不起作用。 --> 不工作。但是 --> 工作
另外, --> 工作.似乎在 param.val 中添加了一些额外的字符?
【参考方案1】:
Thymeleaf 函数$param.val
将返回一个名为val
的请求参数。但这可能是一个多值对象(例如一个数组)——例如考虑这个(这是一个有效的结构):
?val=abc&val=def
所以要使用单值字符串,您可以这样做:
<h4 th:if="$#strings.toString(param.val) == 'abc'" th:text="'SOME-TEXT-2'">SOME-TEXT-1</h4>
这会在网页中打印SOME-TEXT-2
。
或者你可以使用这个:
<h4 th:if="$#strings.toString(param.val) == 'abc'">SOME-TEXT-1</h4>
打印SOME-TEXT-1
。
只是出于兴趣,如果您使用第一个示例 val=abc&val=def
,那么您可以看到会发生什么:
<h4 th:text="$param.val"></h4>
它打印一个数组:
[abc, def]
在处理一系列相关复选框时,您可能会看到类似这样的内容(仅作为一个示例)。
更新:
对于空检查,使用 Thymeleaf,您可以这样做:
<h4 th:if="$param.val != null and
$#strings.toString(param.val) == 'abc'">SOME-TEXT-2</h4>
在这种特定情况下,它并不是真正需要的,因为您没有对可能导致问题的空值做任何事情。
如果您在对象 foo.bar.baz
中链接值,则更相关 - 您需要检查 foo
或 bar
是否为空以避免空指针异常。
请记住,Spring 的表达式语言有 safe navigation operator,这在这种情况下非常有用:foo.?bar.?baz
,与单独使用 Thymeleaf 相比,它允许您编写更简洁的 null 处理。但同样,与您问题中的具体示例无关。
【讨论】:
$#strings.toString(param.val) == 'abc' --> 有效。谢谢你,拯救了我的一天。您能否在答案中包括如何检查 $#strings.toString(param.val) == 'abc' && not == null 吗?所以这对我来说将是完整的超级答案。 :)以上是关于Thymeleaf 模板未在条件内呈现参数值的主要内容,如果未能解决你的问题,请参考以下文章
Mjml 邮件模板未在 Yahoo Mail 上呈现 UTF-8
models.TextField() 中的换行符未在模板中呈现