Thymeleaf에서 if-else를 수행하는 방법?


132

간단하게 할 수있는 가장 좋은 방법은 무엇입니까 if- elseThymeleaf의는?

나는 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.

그것을 달성하는 더 좋은 방법을 제안 할 수 있습니까?

답변:


208

Thymeleaf은에 동등 물이있다 <c:choose>하고 <c:when>다음을 th:switch하고 th:caseThymeleaf 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의 저자입니다.


ok but .. 어떻게 고객 유형에 따라 자바 스크립트를 호출합니까 (예 : 익명 또는 로그인) ...
Lucky

1
특히은 "사용 Thymeleaf"에서 섹션을 "자바 스크립트는 인라인", "텍스트 인라인"장을 참조하십시오 튜토리얼 thymeleaf.org/documentation.html
다니엘 페르난데스

어떻게 iterator.index 값을 켤 수 있습니까? <값 인 경우 기본 케이스 (5), 및 스위치> 나는 값이 경우 설정을 수행 할 5
패자 코더

@ 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의 주요 판매 지점 인 "자연 템플릿"아이디어를 깨뜨립니다. 자신에 대해 무엇을 해야할지 확실하지 않지만 누군가 대답이있는 경우 지적하고 싶었습니다.
Stephen Harrison

@ 행운이 오류 나에게 EL1007E를 제공 : (pos 0) : 속성 또는 필드 '상태'를 찾을 수 없습니다
제시

@Jackie 위의 예제에서 customer는 객체이고 anonymous는 Customer 클래스의 부울 필드입니다. 객체가 null이 아니고 필드 이름이 올바른지 확인하십시오.
Lucky

25

Daniel Ferná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 템플릿 코드에 대해 'true / false'결과를 생성하는 'authentication'및 'authorization'유틸리티 객체가 혼합 된 복잡한 표현입니다.

'authentication'및 'authorization'유틸리티 오브젝트는 thymeleaf extras springsecurity3 library 에서 가져 왔습니다 . '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


코드에 "="기호를 추가했다고 생각합니다. 다시 확인하고 옳다면 수정하십시오.
Lucky Lucky

내 의견으로는 코드가 괜찮습니다. 어떤 여분의 '='기호가 무엇인지 알 수 없습니다.
jareks

예, 코드는 괜찮습니다. 죄송합니다, 대신 th:each표현 의 위치 와 혼동했습니다:=
Lucky

그러나이 답변은 내 솔루션에 매우 가깝습니다. th : ​​with expression을 수행하는 동안 나에게 중복되는 것처럼 보입니다. 기본적으로이 솔루션은 조건문이 없으면 th : if 및 th : un을 사용합니다.
럭키

나는 그것이 중복되지 않는다고 생각합니다. 만약 복잡한 표현이 두 번 실행되지 않는다면 th : if와 th : 만 사용한다면 ...
jareks

9

더 간단한 경우 (html 태그가 동일한 경우) :

<h2 th:text="${potentially_complex_expression} ? 'Hello' : 'Something else'">/h2>

이 표현에 'Hello'와 'Something else'에 대한 번역을 추가하는 방법을 알고 있습니까?
Laura

@Laura 국제화를 사용하고 속성 파일의 위치에 따라 다른 언어 번역을로드 할 수 있습니다. 참조 looksok.wordpress.com/tag/internationalization , marcelustrojahn.com/2016/12/...
럭키

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역 속성이 있습니다.이 속성 은 OGNL 표현식 내부에서 not을 사용하는 대신th:unless 이전 예제에서 사용할 수있었습니다.

를 사용하면 not작동하지만 IMHO로 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:switchif-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:switchA와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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.