2021. 05. 31(月)TIL


JSP


cart/add.jsp


<%@page import="com.sample.dao.CartItemDao"%>
<%@page import="com.sample.vo.CartItem"%>
<%@page import="java.net.URLEncoder"%>
<%@page import="com.sample.vo.User"%>
<%@page import="com.sample.util.CommonUtils"%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%

	/*
		클라이언트 전용의 세션객체가 JSP 내장객체를 저장하는 session 참조변수에 연결되는 과정
		1. 요청객체의 요청헤더정보에서 클라이언트가 전달한 세션아이디를 조회한다.
		2. Tomcat 서버에서 조회된 세션아이디에 해당하는 세션객체를 검색한다.
		3. 세션아이디에 해당하는 세션객체가 검색되면 해당 세션객체를 session 참조변수에 대입한다.
		4. 개발자가 작성한 JSP 코드에서는 session참조변수를 이용해서 세션객체에 접근할 수 있다.
	*/
	
	/*
		login.jsp에서는 사용자 인증이 완료되면 세션객체에 사용자정보를 저장한다.
		session.setAttribyte("LOGINED_USER_INFO", user); 	// "LOGINED_USER_INFO"이름으로 User객체 저장
		
		* 사용자 인증이 완료된 이후에 실행되는 모든 JSP에서는
		  login.jsp에서 세션객체에 저장해둔 사용자 정보를 꺼낼수 있다.
		  User sessionSavedUser = (User) session.getAttribyte("LOGINED_USER_INFO");
		* 단, 사용자 인증이 완료되지 않은 경우에는
		  세션객체에서 저장해둔 사용자정보가 없기때문에 모든 JSP에서
		  User sessionSavedUser = (User) session.getAttribyte("LOGINED_USER_INFO");를 실행하면
		  sessionSaveduser에 대입되는 값은 null이다
	*/
	// 클라이언트 전용의 세션객체에서 저장된 사용자정보 조회
	User sessionSavedUser = (User) session.getAttribute("LOGINED_USER_INFO");

	// 클라이언트 전용의 세션객체에서 사용자정보가 조회되지 않으면 로그인하지 않은 사용자임
	// 로그인 폼 페이지를 재요청하는 URL을 응답으로 보낸다.
	if (sessionSavedUser == null) {
		String encodedText = URLEncoder.encode("장바구니담기", "utf-8");
		response.sendRedirect("../user/loginform.jsp?fail=deny&job="+ encodedText);
		return;
	}

	// 요청 파라미터에서 상품번호 조회
	int productNo = CommonUtils.stringToInt(request.getParameter("no"));
	// 조회된 사용자정보에서 사용자 아이디 조회
	String userId = sessionSavedUser.getId();
	
	// CartItem객체를 생성해서 사용자아이디, 상품번호를 저장한다.
	CartItem cartItem = new CartItem();
	cartItem.setProductNo(productNo);
	cartItem.setUserId(userId);
	
	// SAMPLE_CART_ITEMS 테이블에 대한 CRUD 기능이 구현된 CartItemDao객체 획득하기
	CartItemDao cartItemDao = CartItemDao.getInstance();
	// CartItemDao객체의 insertCartItem(장바구니아이템정보)를 실행해서 장바구니 아이템정보를 저장한다.
	cartItemDao.insertCartItem(cartItem);
	
	// 브라우져에게 재요청 URL을 응답으로 보낸다
	response.sendRedirect("/sample-mybatis/product/list.jsp");
%>

cart/delete.jsp


<%@page import="com.sample.vo.CartItem"%>
<%@page import="com.sample.util.CommonUtils"%>
<%@page import="java.net.URLEncoder"%>
<%@page import="com.sample.vo.User"%>
<%@page import="com.sample.dao.CartItemDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	// 로그인 여부 체크하기
	User sessionSavedUser = (User) session.getAttribute("LOGINED_USER_INFO");
	if (sessionSavedUser == null) {
		String encodedText = URLEncoder.encode("장바구니 아이템삭제", "utf-8");
		response.sendRedirect("../user/loginform.jsp?fail=deny&job="+ encodedText);
		return;
	}

	//요청파라미터에서 아이템번호를 조회한다.
	int itemNo = CommonUtils.stringToInt(request.getParameter("no"));
	
	// SAMPLE_CART_ITEMS 테이블에 대한 CRUD기능이 구현된 CartItemDao 객체를 획득한다
	CartItemDao cartItemDao = CartItemDao.getInstance();
	// 아이템 번호에 해당하는 아이템정보를 조회하기
	CartItem cartItem = cartItemDao.getCartItemByNo(itemNo);
	
	// 아이템 정보가 조회되지 않으면
	if (cartItem == null) {
		response.sendRedirect("list.jsp?fail=invalid");
		return;
	}
	
	// 아이템을 등록한 사람의 아이디와 로그인한 사용자의 아이디가 동일하지 않으면
	if (!cartItem.getUserId().equals(sessionSavedUser.getId())) {
		response.sendRedirect("list.jsp?fail=deny");
		return;
	}
	
	// 아이템번호에 해당하는 아이템정보를 삭제한다
	cartItemDao.deleteCartItem(itemNo);
	
	// 브라우저에게 목록페이지를 재요청하는 URL을 보낸다.
	response.sendRedirect("list.jsp");

%>

cart/list.jsp


<%@page import="com.sample.util.CommonUtils"%>
<%@page import="com.sample.dao.CartItemDao"%>
<%@page import="com.sample.dto.CartItemListDto"%>
<%@page import="java.util.List"%>
<%@page import="java.net.URLEncoder"%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">
	<head>
		<title>상품몰</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
		<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
	</head>
	<body>
		<div class="container">
			<%
				String navItem = "cart";
			%>
			<header>
				<%@ include file="../common/header.jsp" %>			
			</header>
			<%
				if (loginedUser == null) {
					String encodedText = URLEncoder.encode("장바구니목록","utf-8");
					response.sendRedirect("../user/loginform.jsp?fail=deny&job="+ encodedText) ;
					return;
				}
			
				// 세션에 저장된 로그인된 사용자 정보 조회
				String userId = loginedUser.getId();
				
				// SAMPLE_ITEMS와 SAMPLE_CART_ITEMS 테이블에 대한 CRUD 기능을 제공하는 객체 생성				
				CartItemDao cartItemDao = CartItemDao.getInstance();
				// 로그인한 사용자의 장바구니 정보 조회하기
				List<CartItemListDto> items = cartItemDao.getCartItemsByUserId(userId); 
			%>
			<main>
				<div class="row mb-3">
					<div class="col-12">
						<h3 class="border p-3 bg-light"><%=loginedUser.getName()%><small>님 장바구니 목록</small></h3>
					</div>
				</div>
				<%
					String fail = request.getParameter("fail");
				
					if ("deny".equals(fail)) {
				%>
						<div class="row mb-3">
							<div class="col-12">
								<div class="alert alert-danger">
									<strong>삭제거부</strong> 자신이 등록한 아이템만 삭제할 수 있습니다.
								</div>
							</div>
						</div>
				<% 
					} else if ("invalid".equals(fail)) { 
				%>
						<div class="row mb-3">
							<div class="col-12">
								<div class="alert alert-danger">
									<strong>아이템 없음</strong> 유요한 아이템번호가 아닙니다.
								</div>
							</div>
						</div>
				<%
					}
				%>
				<div class="row mb-3">
					<div class="col-12">
						<div class="card">
							<form method="GET" action="order.jsp">
								<div class="card-body pb-0">
									<table class="table">
										<thead>
											<tr>
												<th>선택</th>
												<th>번호</th>
												<th>상품명</th>
												<th>제조사</th>
												<th class="text-right">가격</th>
												<th class="text-right">할인가격</th>
												<th class="text-right">수량</th>
												<th class="text-right"></th>
											</tr>
										</thead>
										<tbody>
											<%
												if (items.isEmpty()) {
											%>
													<tr>
														<td colspan="8" class="text-center">장바구니에 등록된 상품이 없습니다.</td>
													</tr>
											<%
												} else {
													for (CartItemListDto item : items) {
											%>
														<tr>
															<td><input type="checkbox" /></td>
															<td><%=item.getNo() %></td>
															<td><%=item.getName()%></td>
															<td><%=item.getMaker() %></td>
															<td class="text-right"><%=CommonUtils.numberToString(item.getPrice()) %> 원</td>
															<td class="text-right"><span class="text-danger"><%=CommonUtils.numberToString(item.getDiscountPrice()) %></span></td>
															<td class="text-right"><%=CommonUtils.numberToString(item.getAmount()) %></td>
															<td class="text-right"><a href="delete.jsp?no=<%=item.getNo()%>" class="btn btn-danger btn-sm">삭제</a></td>
														</tr>
											<%
													}
												}
											%>
										</tbody>
									</table>
									<div class="mb-2">
										<button type="submit" class="btn btn-outline-primary btn-sm">선택된 상품 주문</button>
										<button type="submit" class="btn btn-outline-primary btn-sm">전체 주문</button>
									</div>
								</div>
							</form>
						</div>
					</div>
				</div>
			</main>
		</div>
	</body>
</html>