Model에 데이터를 담을 때 addAttribute( ) 메소드를 사용
Model addAttribute(String name, Object value)
// 물품조회 목록 생성
@GetMapping(value = "/selectlist.do")
public String selectListGET(Model model){
// 화면나오기전에 아이템데이터 가져와야 함
List<Item> list = itemService.selectListItem();
System.out.println(list.toString());
model.addAttribute("list", list);
return "itemlist";
}
테이블에 데이터 출력하기
➡️ItemController
에서 넘어온list
를 반복문을 이용해 테이블로 출력
1.list
반복문 생성 후 tmp
에 넣는다
<tr th:each="tmp, idx : ${list}">
2. tmp
에 넣은 값 출력
<td th:text="${tmp.no}"></td>
<td th:text="${tmp.name}"></td>
<td th:text="${tmp.price}"></td>
<td th:text="${tmp.quantity}"></td>
<td th:text="${tmp.regdate}"></td>
checkbox
에 선택된 항목의no
들을tmp.value
값으로 넘겨준다
<input type="checkbox" th:value="${tmp.no}" name="no" />
<form>
안에submit
2개 +name
+value값
생성
➡️ 보내는 주소는 같은곳으로 간다 =/item/updatedelete.do
<form th:action="@{/item/updatedelete.do}" method="post"> <input type="submit" name="btn" value="일괄삭제" /> <input type="submit" name="btn" value="일괄수정" />
- 사용자가 화면에서 물품을 선택하지 않고 일괄삭제/일괄수정을 클릭한 경우
원래는 frontend에서 유효성 처리를 진행하여 backend에 빈 데이터를 넘겨주지 않아야 하는게 맞다
backend에서 굳이 처리를 해야겠다면 사용자가no
를 선택하지 않은 상태에서 일괄삭제/일괄수정을 클릭한 경우 물품 목록 화면으로 돌아오게 하면 된다ItemController.java 에서
no
를 받는@RequestParam(name = "no”
에required = false
를 추가해준 후if
문으로 처리 해 준다! 이 코드는if(btn.equals)…
이전에 실행되어야 한다
- 📁 ItemController.java
if (no == null) { // 번호가 없는경우, 오류처리 return "redirect:/item/selectlist.do"; }
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>물품조회</title>
</head>
<body>
<form th:action="@{/item/updatedelete.do}" method="post">
<!-- th:onclick="|javascript:deleteAction()|" -->
<input type="button" name="btn" value="일괄삭제" />
<input type="submit" name="btn" value="일괄수정" />
<table border="1">
<tr>
<th>선택</th>
<th>물품번호</th>
<th>물품명</th>
<th>가격</th>
<th>수량</th>
<th>등록일</th>
</tr>
<tr th:each="tmp, idx : ${list}">
<td><input type="checkbox" th:value="${tmp.no}" name="no" /></td>
<td th:text="${tmp.no}"></td>
<td th:text="${tmp.name}"></td>
<td th:text="${tmp.price}"></td>
<td th:text="${tmp.quantity}"></td>
<td th:text="${tmp.regdate}"></td>
</tr>
</table>
</form>
<script type="text/javascript">
const deleteAction = () => {
const ret = confirm('삭제할까요?');
if (ret === true) {
document.getElementById("form").submit(); // id = form 을 찾아서 submit
} //취소하면 아무일도 일어나지 않음
}
</script>
</body>
</html>
itemlist.html
에서일괄삭제/일괄수정
중 어떤 버튼 눌렀는지 확인하기 위해@RequestParam
으로 받으면 알 수 있다- 선택한
checkbox
의no
는 배열로 온다! 배열로 받기
➡️ 삭제/수정시no
를List
로 담은 형태가 필요하기 때문에List<Long> no
로 받는다
- 수정하려면 선택 항목의
Item
정보 가져오고, 수정할 수 있게 만들어야한다
➡️ 다른 주소로 이동하여 수정 진행, 다른 페이지로 이동시no
정보 가져가기 위해session
에no
를 담고 이동한다- 삭제 후 목록으로 이동해야 한다
// http://127.0.0.1:8080/ROOT/item/updatedelete.do
// 아이템 일괄삭제/일괄수정
@PostMapping(value = "/updatedelete.do")
public String updatedeletePOST(
@RequestParam(name = "btn", required = false) String btn,
@RequestParam(name = "no", required = false) List<Long> no) {
// System.out.println("btn.toString" + btn.toString()); 확인용
// System.out.println("no.toString" + no.toString()); 확인용
if (btn.equals("일괄삭제")) {
// 삭제 후 목록으로 이동
itemService.deleteItem(no);
} else if (btn.equals("일괄수정")) {
httpSession.setAttribute("SESSION_NO", no);
return "redirect:/item/update.do";
}
// 오류시 목록으로 보내기
return "redirect:/item/selectlist.do";
}
- 삭제시
iRepository.deleteItem(no);
➡️ 바로list
의no
를 넣어주면 된다Optional<T>
: 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환
// 물품 일괄수정
public int updateBatch(List<Item> list){
try {
// 수정된 내용 저장될 새 배열 생성
List<Item> saveItem = new ArrayList<>();
// 1. 변경하고자 하는 항목만큼 반복
for( Item item : list ){
// 2. 변경하기 전 내용 가져오기
Item retItem = iRepository.findById(item.getNo()).orElse(null);
if(retItem != null){
// 변경할 항목으로 내용 저장
retItem.setName(item.getName());
retItem.setPrice(item.getPrice());
retItem.setQuantity(item.getQuantity());
// 만들어 놓은 새 배열에 변경항목 넣기
saveItem.add(retItem);
}
}
// 일괄저장
List<Item> retlist = iRepository.saveAll(saveItem);
// 변경여부 확인시 != null보다 방법이 좀 더 상세하다
if(retlist.size() == saveItem.size()){
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
// 물품 일괄삭제
public int deleteItem(List<Long> ids){
try {
iRepository.deleteAllById(ids);
return 1;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
- 기존데이터 가져올
<table>
생성- 수정한 데이터 보낼
<form>
생성 ➡️<form th:action="@{/item.update.do}" method="post">
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>일괄수정</title>
<form th:action="@{/item/update.do}" method="post">
<table border="1">
<tr>
<th>물품번호</th>
<th>물품명</th>
<th>가격</th>
<th>수량</th>
<th>등록일</th>
</tr>
<tr th:each="tmp, idx : ${list}">
<td><input type="text" name="no" th:value="${tmp.no}" readonly style="background-color: #cccccc;"></td>
<td><input type="text" name="name" th:value="${tmp.name}"></td>
<td><input type="text" name="price" th:value="${tmp.price}"></td>
<td><input type="text" name="quantity" th:value="${tmp.quantity}"></td>
<td th:text="${tmp.regdate}" style="background-color: #cccccc;"></td>
</tr>
</table>
<input type="submit" value="일괄수정" />
</form>
</head>
<body>
</body>
</html>
- 아이템 수정 페이지에서 수정 전 데이터 가져올 때
(List<Long>)
형변환시 데이터 손실 가능성이 있어서 주의경고가 뜬다 ➡️@SuppressWarnings("unchecked")
사용하여 형변환 경고 체크하지 않게 설정
// http://127.0.0.1:8080/ROOT/item/updatedelete.do
// 아이템 수정 페이지(데이터 가져오기)
@SuppressWarnings("unchecked") // 형변환 경고 체크하지 않음
@GetMapping(value = "/update.do")
public String updateGET(Model model) {
List<Long> no = (List<Long>) httpSession.getAttribute("SESSION_NO");
List<Item> list = itemService.selectListNoIn(no);
model.addAttribute("list", list);
return "itemupdate";
}
// 물품 수정하기
// http://127.0.0.1:8080/ROOT/item.update.do
@PostMapping(value = "/update.do")
public String updatePOST(
@RequestParam(name = "no") Long[] no,
@RequestParam(name = "name") String[] name,
@RequestParam(name = "price") Long[] price,
@RequestParam(name = "quantity") Long[] quantity) {
List<Item> list = new ArrayList<>();
// 배열을 list로 변환
for (int i = 0; i < no.length; i++) {
Item item = new Item();
item.setNo(no[i]);
item.setName(name[i]);
item.setPrice(price[i]);
item.setQuantity(quantity[i]);
list.add(item);
}
int ret = itemService.updateBatch(list);
System.out.println("ret" + ret);
if (ret == 1) { // 수정 완료된 경우
return "redirect:/item/selectlist.do";
} else { // 수정되지 않은경우
return "redirect:/item/selectlist.do";
}