programing

여러 개의 대소문자가 있는 Tymleaf 스위치 문

cafebook 2023. 3. 4. 15:09
반응형

여러 개의 대소문자가 있는 Tymleaf 스위치 문

요컨대

한 번 여러 개의 케이스 스테이트먼트에 로직을 쓴 스위치 스테이트먼트를 Tymeleaf에 넣고 싶다.

상세하게

나는 이것을 백일엽에 구현하고 싶다.

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'"...

메모: 위의 오류 메시지의 원인을 알고 있습니다.1개의 출력에 복수의 케이스가 있는 스위치를 실장하는 방법만 알면 된다.

실패의 원인은 첫 번째 경우 올바른 표현이 없기 때문입니다.구체적으로는

'COMPLETE','INVALID'

는 유효한 표현이 아닙니다.상태가 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:에 의존할 수 있습니다.

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

오늘도 같은 이슈를 맞췄는데, 여기서 오브젝트는th:switch는 Java 열거형입니다.결국 이것이 Java equals() 대 ==의 문제라는 것을 알게 되었습니다.에서th:switch열거형 오브젝트가 있는데th:caseString 개체가 있습니다.Tymeleaf 문자열 함수를 사용하여 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>

위의 예에서는 스위치를 사용하여 테이블셀에 부트스트랩 스타일을 조건부로 적용하고 있습니다.


대체 솔루션은 Java 코드로 논리를 수행하고 출력 값을 개체 속성으로 표시한 다음 Tymeleaf 템플릿에서 해당 속성을 참조하는 것입니다.다음과 같은 경우:

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

그리고 나는 티멜리프를 사용한다.th:class:

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

my page에서는 Java 객체의 my Status enum 값에 따라 테이블 행에 Bootstrap 색상 스타일이 적용됩니다.

pens-fan-69가 이 타입의 스위치에 응답했기 때문에

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

Tymeleaf에서만 번역할 수 있습니다.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>

언급URL : https://stackoverflow.com/questions/29657648/thymleaf-switch-statement-with-multiple-case

반응형