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:&lt;h4 th:if="$param.val== 'abc'" th:text="$param.val"&gt;
是的。但有点 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&amp;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 中链接值,则更相关 - 您需要检查 foobar 是否为空以避免空指针异常。

请记住,Spring 的表达式语言有 safe navigation operator,这在这种情况下非常有用:foo.?bar.?baz,与单独使用 Thymeleaf 相比,它允许您编写更简洁的 null 处理。但同样,与您问题中的具体示例无关。

【讨论】:

$#strings.toString(param.val) == 'abc' --> 有效。谢谢你,拯救了我的一天。您能否在答案中包括如何检查 $#strings.toString(param.val) == 'abc' && not == null 吗?所以这对我来说将是完整的超级答案。 :)

以上是关于Thymeleaf 模板未在条件内呈现参数值的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf模板引擎语法

Mjml 邮件模板未在 Yahoo Mail 上呈现 UTF-8

models.TextField() 中的换行符未在模板中呈现

Grafana 中的条件模板值

<select> 内循环的 Django 模板在选择后呈现值

如何根据 IAM 角色 CloudFormation 模板中的参数提供不同的条件