如何在 Thymeleaf 中执行 if-else 操作?

问题描述 投票:0回答:15

在 Thymeleaf 中执行简单的

if
-
else
的最佳方法是什么?

我想在 Thymeleaf 中实现与

相同的效果
<c:choose>
  <c:when test="${potentially_complex_expression}">
     <h2>Hello!</h2>
  </c:when>
  <c:otherwise>
     <span class="xxx">Something else</span>
  </c:otherwise>
</c:choose>

在 JSTL。

到目前为止我所想到的:

<div th:with="condition=${potentially_complex_expression}" th:remove="tag">
    <h2 th:if="${condition}">Hello!</h2>
    <span th:unless="${condition}" class="xxx">Something else</span>
</div>

我不想评估

potentially_complex_expression
两次。这就是为什么我引入局部变量
condition
。但我还是不喜欢同时使用
th:if="${condition}
th:unless="${condition}"

重要的是我使用了两个不同的 HTML 标签:比如说

h2
span

你能建议一个更好的方法来实现它吗?

java jsp if-statement jstl thymeleaf
15个回答
258
投票

Thymeleaf 具有相当于

<c:choose>
<c:when>
的功能:Thymeleaf 2.0 中引入了
th:switch
th:case
属性。

它们按照您的预期工作,使用

*
作为默认情况:

<div th:switch="${user.role}"> 
  <p th:case="'admin'">User is an administrator</p>
  <p th:case="#{roles.manager}">User is a manager</p>
  <p th:case="*">User is some other thing</p> 
</div>

请参阅 this 以获取语法的快速说明(或 Thymeleaf 教程)。

免责声明:根据 StackOverflow 规则的要求,我是 Thymeleaf 的作者。


136
投票

我尝试使用此代码来查明客户是否已登录或匿名。我确实使用了

th:if
th:unless
条件表达式。非常简单的方法来做到这一点。

<!-- IF CUSTOMER IS ANONYMOUS -->
<div th:if="${customer.anonymous}">
   <div>Welcome, Guest</div>
</div>
<!-- ELSE -->
<div th:unless="${customer.anonymous}">
   <div th:text=" 'Hi,' + ${customer.name}">Hi, User</div>
</div>

34
投票

除了 Daniel Fernández 之外,我还想分享我与安全相关的示例。

<div th:switch="${#authentication}? ${#authorization.expression('isAuthenticated()')} : ${false}">
    <span th:case="${false}">User is not logged in</span>
    <span th:case="${true}">Logged in user</span>
    <span th:case="*">Should never happen, but who knows...</span>
</div>

这里是混合了“身份验证”和“授权”实用程序对象的复杂表达式,它为 thymeleaf 模板代码生成“真/假”结果。

“身份验证”和“授权”实用程序对象来自 thymeleaf extras springsecurity3 库。 当 'authentication' 对象不可用或授权.expression('isAuthenticated()') 计算结果为 'false' 时,表达式返回 ${false},否则返回 ${true}。


24
投票

你可以使用

If-then-else:  (if) ? (then) : (else)

示例:

'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))

对于提出同样问题的新人来说可能很有用。


17
投票

另一种解决方案 - 您可以使用局部变量:

<div th:with="expr_result = ${potentially_complex_expression}">
    <div th:if="${expr_result}">
        <h2>Hello!</h2>
    </div>
    <div th:unless="${expr_result}">
        <span class="xxx">Something else</span>
    </div>
</div>

有关局部变量的更多信息:
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#local-variables


13
投票

在更简单的情况下(当html标签相同时):

<h2 th:text="${potentially_complex_expression} ? 'Hello' : 'Something else'">/h2>

12
投票

使用
th:switch
作为
if-else

<span th:switch="${isThisTrue}">
  <i th:case="true" class="fas fa-check green-text"></i>
  <i th:case="false" class="fas fa-times red-text"></i>
</span>

使用
th:switch
作为
switch

<span th:switch="${fruit}">
  <i th:case="Apple" class="fas fa-check red-text"></i>
  <i th:case="Orange" class="fas fa-times orange-text"></i>
  <i th:case="*" class="fas fa-times yellow-text"></i>
</span>

7
投票

另一种解决方案是使用

not
得到相反的否定:

<h2 th:if="${potentially_complex_expression}">Hello!</h2>
<span class="xxx" th:if="${not potentially_complex_expression}">Something else</span>

正如文档中所解释的,这与使用

th:unless
是一样的。正如其他答案所解释的:

此外,

th:if
有一个逆属性,
th:unless
,我们可以有 在前面的示例中使用 而不是使用不在 OGNL 内部 表情

使用

not
也可以,但恕我直言,使用
th:unless
比用
not
否定条件更具可读性。


6
投票
<div th:switch="true"> 
    <div th:case="${condition}=='1'">answer1...</div>
    <div th:case="${condition}=='2'">answer2...</div>
    <div th:case="*">answer3...</div> 
</div>

2
投票
<div th:switch="${user.role}"> 
<p th:case="'admin'">User is an administrator</p>
<p th:case="#{roles.manager}">User is a manager</p>
<p th:case="*">User is some other thing</p> 
</div>


<div th:with="condition=${potentially_complex_expression}" th:remove="tag">
<h2 th:if="${condition}">Hello!</h2>
<span th:unless="${condition}" class="xxx">Something else</span>
</div>

1
投票
<div style="width:100%">
<span th:each="i : ${#numbers.sequence(1, 3)}">
<span th:if="${i == curpage}">
<a href="/listEmployee/${i}" class="btn btn-success custom-width" th:text="${i}"></a
</span>
<span th:unless="${i == curpage}">
<a href="/listEmployee/${i}" class="btn btn-danger custom-width" th:text="${i}"></a> 
</span>
</span>
</div>

在此输入图片描述


1
投票

If-then-else 有 2 种变体。

第一:

<form method="get" th:action="@{/{id}(id=${user.isAdmin()}?'admin':'user')}">
    <input type="submit" value="to Main"/>
</form>

第二:

<th:block th:if!="${branchMessages.isEmpty()}">
    ...
</th:block>
<th:block th:unless="${branchMessages.isEmpty()}">
    ...
</th:block>

1
投票

当我想根据用户的性别显示照片时,这对我有用:

<img th:src="${generou}=='Femenino' ? @{/images/user_mujer.jpg}: @{/images/user.jpg}" alt="AdminLTE Logo" class="brand-image img-circle elevation-3">

0
投票

当使用 2 个独立的块时,If 和 except 有时无法提供预期结果。 If 和 else 也可以通过在第一个块中使用 if 语句来实现条件 1 (TRUE),第二个 if 语句是第一个条件失败时的第二个块中的替代选择 (FALSE)。

希望这会有所帮助。

<div th:with="condition=${potentially_complex_expression}" th:remove="tag">
   //True
   <h2 th:if="${if_condition}">Hello!</h2>

   //False
   <h2 th:if="${alternative_for_false}">Something else</h2>
</div>

0
投票

如何在 Thymeleaf 中执行 if-else 操作?

上面的问题可以通过使用 th:if 和 th:unless 条件概念来解决。

有时,您需要模板的片段仅在满足特定条件时才出现在结果中。

例如,您希望在导航面板上根据登录用户角色显示菜单选项。

例如,管理员用户将有不同的菜单选项,简单用户将有不同的菜单选项。

其语法如下。

<div th:if="${condition}">
   <p>True condition related code.</p>
</div>
<div th:unless="${condition}">
 <p>False condition related code</p>
</div>

您可以从此资源探索更多内容。

如果喜欢请订阅频道。

© www.soinside.com 2019 - 2024. All rights reserved.