Thymleaf switch语句有多个case

Far*_*ook 14 java thymeleaf spring-boot

简而言之

我希望在一次写入多个case语句时,在thymeleaf中使用switch语句.

详细地

我想在百里香中实现这一点

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

我当前的thymleaf代码因运行时错误而失败

 <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>                             
Run Code Online (Sandbox Code Playgroud)

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

org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: "'COMPLETE','INVALID'"...
Run Code Online (Sandbox Code Playgroud)

注意:我知道上述错误消息的原因.我只需要知道一种方法来实现单个输出的多个案例的切换

pen*_*-69 33

失败的原因是您在第一种情况下没有有效的表达式.特别,

'COMPLETE','INVALID'
Run Code Online (Sandbox Code Playgroud)

不是一个有效的表达.我怀疑你要做的是包括div,如果状态是COMPLETE或INVALID.不幸的是,我相信您必须单独复制这些条件的标记.让我建议以下标记:

<!-- 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>
Run Code Online (Sandbox Code Playgroud)

或者你可以诉诸于:如果在这种情况下哪个可能实际上更好:

<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>
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

<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>
Run Code Online (Sandbox Code Playgroud)


Jim*_*ugh 7

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

  <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>
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我使用开关有条件地将 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用 Thymeleaf th:class

<tr th:class="${datafile.bootstrapTableRowClassForStatus}">
Run Code Online (Sandbox Code Playgroud)

在我的页面上,这将根据 Java 对象中 Status 枚举的值将 Bootstrap 颜色样式应用于我的表行。

  • 这是处理枚举的实际解决方案。一直在努力解决这个问题,直到我找到你的答案。谢谢吉姆·强硬 (2认同)