쌍용교육(JAVA)/MVC

쌍용교육 -JSP수업 68일차 - ch06_mvcPageMVC(13)

구 승 2024. 5. 28. 11:36

CartVO 내용추가

//회원번호별 총 구매액
	//장바구니 목록
	public List<CartVO> getListCart(int mem_num) throws Exception{
		Connection conn = null;
	      PreparedStatement pstmt = null;
	      String sql =null;
	      List<CartVO> list = null;
	      ResultSet rs = null;
	      
	      try {
	         //커넥션풀로부터 커넥션 할당
	         conn = DBUtil.getConnection();
	         
	         //SQL문 작성
	         sql="SELECT * FROM zcart c JOIN zitem i USING(item_num) "
	         		+ "WHERE mem_num=? ORDER BY c.reg_date DESC ";
	         
	         //PreparedStatment 객체 생성
	         pstmt = conn.prepareStatement(sql);
	         
	         //?에 데이터 바인딩
	         pstmt.setInt(1, mem_num);
	         
	         rs = pstmt.executeQuery();
	         
	         list = new ArrayList<CartVO>();
	         while(rs.next()) {
	        	CartVO cart = new CartVO();
	        	cart.setCart_num(rs.getInt("cart_num"));
	        	cart.setItem_num(rs.getInt("item_num"));
	        	cart.setOrder_quantity(rs.getInt("order_quantity"));
	        	cart.setMem_num(rs.getInt("mem_num"));
	        	
	        	//상품 정보를 담기위해 ItemVO 객체 생성
	        	ItemVO item = new ItemVO();
	        	item.setName(rs.getString("name"));
	        	item.setPrice(rs.getInt("price"));
	        	item.setPhoto1(rs.getString("photo1"));
	        	item.setQuantity(rs.getInt("quantity"));
	        	item.setStatus(rs.getInt("status"));
	        	
	        	//ItemVO를 CartVO에 저장
	        	cart.setItemVO(item);
	        	
	        	//동일 상품(item_num이 같은 상품)의 총구매 금액 구하기
	        	cart.setSub_total(cart.getOrder_quantity()*item.getPrice()); //setSub_total은 테이블에는 없지만 사용하기위해 VO에 만들어준것
	        	
	        	list.add(cart);
	         }
	      }catch(Exception e) {
	         throw new Exception(e);
	      }finally {
	         DBUtil.executeClose(rs, pstmt, conn);
	      }
	      return list;
	}

kr.cart.action = >ListAction

package kr.cart.action;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import kr.cart.dao.CartDAO;
import kr.cart.vo.CartVO;
import kr.controller.Action;

public class ListAction implements Action {

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpSession session = request.getSession();
		Integer user_num = (Integer)session.getAttribute("user_num");
		
		if(user_num == null) {//로그인되지않은경우
			return "redirect:/member/loginForm.do";
		}
		//로그인 된 경우
		CartDAO dao = CartDAO.getInstance();
		//회원번호별 총구매액
		//int all_total = dao.getTotalByMem_num(user_num);
		
		List<CartVO> list = null;
		
		 //if(all_total > 0) { 
		 list = dao.getListCart(user_num); 
		// }
		 
		//request.setAttribute("all_total",all_total);
		 request.setAttribute("list", list);
		return "/WEB-INF/views/cart/list.jsp";
	}

}

views/cart => list.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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>장바구니</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.7.1.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/shop.cart.js"></script>
</head>
<body>
<div class="page-main">
	<jsp:include page="/WEB-INF/views/common/header.jsp"/>
	<div class="content-main">
	<h2>장바구니</h2>
	<!-- 간발의차로 상품을 내렸는데 그 사이에 user가 들어와버리면 status가 1일 수 있음 이 문제를 해결하기 위한 방법 -->
	<c:if test="${empty list}">
	<div class="result-display">
		장바구니에 담은 상품이 없습니다.
	</div>
	</c:if>
	<c:if test="${!empty list}">
	<form id="cart_order" action="${pageContext.request.contextPath}/order/orderForm.do" method="post">
		<table>
			<tr>
				<th>상품명</th>
				<th>수량</th>
				<th>상품가격</th>
				<th>합계</th>
			</tr>
			<c:forEach var="cart" items="${list}">
			<tr>
				<td>
					<a href="${pageContext.request.contextPath}/item/detail.do?item_num=${cart.item_num}">
						<img src="${pageContext.request.contextPath}/upload/${cart.itemVO.photo1}" width="80">
						${cart.itemVO.name}
					</a>
				</td>
				<td class="align-center">
							<!-- 상품 판매 가능 여부 표시(1:미표시) 미표시 일경우 --><!-- 재고보다 주문 수량이 많을경우 -->
					<c:if test="${cart.itemVO.status==1 or cart.itemVO.quantity < cart.order_quantity}">[판매중지]</c:if>
							<!-- 상품 판매 가능 여부 표시(2:표시) 미표시 일경우 --><!-- 재고보다 주문 수량이 적거나 같을경우 -->
					<c:if test="${cart.itemVO.status==2 and cart.itemVO.quantity >= cart.order_quantity}">[판매가능]
					<input type="number" name="order_quantity" min="1" max="${cart.itemVO.quantity}" 
					value="${cart.order_quantity}" class="quantity-width">
					<br>
					<input type="button" value="변경" class="cart-modify"
					 data-cartnum="${cart.cart_num}" 
					 data-itemnum="${cart.item_num}">
					 </c:if>
				</td>
				<td class="align-center">
					<fmt:formatNumber value="${cart.itemVO.price}"/>원
				</td>
				<td class="align-center">
					<fmt:formatNumber value="${cart.sub_total}"/>원
					<br>
					<input type="button" value="삭제" class="cart-del" data-cartnum="${cart.cart_num}">
				</td>
			</tr>
			</c:forEach>
			<tr>
				<td colspan="3" class="align-right"><b>총구매금액</b></td>
				<td class="align-center"><%-- <fmt:formatNumber value="${all_total}"/> --%>원</td>
			</tr>
		</table>
		<div class="align-center">
			<input type="submit" value="구매하기">
		</div>
	</form>
	</c:if>
	</div>
</div>
</body>
</html>

header.jsp (장바구니 클릭창 만들기) (Mypage 위에 명시)

<li>
	<a href="${pageContext.request.contextPath}/cart/list.do">장바구니</a>
</li>

구현을 하기 전 화면에 보여지기 까지이다. 아직 변경,삭제,구매하기등을 구현하지 않음
구두가 중복이 되는 경우를 해결하기위해 코드를 추가

CartDAO 추가

//장바구니 상세
	public CartVO getCart(CartVO cart) throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
	    String sql =null;
	    ResultSet rs = null;
	    CartVO cartSaved = null;
	      try {
	         //커넥션풀로부터 커넥션 할당
	         conn = DBUtil.getConnection();
	         //SQL문 작성
	         sql="SELECT * FROM zcart WHERE item_num=? AND mem_num =?";
	         //PreparedStatment 객체 생성
	         pstmt = conn.prepareStatement(sql);
	         //?에 데이터 바인딩
	         pstmt.setInt(1, cart.getItem_num());
	         pstmt.setInt(2, cart.getMem_num());
	         //SQL문 실행
	         rs = pstmt.executeQuery();
	         if(rs.next()) {
	        	 cartSaved = new CartVO();
	        	 cartSaved.setCart_num(rs.getInt("cart_num"));
	        	 cartSaved.setItem_num(rs.getInt("item_num"));
	        	 cartSaved.setOrder_quantity(rs.getInt("order_quantity"));
	         }
	      }catch(Exception e) {
	         throw new Exception(e);
	      }finally {
	         DBUtil.executeClose(rs, pstmt, conn);
	      }
		
		return cartSaved;
	}
	//장바구니 수정(개별 상품 수량 수정)
	//장바구니 수정(상품번호와 회원번호별 수정)
	public void updateCartByItem_num(CartVO cart) throws Exception{
		  Connection conn = null;
	  	  PreparedStatement pstmt = null;
	      String sql =null;
	      try {
	         //커넥션풀로부터 커넥션 할당
	         conn = DBUtil.getConnection();
	         
	         //SQL문 작성
	         sql="UPDATE zcart SET order_quantity=? WHERE item_num=? AND mem_num=?";
	         //PreparedStatment 객체 생성
	         pstmt = conn.prepareStatement(sql);
	         //?에 데이터 바인딩
	         pstmt.setInt(1, cart.getOrder_quantity());
	         pstmt.setInt(2, cart.getItem_num());
	         pstmt.setInt(3, cart.getMem_num());
	         //SQL문 실행
	         pstmt.executeUpdate();
	      }catch(Exception e) {
	         throw new Exception(e);
	      }finally {
	         DBUtil.executeClose(null, pstmt, conn);
	      }
	}

WriteAction 수정

36라인

dao.insertCart(cart);

mapAjax.put("result", "success");

를 if문에 넣어준다.

package kr.cart.action;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.codehaus.jackson.map.ObjectMapper;

import kr.cart.dao.CartDAO;
import kr.cart.vo.CartVO;
import kr.controller.Action;
import kr.item.dao.ItemDAO;
import kr.item.vo.ItemVO;

public class WriteAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		Map<String,String> mapAjax = new HashMap<String,String>();
		
		HttpSession session = request.getSession();
		Integer user_num = (Integer)session.getAttribute("user_num");
		if(user_num == null) {//로그인이 되지 않은 경우
			mapAjax.put("result", "logout");
		}else {//로그인이 된 경우
			//전송된 데이터 인코딩 타입 지정
			request.setCharacterEncoding("utf-8");
			
			CartVO cart = new CartVO();
			cart.setItem_num(Integer.parseInt(request.getParameter("item_num")));
			cart.setOrder_quantity(Integer.parseInt(request.getParameter("order_quantity")));
			cart.setMem_num(user_num);
			
			CartDAO dao = CartDAO.getInstance();
			CartVO db_cart = dao.getCart(cart);
			if(db_cart==null) {//동일 상품이 없을 경우
				dao.insertCart(cart);
				mapAjax.put("result", "success");
			}else {//동일 상품이 있을 경우
				//재고수를 구하기 위해서 ItemDAO 호출
				ItemDAO itemDAO = ItemDAO.getInstance();
				ItemVO item = itemDAO.getItem(db_cart.getItem_num());
				
				//구매수량 합산(기존 장바구니에 저장된 구매수량 + 새로 입력한 구매수량)
				int order_quantity = db_cart.getOrder_quantity() + cart.getOrder_quantity();
				
				if(item.getQuantity()<order_quantity) {
					//상품 재고 수량보다 장바구니에 담은 구매수량이 더 많음
					mapAjax.put("result","overquantity");
					
				}else {
					cart.setOrder_quantity(order_quantity);
					dao.updateCartByItem_num(cart);
					mapAjax.put("result", "success");
				}
				
				
			}
		}
		//JSON 데이터 생성
		ObjectMapper mapper = new ObjectMapper();
		String ajaxData = mapper.writeValueAsString(mapAjax);
		
		request.setAttribute("ajaxData",ajaxData);
		
		return "/WEB-INF/views/common/ajax_view.jsp";
	}

}

구두를 따로 담아도 중복되지않고 하나로 합쳐서 수량만 늘어난다. 합계도 계산해서 증가한다.
재고를 초과해서 담으면 재고가 부족하다고 뜬다.

CartDAO 내용 추가

//회원번호별 총 구매액
	public int getTotalByMem_num(int mem_num) throws Exception{
		Connection conn = null;
	  	PreparedStatement pstmt = null;
	    String sql =null;
	    ResultSet rs = null;
	    int total = 0;
	    
	      try {
	         //커넥션풀로부터 커넥션 할당
	         conn = DBUtil.getConnection();
	         
	         //SQL문 작성
	         sql="SELECT SUM(sub_total) FROM (SELECT mem_num,"
	         		+ "order_quantity * price AS sub_total FROM zcart "
	         		+ "JOIN zitem USING(item_num)) WHERE mem_num=?";
	         //PreparedStatment 객체 생성
	         pstmt = conn.prepareStatement(sql);
	         
	         //?에 데이터 바인딩
	         pstmt.setInt(1, mem_num);
	         //SQL문 실행   
	         rs = pstmt.executeQuery();
	         
	         if(rs.next()) { //위에 sql문 작성에서 sum을 썼기 떄문에 행은 무조건 1개만 나온다. 그러므로 if를 쓰고 getInt(1)을 쓴다.
	        	 total = rs.getInt(1);
	         }
	      }catch(Exception e) {
	         throw new Exception(e);
	      }finally {
	         DBUtil.executeClose(rs, pstmt, conn);
	      }
		
		return total;
	}

ListAction 내용 수정 (주석처리 했던 것들을 풀어준다)

cart/list.jsp 내용수정 (주석처리 했던 것들을 풀어준다)

총구매금액이 생긴다.