简而言之
我希望在一次写入多个案例陈述的过程中,在thymeleaf中使用switch语句。
详细
我想在百里香中实现这个目标
switch(status.value){
case 'COMPLETE':
case 'INVALID':
//print exam is not active
break;
case 'NEW':
//print exam is new and active
break;
}
我当前的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>
但是上面的代码失败了,错误
org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: "'COMPLETE','INVALID'"...
注意:我知道上述错误消息的原因。我需要的是知道一种方法来实现具有单个输出的多个案例的开关
答案 0 :(得分:32)
失败的原因是您在第一种情况下没有有效的表达式。具体地,
'COMPLETE','INVALID'
不是有效的表达式。我怀疑你要做的是包括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>
或者你可以求助于:如果在这种情况下哪种方式可能更好:
<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>
答案 1 :(得分:1)
我今天遇到了同样的问题,我的 th:switch
中使用的对象是 Java 枚举。我最终发现这是 Java 的 equals() 与 == 问题。在 th:switch
我有一个枚举对象,但在我的 th:case
我有一个 String 对象。我通过使用 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>
在上面的示例中,我使用 switch 有条件地将 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";
}
}
然后我使用 Thymeleaf th:class
:
<tr th:class="${datafile.bootstrapTableRowClassForStatus}">
在我的页面上,这将根据 Java 对象中我的 Status 枚举值将 Bootstrap 颜色样式应用于我的表格行。
答案 2 :(得分:0)
当 pens-fan-69 回答这种类型的开关时
switch(status.value){
case 'COMPLETE':
case 'INVALID':
break;
case 'NEW':
break;
}
只能在 Thymeleaf 中翻译成以下 switch
语句(如果你想保留 switch-case
语法)而不是用 if-else
回复它
<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 代码(在本例中为 COMPLETE
和 INVALID
)。这可以通过使用 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>
然后在 switch
中您可以重用这些块以减少代码重复
<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>