String a = "Hello";
int a = 10 * 20;
Hello -> 문자 리터럴
10, 20 -> 숫자 리터럴
타임리프에는 다음과 같은 리터럴 존재.
단, 공백없이 쭉 이어져있다면 하나의 의미있는 토큰으로 인지해서 작은 따옴표를 생략할 수 있다.
<span th:text="hello world!"></span>
-> 공백이 존재해서 하나의 의미있는 토큰으로 인식안됨.
<span th:text="'hello world!'"></span>
-> 따옴표로 감싸면 정상 동작
>(gt) , < (lt) , >=(ge), <= (le), !(not), == (eq) ,!=(neq,ne)
괄호안에 문자로 적어도 적용됨.
<li>${data}?: '데이터가 없습니다.' = <span th:text="${data}?: '데이터가 없습니다.'"</span></li>
date가 조건에 만족하면 data가 찍히고 만족하지 않는다면 '데이터가 없습니다'가 찍힘.
<li>${data}?: _ = <span th:text="${data}?: _">데이터가 없습니다.</span></li>
data가 조건에 만족하면 data가 찍히고 만약 데이터가 없는 경우에는 타임리프가 실행되지않고 적어둔 문자가 출력됨 -> "데이터가 없습니다" 가 출력.
th:checked 는 값이 false 인경우 check 속성 자체를 제거한다.
<input type="checkbox" name="active" th:checked="false"/>
타임리프 렌더링시
<input type="checkbox" name="active" />
제거된 상태로 나옴.
<tr th:each="user : ${users}">
<td th:text="${user.username}">username</td>
</tr>
반복시 컬렉션인 ${users} 의 값을 하나씩 꺼네서 외쪽 변수 user에 담아서 태그를 반복 실행
반복 상태 유지 기능
@GetMapping("/each")
public String each(Model model){
addUsers(model);
return "basic/each";
}
private void addUsers(Model model) {
List<User> list = new ArrayList<>();
list.add(new User("userA",10));
list.add(new User("userB",20));
list.add(new User("userC",30));
model.addAttribute("users",list);
}
list에 값을 넣어두고 model에 추가
for each 문 예제코드
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>기본 테이블</h1>
<table border="1">
<tr>
<th>username</th>
<th>age</th>
</tr>
<tr th:each="user : ${users}">
<td th:text="${user.username}">username</td>
<td th:text="${user.age}">0</td>
</tr>
</table>
<h1>반복 상태 유지</h1>
<table border="1">
<tr>
<th>count</th>
<th>username</th>
<th>age</th>
<th>etc</th>
</tr>
<tr th:each="user, userStat : ${users}">
<td th:text="${userStat.count}">username</td>
<td th:text="${user.username}">username</td>
<td th:text="${user.age}">0</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>
</table>
</body>
</html>
실행 결과
index 의경우 0번째 부터 시작
count의 경우 1번 부터 시작
size는 list의 총 크기
current -> 현재객체가 뭔지 알려줌.
<!-- 현재 유저가 20살보다 적은 경우 th:if가 true 기 때문에 미성년자 출력
만약 20살보다 많은 경우 렌더링 되지않아서 미성년자가 출력되지않는다.-->
<span th:text="'미성년자'" th:if="${user.age (<)lt 20}"></span>
<!-- th:unless는 if문의 반대의미-->
<span th:text="'미성년자'" th:unless="${user.age (>)ge 20}"></span>
<td th:switch="${user.age}">
<span th:case="10">10살</span>
<span th:case="20">20살</span>
<span th:case="*">기타</span>
</td>