스프링의 SpringEL 문법 통합
${@myBean.doSomething()} 처럼 스프링 빈 호출 지원
편리한 폼 관리를 위한 추가 속성
th:object(기능강화, 폼 커맨드 객체 선택)
th:field,th:errors,th:errorclass
폼 컴포넌트 기능
스프링 메시지, 국제화 기능 편리한 통합
스프링의 검증, 오류 처리 통합
스프링의 변환 서비스 통합
타임리프를 추가해서 변경
<form action="item.html" th:action th:object="${item}" method="post">
<div>
<label for="itemName">상품명</label>
<input type="text" id="itemName" th:field="*{itemName}" class="form-control" placeholder="이름을 입력하세요">
</div>
<div>
<label for="price">가격</label>
<input type="text" id="price" th:field="*{price}" class="form-control" placeholder="가격을 입력하세요">
</div>
<div>
<label for="quantity">수량</label>
<input type="text" id="quantity" th:field="*{quantity}" class="form-control" placeholder="수량을 입력하세요">
</div>
</form>
th:object="${item}" : form 에서 사용할 객체 지정
th:field="*{itemName}"
템플릿에서 th:obejct="${item}"에서 item에 대한 정보를 전달 받지 못해서 발생했던 오류
처음 입력 폼 페이지 조회시 입력폼은 전부 비어져있어야하기 때문에 빈객체를 전달 해줘야한다.
<hr class="my-4">
<div>판매 여부</div>
<div>
<div class="form-check">
<input type="checkbox" id="open" name="open" class="form-check-input">
<label for="open" class="form-check-label">판매 오픈</label>
</div>
</div>
문제를 해결하는 방법
<hr class="my-4">
<div>판매 여부</div>
<div>
<div class="form-check">
<input type="checkbox" id="open" name="open" class="form-check-input">
<input type="hidden" name="_open" value="on"/>
<label for="open" class="form-check-label">판매 오픈</label>
</div>
</div>
<div>판매 여부</div>
<div>
<div class="form-check">
<input type="checkbox" id="open" th:field="*{open}" class="form-check-input">
<label for="open" class="form-check-label">판매 오픈</label>
</div>
</div>
th:field="*{open}" 를 통해서 타임리프 기능을 추가
실행시 자동으로 _open으로 된 hidden 필드 부분을 만들어주는 것을 알 수 있다.
@ModelAttribute 를 컨트롤러에 있는 별도의 메서드에 적용할 수 있다.
@ModelAttribute("regions")
public Map<String,String> regions(){
Map<String,String > regions = new LinkedHashMap<>();
regions.put("SEOUL","서울");
regions.put("BUSAN","부산");
regions.put("JEJU","제주");
return regions;
//model.addAttribute("regions",regions) 가 들어가게된다.
}
이렇게 별도로 만들어 두게되면 regions에서 반환한 값이 자동으로 모델에 담기게 된다.
이렇게 하지않고 ,각각의 컨트롤러 메서드에서 모델에 직접 데이터를 담아서 처리하는 것도 상관없다.
동적으로 변하지 않는다면 정적으로 어딘가에 선언해두고 사용하는게 메모리적으로 좋다.
<!-- multi checkbox -->
<div>
<div>등록 지역</div>
<div th:each="region : ${regions}" class="form-check form-check-inline">
<input type="checkbox" th:field="*{regions}" th:value="${region.key}"
class="form-check-input">
<label th:for="${#ids.prev('regions')}"
th:text="${region.value}" class="form-check-label">서울</label>
</div>
</div>
번호를 임의로 붙여준 모습