当前位置: 首页 > 知识库问答 >
问题:

带多个case的Thymleaf开关语句

何聪
2023-03-14

在短

我想在thymeleaf中有一个switch语句,逻辑一旦写入多个case语句。

详细地

我想在thymeleaf中实现这一点

switch(status.value){
  case 'COMPLETE':
  case 'INVALID':
     //print exam is not active
     break;
  case 'NEW':
     //print exam is new and active
     break;
}

我当前的胸腺叶代码失败并出现运行时错误

 <div th:switch="${status.value}">
      <div th:case="'COMPLETE','INVALID'">
         <!-- print object is not active -->
      </div>
      <div th:case="NEW'">
         <!-- print object is new and active -->
      </div>
 </div>                             

但是上面的代码错误地失败了

org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: "'COMPLETE','INVALID'"...

注意:我知道出现上述错误消息的原因。我所需要的只是知道一种方法来实现单输出的多情况切换

共有3个答案

申屠昆
2023-03-14

当pens-fan-69回答这种类型的开关时

switch(status.value){
  case 'COMPLETE':
  case 'INVALID':
     break;
  case 'NEW':
     break;
}

只能在Thymeleaf中翻译为以下switch语句(如果您想保留switch case语法),如果不是,则不要用switch case回复

<th:block th:switch="${status.value}">
    <div th:case="'COMPLETE'">
        <!-- print object is not active -->
    </div>
    <div th:case="'INVALID'">
        <!-- print object is not active -->
    </div>
    <div th:case="'NEW'">
        <!-- print object is new and active -->
    </div>
</th:block>

我面临的一个问题是,在这种情况下,我必须复制大量HTML代码(在这种情况下,是为了完整和无效)。这可以通过使用th:fragment并像这样重用它们来缓解:

<th:block th:fragment="complete-or-invalid-case">
  <!-- your HTML for complete or invalid case -->
</th:block>

<th:block th:fragment="new-case">
  <!-- your HTML for new case -->
</th:block>

然后在开关中可以重用这些块,从而减少代码重复性

<th:block th:switch="${status.value}">
    <div th:case="'COMPLETE'" th:include="this :: complete-or-invalid-case"></div>
    <div th:case="'INVALID'" th:include="this :: complete-or-invalid-case"></div>
    <div th:case="'NEW'" th:include="this :: new-case"></div>
</th:block>

华良平
2023-03-14

今天我遇到了同一个问题,在我的th:switch中使用的对象是Java枚举。我最终发现这是一个Java equals()与==的问题。在th:switch中,我有一个enum对象,但在th:case中,我有一个String对象。我通过使用Thymeleaf字符串函数将enum对象转换为字符串来解决这个问题,然后一切都正常了。

  <div th:switch="${#strings.toString(datafile.status)}">
      <td th:case="'SUCCESS'" class="table-success">SUCCESS</td>
      <td th:case="'FAILED'" class="table-danger">FAILED</td>
      <!-- default case -->
      <td th:case="*" th:text="${#strings.toString(datafile.status)}" class="table-secondary">xxx</td>
  </div>

在我上面的示例中,我使用开关有条件地将Bootstrap样式应用于表单元格。

另一种解决方案是在Java代码中执行逻辑并将产出值公开为对象属性,然后在Thymeleaf模板中引用该属性。类似于这样:

public String getBootstrapTableRowClassForStatus() {
    Objects.requireNonNull(status);
    switch (status) {
        case SUCCESS:
            return "table-success";
        case FAILED:
            return "table-danger";
        case PROCESSING:
            return "table-info";
        default:
            return "table-secondary";
    }
}

然后我使用Thymeleafth: class

<tr th:class="${datafile.bootstrapTableRowClassForStatus}">

在我的页面上,这将基于Java对象中我的状态枚举的值对我的表行应用引导颜色样式。

董桐
2023-03-14

失败是由于您在第一种情况下没有有效的表达式。具体来说,

'COMPLETE','INVALID'

不是有效的表达式。我怀疑您试图做的是在状态为完整或无效时包含div。不幸的是,我相信您将不得不单独复制这些条件的标记。我建议使用以下标记:

<!-- th:block rather than unneeded div -->
<th:block th:switch="${status.value}">
    <div th:case="'COMPLETE'">
        <!-- print object is not active -->
    </div>
    <div th:case="'INVALID'">
        <!-- print object is not active -->
    </div>
    <div th:case="'NEW'">
        <!-- print object is new and active -->
    </div>
</th:block>

或者,你可以求助于th:if,在这种情况下,哪种方法可能更有效:

html prettyprint-override"><div th:if="${status.value} eq 'COMPLETE' or ${status.value} eq 'INVALID'">
    <!-- print object is not active -->
</div>
<div th:if="${status.value} eq 'NEW'">
    <!-- print object is new and active -->
</div>
<div th:unless="${status.value} eq 'NEW'">
    <!-- print object is not active -->
</div>
<div th:if="${status.value} eq 'NEW'">
    <!-- print object is new and active -->
</div>
 类似资料:
  • 问题内容: 有人可以解释一下为什么我的循环从0变为7吗?我只需要获得前3种情况,但是程序将遍历所有代码。代码位于show()方法中。 问题答案: 因为没有休息。在每种情况下,您都需要break关键字。有关详细说明,请参见switch语句Java教程。 例如 否则,如果上述情况之一被评估为true,则将执行其他情况。

  • 问题内容: 有没有一种方法可以使用IN子句进行CASE语句? 问题答案: 是的。您需要使用表达式的“搜索”形式而不是“简单”形式

  • 问题内容: 我想知道是否可以在case语句的then部分中指定多个值? 我已经在使用此代码的地方附加了一大段代码,以加入查询中的某些表中。我已在代码段中添加了评论。 问题答案: 这有点丑陋,但假设HeadQuarters不是十进制/数字类型,而只是整数值,

  • Erlang提供case语句,可用于根据case语句的输出执行表达式。 本声明的一般形式是 - 语法 (Syntax) case expression of value1 -> statement#1; value2 -> statement#2; valueN -> statement#N end. 本声明的一般工作如下 - 要评估的表达式放在case语句中。 这通常会评估为

  • 目前,我正在使用switch语句。当我有多个带有switch语句的循环时,我会遇到一个问题。 当我退出第二个switch语句(往上说)时,Java抛出,我不太清楚为什么 应该触发新的用户输入? 我希望有人能帮我弄清楚这一点。我还尝试使用,而不使用,但它也出现了同样的错误。

  • 我能描述我正在寻找的最佳方式是向您展示我迄今为止尝试过的失败代码: 我有大约4到5种不同的情况,应该由大约50种不同的值触发。有没有办法用块来做到这一点,或者我应该尝试一个大规模的块?