JSP (주문내역 삭제)

김성국·2023년 4월 18일
0

01. JSP 주문한 내역 삭제

■ jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<div>
	<form action="deletepurchase.do" method="post" id="form4">
		<table class="table">
			<thead>
				<tr>
					<th scope="col">주문번호</th>
					<th scope="col">주문수량</th>
					<th scope="col">주문일자</th>
					<th scope="col">고객아이디</th>
					<th scope="col">고객명</th>
					<th scope="col">물품번호</th>
					<th scope="col">물품명</th>
					<th scope="col">물품가격</th>
					<th scope="col">주문금액</th>
				</tr>
			</thead>
			<tbody>
				<c:set var="total" value="${0}" />
				<c:forEach var="obj" items="${list}">
					<tr>
						<th scope="row"><input type="checkbox" name="chk[]"
							value="${obj.no}" />${obj.no}</th>
						<td>${obj.cnt}</td>
						<td>${obj.regdate}</td>
						<td>${obj.customerid}</td>
						<td>${obj.customername}</td>
						<td>${obj.itemno}</td>
						<td>${obj.itemname}</td>
						<td><fmt:formatNumber value="${obj.itemprice}"
								pattern="#,###" /></td>
						<td><fmt:formatNumber value="${obj.cnt*obj.itemprice}"
								pattern="#,###" /></td>
						<c:set var="total" value="${total + (obj.cnt*obj.itemprice) }" />
					</tr>
				</c:forEach>
				<tr>
					<th colspan="8">합계</th>
					<td><fmt:formatNumber value="${total}" pattern="#,###" /></td>
				</tr>
			</tbody>
		</table>
		<input type="button" class="btn btn-sm btn-primary" value="주문취소"
			onclick="deletePurchaseAction()" />
	</form>
</div>
<script>
	function deletePurchaseAction() {
		// 태그중에서 name값이 chk[]인것을 n개 찾음
		const chk = document.getElementsByName("chk[]");
		let isCheck = 0;
		for (let i = 0; i < chk.length; i++) { //찾은 개수 만큼 반복함.
			if (chk[i].checked === true) { //체크된게 있다면
				isCheck = 1;
				break;
			}
		}
		// 체크 된것이 있는지 확인
		if (isCheck === 1) {
			if (confirm('주문을 취소할까요?')) {
				document.getElementById("form4").submit();
			}
		} else {
			alert('항목을 체크하세요.');
			return false;
		}
	}
</script>
  • 여러개의 주문내역을 삭제하기 위해 주문번호를 checkbox타입으로 설정.
  • 태그중에 name값이 chk[]인것을 n개 찾아 반복문을 돌려 체크된것이 있다면 ischeck변수에 1을 넣고 반복문을 계속 돌린다
  • 체크 된것이 있는지 확인하고 있으면 "주문을 취소할까요?" 라는 구문이 뜨고 확인을

■ PurchaseMapper

//삭제하기
	@Delete({ 
		"<script>",
		"DELETE FROM purchase WHERE customerid=#{map.id} AND no IN( ",
			"<foreach collection='map.chk' item='tmp' separator=','>",
				"#{tmp}",
			"</foreach>",
		") ",
		"</script>"
	})
	// DELETE FROM 테이블명 WHERE customerid = 'a' AND no (1,2,3,4);
	public int deletePurchase(@Param("map") Map<String, Object> map);
  • 주문내역을 체크해서 삭제할 수 있는 Mapper를 작성한다.

  • delete controller에서 chk가 배열로 지정되어있기때문에 반복문을 사용해야한다(foreach는 배열을 반복할때 사용)

  • foreach 반복문

    1. collection 속성 - 전달받은 인자를 속성값으로 삽입합니다. Map, Array, List, Set 등과 같은 반복 가능한 객체를 전달할 수 있습니다.

    2. item 속성 - collection속성에서 전달받은 collection 인자값을 대체할 '이름'을 속성 값으로 삽입합니다.

    3. open 속성 - 구문이 시작될때 삽입할 문자열을 속성 값으로 삽입합니다.

    4. close 속성 - 구문이 종료될때 삽입할 문자열을 속성 값으로 삽입합니다.

    5. separator 속성 - 반복되는 구문 사이에 삽입할 문자열을 속성값으로 삽입합니다.

    6. index 속성 - index값을 부를 일종의 변수명을 속성값으로 삽입합니다. 태그 내에 #{index}를 통해 호출할 때 0부터 반환됩니다.

■ CustomerMypageController

//CustomerFilter에 url 등록...
@WebServlet(urlPatterns = { "/customer/deletepurchase.do" })
public class CustomerDeletePurchaseController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
            
		// n개의 값을 받을때는
		String[] chk = request.getParameterValues("chk[]");
		String id 	 = (String)request.getSession().getAttribute("id");
        
		Map<String, Object> map = new HashMap<>();
		map.put("chk", chk);
		map.put("id", id);
		MyBatisContext.getSqlSession().getMapper(PurchaseMapper.class).deletePurchase(map);
			
		response.sendRedirect("mypage.do?menu=4");

	}

}
  • 세션에 저장되어 있는 id와 이름이 chk[]을 불러와 값을 각 변수에 저장시킨다.
  • Purchase dto에 chk 배열 값이 없어서 Map을 이용하여 id와 chk값을 받아 표현
  • PurchaseMapper를 이용하여 체크된 주문을 삭제하여 삭제가 성공을하면 menu4page로 넘어간다.

0개의 댓글