개발(~국비)/Spring
2.타임리프-스프링 통합과 폼
까만밀가루
2022. 11. 17. 23:57
<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>
- th:object : 커맨드 객체를 지정한다
- th:field : HTML 태그의 속성을 자동으로 처리한다.
체크 박스 - 단일
<!-- single checkbox -->
<div>판매 여부</div>
<div>
<div class="form-check">
<input type="checkbox" id="open" th:field="*{open}" name="open" class="form-check-input">
<!-- <input type="hidden" name="_open" value="on"/> <!– 히든 필드 추가–>-->
<label for="open" class="form-check-label">판매 오픈</label>
</div>
</div>
- th:field 없이 히든 필드 추가
- th:field="*{open}"
- 체크 박스 체크 : open=on&_open=on
- 체크 박스 미체크 : _open=on
체크 박스 - 멀티
@ModelAttribute 의 사용법
컨트롤러의 @ModelAttribute는 별도의 메서드로 적용할 수 있다.
@ModelAttribute("deliveryCodes")
public List<DeliveryCode> deliveryCodes(){
List<DeliveryCode> deliveryCodes = new ArrayList<>();
deliveryCodes.add(new DeliveryCode("FAST","빠른 배송"));
deliveryCodes.add(new DeliveryCode("NORMAL","일반 배송"));
deliveryCodes.add(new DeliveryCode("SLOW","느린 배송"));
return deliveryCodes;
}
반환값인 deliveryCodes가 자동으로 model에 담기게 된다.
(각각의 컨트롤러 메서드에서 모델에 직접 담아 사용해도 된다)
th:for="${#ids.prev('regions')}"
name 값은 같아도 되지만 id값은 달라야해서 타임 리프는 아이디값을 인식하여 임의로 1,2,3을 붙여준다
<!-- 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>
타임리프 HTML 생성 결과
<!-- multi checkbox -->
<div>
<div>등록 지역</div>
<div class="form-check form-check-inline">
<input type="checkbox" value="SEOUL" class="form-check-input" id="regions1" name="regions"><input type="hidden" name="_regions" value="on"/>
<label for="regions1" class="form-check-label">서울</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" value="BUSAN" class="form-check-input" id="regions2" name="regions"><input type="hidden" name="_regions" value="on"/>
<label for="regions2" class="form-check-label">부산</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" value="JEJU" class="form-check-input" id="regions3" name="regions"><input type="hidden" name="_regions" value="on"/>
<label for="regions3" class="form-check-label">제주</label>
</div>
</div>
regions1,regions2,regions3에 맞추어 순서대로 입력된 것을 알 수 있다.
<!-- multi checkbox -->
<div>
<div>등록 지역</div>
<div th:each="region : ${regions}" class="form-check form-check-inline">
<input type="checkbox" th:field="${item.regions}" th:value="${region.key}" class="form-check-input" disabled>
<label th:for="${#ids.prev('regions')}" th:text="${region.value}" class="form-check-label">서울</label>
</div>
</div>
th:object가 없으면 ${item.regions} 이용
라디오 버튼
하나만 선택할 수 있으며, 이미 선택되어 있다면 수정시에도 항상 하나를 선택하도록 되어 있으므로 체크 박스와 달리 별도의 히든 필드를 사용할 필요가 없다.