타임리프는 기존 것을 대체하는 식이다. 없으면 html 그대로 출력된다. 그래서 그냥 html문서로 열어도 되긴 된다. 단, 타임리프는 자바가 실행시켜주는 것 이므로 타임리프로 대체는 할 수 없다.
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<link th:href="@{/css/bootstrap.min.css}"
href="../css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container" style="max-width: 600px">
<div class="py-5 text-center">
<h2>상품 목록</h2>
</div>
<div class="row">
<div class="col">
<button class="btn btn-primary float-end"
onclick="location.href='addForm.html'"
th:onclick="|location.href='@{/basic/items/add}'|"
type="button">상품
등록</button>
</div>
</div>
<hr class="my-4">
<div>
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>상품명</th>
<th>가격</th>
<th>수량</th>
</tr>
</thead>
<tbody>
<tr th:each="item : ${items}">
<td><a href="item.html"
th:href="@{/basic/items/{itemId}(itemId=${item.id})}"
th:text="${item.id}">상품ID</a></td>
<td><a href="item.html"
th:href="@{|/basic/items/${item.id}|}"
th:text="${item.itemName}">상품이름</a></td>
<td th:text="${item.price}">가격</td>
<td th:text="${item.quantity}">수량</td>
</tr>
</tbody>
</table>
</div>
</div> <!-- /container -->
</body>
</html>
만약 th:text="${item.id}">상품ID</a></td>
여기서 item.id에 대한 정보가 없으면 그냥 상품ID라고 나오고, 있으면 저 item.id가 대체되어 출력된다.
참고로 타임리프는 자바측에서 실행시켜주는거다. view.render()할 때 실행시켜주는 듯.
time.id는 프로퍼티 접근법이다. 저거 쓰면 time.getId()를 해주는 거다.
@{~~~} 이것이 url 링크 표현식이다.
<link th:href="@{/css/bootstrap.min.css}"
href="../css/bootstrap.min.css" rel="stylesheet">
이것도 url상의 /css/bootstrap.min.css에 있는 css 정보를 가져오는..
url쓸 때 이거 쓰면 된다.
th:href="@{/basic/items/{itemId}(itemId=${item.id})}"
이거는 경로변수,
{변수이름}(변수이름=${값})
이라고 해야 할 지.. 값이라기 보다는 그 값이 변수이름이 되니.
item.id가 {itemId} 대신에 들어간다.
<tr th:each="item : ${items}">
<td><a href="item.html"
th:href="@{/basic/items/{itemId}(itemId=${item.id})}"
th:text="${item.id}">상품ID</a></td>
<td><a href="item.html"
th:href="@{|/basic/items/${item.id}|}"
th:text="${item.itemName}">상품이름</a></td>
<td th:text="${item.price}">가격</td>
<td th:text="${item.quantity}">수량</td>
</tr>
th:each는 반복문이다.
${items}에 있는(자바로부터 items라는 키로 모델에 담겨서 넘어온) 개개들을 item이라는 이름으로 사용한다는 거다.
그냥 저렇게 되면 반복문 태그로 바뀐다고 보면 된다. 그러므로 만약 ${items}에 있는게 0개라면 저게 하나도 태그에 포함되지 않는다.
th:href="@{|/basic/items/${item.id}|}"
| | 이거는 자바스크립트의 ` `나 c#의 $" "였었나, 그 문자열 문맥 상에 변수 쉽게 쓰는 그거다.
|안녕, ${username}아!|
이런 식이다.
문법상 저거 누르면
http://localhost:8080/basic/items/1
만약 아이템 id가 1이라면 저렇게 이동한다는 뜻이다.
th:onclick="|location.href='@{basic/items}'|"
이것도 안써도 될것 같지만 저 작은따옴표때문에 써야 한다. 원래 저 작은 따옴표 저기 안에서 쓸려면 \' 이런 식으로 써야 함.
변수는 ${변수이름} 이렇게 표현된다.
여기는 model에서 넘어온 키의 이름으로 쓴다.
아니면 <tr th:each="item : ${items}"> 여기서 ${item} 이렇게 item을 쓸 때 라던지..
프로퍼티 접근이 가능하고, 당연히 ${item.getId()}도 된다. 도 된다라기 보다는 원래 저거다.
참고로, 만약
th:href="@{/basic/items/{itemId}(itemId=${item.id})}"
여기서 itemId=${iteem.id} 말고도 추가로 더 쓰면
th:href="@{/basic/items/{itemId}(itemId=${item.id}, key='value')}"
이렇게 콤마로 뭐=뭐 더 추가해서 쓰면
http://localhost:8080/basic/items/1?key=value
이렇게 쿼리로 만들어 진다.
추가로, 조건문도 가능하다.
<h2 th:if="${param.succesed}" th:text="'저장완료!!'"></h2>
이렇게 하면, 만약 조건이 참이면 저 태그를 사용하는 듯 하다. 아니면 사용안하고.
<div th:if="${info.useYn == 'Y'}">사용</div>
<div th:unless="${info.useYn == 'Y'}">사용안함</div>
이건 if-else
아 그리고 추가로, param 저거는 우리가 따로 지정안해도 쓸 수 있는 쿼리파라미터이다. 쿼리파라미터가 저기로 들어간다. Map 형식으로 있었던 듯? GET쿼리파라미터 말고도 Post Form까지는 받을 듯. @RequestParam 범위일 듯.
<form action="item.html" th:action method="post">
이렇게 그냥 th:action 쓰면, 지금 url로 간다는 뜻이다. 즉, 만약 저 form의 submit을 누르면 지금 url로 post로 요청이 간다.
이렇게 하면 이제 html따로 서버사이드 따로 발전이 가능하다.
'스프링 > 3. 스프링 MVC' 카테고리의 다른 글
55. 컨트롤러 구현 (0) | 2023.08.15 |
---|---|
53. 도메인 (0) | 2023.08.14 |
52. 요구사항 (0) | 2023.08.14 |
51. 요청 파라미터 및 메시지바디의 데이터 정리 (0) | 2023.08.13 |
50. 스프링MVC 구조 전체정리. (0) | 2023.08.13 |