✅ 타임리프 사용 선언
<html xmlns:th="http://www.thymeleaf.org">
✅ URL 링크 표현식 - @{...}
<link th:href="@{/css/bootstrap.min.css}"
href="../css/bootstrap.min.css" rel="stylesheet">
✅ 속성 변경 - th:href
✅ 반복출력 - th:each
href
속성이 사용되고, 뷰 템플릿을 거치면 th:href
의 값이 href
로 대체되면서 동적으로 변경할 수 있다 <tr th:each="item : ${items}">
<td><a href="items.html" th:href="@{/basic/items/{itemId}(itemId=${item.id})}" th:text="${item.id}">회원id</a></td> <!-- 정적일때는 items.html이 열리고, 렌더링됬을때는 th:href= 안의 주소들로 치환됨 -->
<td><a href="items.html" th:href="@{|/basic/items/${item.id}|}" th:text="${item.itemName}">상품명</a></td>
<td th:text="${item.price}">10000</td>
<td th:text="${item.quantity}">10</td>
</tr>
✅ 타임리프 핵심
th:xxx
가 붙은 부분은 서버사이드에서 렌더링 되고, 기존 것을 대체한다th:xxx
가 있어도 웹브라우저는 ht:
속성을 인식하지 못함✅ 상품 등록 품으로 이동 - th:onclick
<button class="btn btn-primary float-end"
onclick="location.href='addForm.html'"
th:onclick="|location.href='@{/basic/items/add}'|"
type="button">상품 등록
</button>
✅ 변수 표현식 - ${...}
item.getPrice()
✅ 내용 변경 - th:text
<td th:text="${item.price}">10000</td>
✅ 속성 변경 - th:value
<div>
<label for="itemId">상품 ID</label>
<input type="text" id="itemId" name="itemId" class="form-control"
value="1" th:value="${item.id}" readonly>
</div>
<div>
<label for="itemName">상품명</label>
<input type="text" id="itemName" name="itemName" class="form-control"
value="상품A" th:value="${item.itemName}" readonly>
</div>
<div>
<label for="price">가격</label>
<input type="text" id="price" name="price" class="form-control"
value="10000" th:value="${item.price}" readonly>
</div>
<div>
<label for="quantity">수량</label>
<input type="text" id="quantity" name="quantity" class="form-control"
value="10" th:value="${item.quantity}" readonly>
</div>
✅ 속성 변경 - th:action
상품등록 폼 : GET -> /basic/items/add
상품 등록 처리 : POST -> /basic/items/add
✅ 타임리프 장점
JSP 파일은 웹 브라우저에서 열면 JSP 소스코드와, HTML이 뒤죽박죽 되어있어서 정상 확인이 불가능
-> 오직 서버를 통해서만 JSP를 열어야 함
순수 HTML
을 그대로 유지하면서 뷰 템플릿
도 사용할 수 있는 타임리프의 특징네츄럴 템플릿
이라고 한다