在Thymeleaf中如何if-else?


132

怎样做一个简单的最好办法if- else在Thymeleaf?

我想在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标签:假设h2span

您能建议一种更好的方法吗?

Answers:


208

Thymeleaf具有等效于<c:choose><c:when>:所述th:switchth:case在Thymeleaf 2.0属性引入。

它们按照您的期望工作,使用*默认情况:

<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>

这个语法简单的解释(或Thymeleaf教程)。

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


好的,但是..我如何根据客户的类型(即匿名或已登录)调用javascript ...
幸运

1
参见“文本内联”一章,明确了“内联的JavaScript”部分,在“使用Thymeleaf”教程thymeleaf.org/documentation.html
丹尼尔·费尔南德斯

我该如何:打开iterator.index值?我想做一组值小于5的情况,如果值大于5则切换到默认情况
Loser Coder 2014年

@DanielFernández:能否请您帮助我stackoverflow.com/questions/48499723/…。我无法直接在问题上加上标签。真的卡住了。
码头

98

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

5
这不能回答OP的问题,因为那是关于避免重复复杂的表达式。与其他解决方案一样,这打破了“自然模板”的想法,这是Thymeleaf的主要卖点。我不确定自己要怎么做,只是想指出一点,以防有人回答。
史蒂芬·哈里森

@Lucky,这给我一个错误EL1007E:(pos 0):找不到属性或字段“状态”
Jesse

@Jackie在上面的示例中,customer类中的customer是一个对象,anonymous是一个布尔字段。确保您的对象不为空并且字段名称正确。
幸运

25

除了丹尼尔·费尔南德斯(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>

这是一个复杂的表达式,带有混合的“身份验证”和“授权”实用程序对象,它们为百里香模板代码产生“真/假”结果。

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


19

您可以使用

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

例:

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

对于新人问同样的问题可能很有用。


11

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

<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


我认为您在代码中添加了额外的“ =”符号。如果我正确,请再次验证并更正。
2015年

我认为代码还可以。我不知道您指的是哪个额外的“ =”符号。
jareks 2015年

是的,代码还可以。抱歉,我将其与th:each表达式的位置混淆了,:而不是=
幸运的2015年

但是这个答案非常接近我的解决方案。在执行th:with表达时,对我来说似乎是多余的。基本上,此解决方案使用th:if和th:除非条件语句。
2015年

我认为这不是多余的。如果您仅使用th:if和th:除非复杂表达式将执行两次...
jareks 2015年


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。

使用not也可以,但是恕我直言,使用th:unless而不是用来否定条件更易读not


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

使用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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.