在Thymeleaf怎么做if-else?

时间:2012-11-21 13:13:19

标签: java jsp if-statement jstl thymeleaf

在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}"

重要的是我使用了2个不同的html标签:让我们说h2span

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

11 个答案:

答案 0 :(得分:178)

Thymeleaf相当于<c:choose><c:when>:Thymeleaf 2.0中引入的th:switchth: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>

有关语法(或百里叶教程)的快速解释,请参阅http://www.thymeleaf.org/whatsnew20.html#swit

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

答案 1 :(得分:71)

我尝试使用此代码查看客户是否已登录或匿名。我确实使用了th:ifth: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>

答案 2 :(得分:19)

除了DanielFerná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>

这是带有混合“身份验证”和“授权”实用程序对象的复杂表达式,它会为百万美元模板代码生成“true / false”结果。

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

答案 3 :(得分:17)

您可以使用

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

示例:

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

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

答案 4 :(得分:9)

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

<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

答案 5 :(得分:8)

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

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

答案 6 :(得分:6)

另一个解决方案是使用not来获得相反的否定:

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

正如documentation中所述,它与使用th:unless相同。正如其他答案所解释的那样:

  

此外,th:if还有一个反向属性th:unless,我们可以拥有它   在前面的示例中使用,而不是在OGNL中使用not   表达

使用not也有效,但恕我直言,使用th:unless更可行,而不是用not来否定条件。

答案 7 :(得分: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>

答案 8 :(得分: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>

enter image description here

答案 9 :(得分:1)

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>

答案 10 :(得分:0)

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

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