이어서 타임리프 문법에 대해서 알아보겠다.
리터럴은 많이 접한 단어일 것이다.
리터럴은 고정된 값을 말한다.
int a = 10이라하면 10은 숫자 리터럴이다.
타임리프는 문자, 숫자, 불린, null 리터럴이 있다.
타임리프에서는 문자 리터럴은 ' ' 작은 따옴표로 감싸야하지만 공백없이 쭉 이어진다면 작은 따옴표를 생략할 수 있다.
<span th:text="hello world!"> (X)
<span th:text="'hello world!'"> (O)
하지만 | |를 사용하면 띄어쓰기가 있더라도 ''를 생략할 수 있다.
data는 model.addAttribute("data", "Spring!");라 생각하자.
<span th:text="|hello ${data}|">
타임리프에서의 연산은 우리가 프로그래밍을 하면서 사용한 연산과 비슷해서 쉽게 학습할 수 있을 것이다.
<span th:text="10+2">
<span th:text="10 % 2">
<span th:text="1 > 10"> <!-- 1 > 10 -->
<span th:text="(10 % 2 == 0) ? '짝수' : ' 홀수'">
Elvis 연산자
data에 값이 있으면 출력하고 없으면 '데이터가 없습니다'를 출력한다.
조건식의 축약버전같은 느낌이라고 생각하면된다.
"${data}?:"연산자는 data에 데이터가 없으면 를 실행하는데 _는 어떠한 연산도 수행하지 않겠다는 의미이다.
<span th:text="${data}?:'데이터가 없습니다'"></span>
<span th:text="${data}?:_"></span>
<tr th:each="user : ${users}">
<td th:text="${user.username}">username</td>
<td th:text="${user.age}">age</td>
</tr>
반복 결과 생성된 태그들
<tr>
<td>UserA</td>
<td>10</td>
</tr>
<tr>
<td>UserB</td>
<td>20</td>
</tr>
<tr>
<td>UserC</td>
<td>30</td>
</tr>
<tr th:each="user, userStat : ${users}">
<td th:text="${userStat.count}"></td>
<td th:text="${user.username}"></td>
<td th:text="${user.age}"></td>
<td>
index = <span th:text="${userStat.index}"></span>
count = <span th:text="${userStat.count}"></span>
size = <span th:text="${userStat.size}"></span>
even? = <span th:text="${userStat.even}"></span>
odd? = <span th:text="${userStat.odd}"></span>
first? = <span th:text="${userStat.first}"></span>
last? = <span th:text="${userStat.last}"></span>
current = <span th:text="${userStat.current}"></span>
</td>
</tr>
타임리프의 조건식은 th:if , th:unless, switch문이 있다.
만약 조건문을 충족하면 태그가 보이지만 조건문을 충족하지 못하면 태그 자체가 안보인다.
바로 예시를 보자.
th:if , th:unless
<span th:text="'미성년자'" th:if="${user.age lt 20}"></span>
<span th:text="'미성년자'" th:unless="${user.age ge 20}"></span>
th:switch
<td th:switch="${user.age}">
<span th:case="10">10살</span>
<span th:case="20">20살</span>
<span th:case="*">기타</span>
</td>
타임리프에서 블록은 th:block인데 이 문법은 HTML문법이 아닌 타임리프 자체의 태그이다.
약간 특별한 경우일 때 사용하는데
예를들어 다음과 같은 코드를 하나의 묶음으로 반복하고 싶을 수 있다.
<div>
사용자 이름1 <span th:text="${user.username}"></span>
사용자 나이1 <span th:text="${user.age}"></span>
</div>
<div>
요약 <span th:text="${user.username} + '/' + ${user.age}"></span>
</div>
그런데 만약 아래와 같이 작성하면
<div th:each="user : ${users}">
사용자 이름1 <span th:text="${user.username}"></span>
사용자 나이1 <span th:text="${user.age}"></span>
</div>
<div>
요약 <span th:text="${user.username} + '/' + ${user.age}"></span>
</div>
이 부분들만 반복되서 출력된다.
<div th:each="user : ${users}">
사용자 이름1 <span th:text="${user.username}"></span>
사용자 나이1 <span th:text="${user.age}"></span>
</div>
그래서 이럴때 th:block 태그를 사용해주면 해결할 수 있다.
<th:block th:each="user : ${users}">
<div>
사용자 이름1 <span th:text="${user.username}"></span>
사용자 나이1 <span th:text="${user.age}"></span>
</div>
<div>
요약 <span th:text="${user.username} + '/' + ${user.age}"></span>
</div>
</th:block>
참고로 <th:block>태그는 렌더링시 사라진다.