WEB/JSP

JSP 27 - 쇼핑몰 사이트 만들기(10) [장바구니 - (session 활용)]

inderrom 2023. 1. 17. 17:42

<product.jsp>

 

onclick="addToCart()" 핸들러 함수를 만든다.

 

스크립트 추가

<script type="text/javascript">
	// 상품 주문 버튼 클릭 시 실행됨
	function addToCart(){
		console.log("롬이");
		if(confirm("상품을 장바구니에 추가하시겠습니까?")){
			// 요청 URI : addCart.jsp?id=P1234
			// 방식 : post
			document.addForm.submit();
		}else{
			// 실행 취소
			document.addForm.reset();
		}
	}
</script>

장바구니 추가하기

<addCart.jsp>

<%@page import="java.util.Enumeration"%>
<%@page import="java.util.ArrayList"%>
<%@page import="kr.or.ddit.vo.ProductVO"%>
<%@page import="kr.or.ddit.dao.ProductRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	// 요청 URIaddCart.jsp?id=P1234
	// 요청파라미터 : id=P1234
	
	String id = request.getParameter("id");  //P1234
	
	out.print("<p> id : " + id + "</p>");
	// 요청파라미터가 없을 때 처리 .. http://localhost/addCart.jsp
	if(id == null || id.trim().equals("")){
		// redirect : 요청 URI를 재요청 ==> 주소표시줄의 주소가 바뀜
		response.sendRedirect("products.jsp");
		// 다음줄부터 실행 안함
		return;
	}
	
	// 기본키가 P1234코드의 상품을 찾아보자(상품 저장소에 있을것임)
	// 싱클톤 패턴으로 객체를 메모리에 1회 생성
	ProductRepository dao = ProductRepository.getInstance();
	
	// select * from ProductRepository
	// where id = 'P1234'
	// 상품코드를 파라미터로 던지면 해당되는 상품을 1행(ProductVO) 가져옴
	ProductVO productVO = dao.getProductById(id);
	
	out.print("productVO :" + productVO);
	
	// 상품 결과가 없다면..
	if(productVO==null){
		// [상품이 없음]예외처리 페이지로 이동
		response.sendRedirect("exceptionNoProductId.jsp");
		return;
	}else{ // 상품 결과가 있으면 계속 가자
		
	}
	
	// 장바구니(세션). 하나의 장바구니에 하나의 세션. 세선명 : cartlist라고 해보자
	//cartlist장바구니 하나에 여러개(ArrayList<>)의 상품(productVO)이 들어있다.
	ArrayList<ProductVO> list = (ArrayList<ProductVO>)session.getAttribute("cartlist");
	
	// 장바구니가 없다면 (null) 장바구니를 생성
	if(list == null){
		//list는 null이므로 여기서 리스트(장바구니)를 생성해줘야 함
		list = new ArrayList<ProductVO>();
		// cartlist라는 세션 속성명에 list를 매핑
		session.setAttribute("cartlist", list);
	}
	
	Enumeration en = session.getAttributeNames();
	String name = en.nextElement().toString();
	out.print("<p>name :" + name + "</p>"); // cartlist
	
	// 장바구니가 있다면 다음을 실행
	// 1) 장바구니에 P1234 상품이 이미 들어있는 경우
	//     private int quantity; // 상품을 장바구니에 담는 개수
	//     quantity의 값을 1 증가
	
	// 2) 장바구니에 P1234 상품이 없는 경우
	//	   장바구니에 상품을 넣어주고
	// 	   quantity 값을 1로 처리
	// list : 장바구니에 들어있는 상품 목록
	// list.size() : 상품의 종류 수
	int cnt = 0;
	for(int i =0; i<list.size(); i++){
		// list는 장바구니이고,(P1234-list.get(0), P1235-list.get(1), P1236-list.get(2)) 상품이 이미 있다고하면..
		// list.get(0).getProductId().equals("P1234")
		if(list.get(i).getProductId().equals(id)){ // 담을 상품을 list에서 찾음
			cnt++;
		// 장바구니에 상품이 이미 들어있다면 장바구니에 담은 개수만 1 증가
			list.get(i).setQuantity(list.get(i).getQuantity()+1);
		}
	}
	
	// 장바구니에 해당 상품이 없다면(cnt = 0)
	if(cnt==0){
		productVO.setQuantity(1);
		// 최종목표 : 장바구니(lsit)에 상품을 추가
		list.add(productVO);
	}
	
	// 장바구니를 확인
	// list<ProductVO> list
	for(ProductVO vo : list)
	{
		out.print("<p>" + vo.toString() + "</p>");
	}
	
	// 상품상세 페이지로 되돌아가자
	response.sendRedirect("product.jsp?id=" + id);

%>

장바구니 목록

<cart.jsp>

<%@page import="java.text.DecimalFormat"%>
<%@page import="java.math.BigDecimal"%>
<%@page import="kr.or.ddit.vo.ProductVO"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="/css/bootstrap.min.css">
<title>장바구니</title>
</head>
<body>
<% //스크립틀릿
	//세션의 고유 아이디(장바구니 번호)
	String cartId = session.getId();
%>
	<!-- include 액션 태그 -->
	<jsp:include page="menu.jsp" />
	<!-- ---------장바구니 시작-------------- -->
	<div class="jumbotron">
		<!-- container : 이 안에 내용 있다 -->
		<div class="container">
			<h1 class="display-3">장바구니</h1>
		</div>
	</div>
	<!-- 장바구니 상세 내역 시작 -->
	<div class="container">
		<div class="row">
			<table width="100%">
				<tr>
					<td align="left">
						<a href="deleteCart.jsp?cartId=<%=cartId%>"  
							class="btn btn-danger">삭제하기</a>
					</td>
					<td align="right">
						<a href="shoppingInfo.jsp?cartId=<%=cartId%>" 
							class="btn btn-success">주문하기</a>
					</td>
				</tr>				
			</table>
		</div>
		<!-- 장바구니 출력 시작 -->
		<!-- padding-top : 영역의 위쪽 여백 50픽셀 -->
		<div style="padding-top:50px;">
			<table class="table table-hover">
				<tr>
					<th>상품</th><th>가격</th><th>수량</th>
					<th>금액</th><th>비고</th>
				</tr>
				<%	//스크립틀릿
					//ArrayList<ProductVO> list
					//addCart.jsp의 cartlist라는 세션 속성명에 list를 매핑
					//session.setAttribute("cartlist", list);
					ArrayList<ProductVO> cartList =
						(ArrayList<ProductVO>)session.getAttribute("cartlist");
					
					// 금액을 누적하는 변수
					double sum = 0;
					
//장바구니가 비어있다면..
if(cartList==null){
				%>
				<tr style="text-align:center;">
					<td colspan="5" style="text-align:center;">장바구니에 상품이 없습니다.</td>
				</tr>
<%
//장바구니에 상품목록이 있다면
}else{			// 3자리수마다 , 
				DecimalFormat df = new DecimalFormat("###,###");
				//상품 목록(List<ProductVO>)에서 하나씩(ProductVO) 꺼냄
				for(ProductVO product : cartList){
					//금액 = 가격 x 수량
					double total = product.getUnitPrice() * product.getQuantity();
					// 실수 -> 정수
					BigDecimal totalBig = new BigDecimal(total);
					BigDecimal priceBig = new BigDecimal(product.getUnitPrice());
					// 금액이 누적됨
					sum = sum + total;
%>
				<tr>
					<td><%=product.getProductId()%>-<%=product.getPname()%></td>
					<td><%=df.format(priceBig)%></td>
					<td><%=product.getQuantity()%></td>
					<td><%=df.format(totalBig)%></td>
					<td>삭제</td>
				</tr>
<%					
				} // end for
				// 총액 : 금액의 누적 합계
				BigDecimal sumBig = new BigDecimal(sum);
%>
				<tr>
					<th></th>
					<th></th>
					<th>총액</th>
					<th><%=df.format(sumBig) %></th>
					<th></th>
				</tr>
<%
} // end if
%>
			</table>
			<a href="products.jsp" class="btn btn-secondary">&laquo;쇼핑 계속하기</a>
		</div>
		<!-- 장바구니 출력 끝 -->		
	</div>
	<!-- 장바구니 상세 내역 끝 -->
	
	
	<!-- ---------장바구니 끝--------- -->

	<jsp:include page="footer.jsp" />
</body>
</html>

 


<cart.jsp>JSTL 사용하기

 

<%@page import="kr.or.ddit.vo.ProductVO"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=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>
<link rel="stylesheet" href="/css/bootstrap.min.css">
<title>장바구니</title>
</head>
<body>
<%
   // 세션의 고유 아이디(장바구니 번호)
   String cartId = session.getId();
//    out.print("<p>" + cartId + "</p>");
%>
   <jsp:include page="menu.jsp"/>
   
   <div class="jumbotron">
      <div class="container">
         <h1 class="display-3">장바구니</h1>
      </div>
   </div>
   
   <div class="container">
      <div class="row">
         <table width="100%">
            <tr>
               <td align="left">
                  <a href="deleteCart.jsp?cartId=<%=cartId%>" class="btn btn-danger">삭제하기</a>
               </td>
               <td align="right">
                  <a href="shoppingInfo.jsp?cartId=<%=cartId%>" class="btn btn-success">주문하기</a>
               </td>
            </tr>
         </table>
      </div>
      <div style="padding-top:50px;">
         <table class="table table-hover">
            <tr>
               <th>상품</th><th>가격</th><th>수량</th><th>금액</th><th>비고</th>
            </tr>
            <%
               ArrayList<ProductVO> list = (ArrayList<ProductVO>) session.getAttribute("cartlist");
            %>
            <c:set var="list" value="<%=list%>"/>
            <c:set var="sum" value="0"/>
            <c:choose>
               <c:when test="${list==null}">
                  <tr style="text-align:center;">
                     <td colspan="5" style="text-align:center;">장바구니에 상품이 없습니다.</td>
                  </tr>
               </c:when>
               <c:otherwise>
                  <c:forEach items="${list}" var="product">
                     <c:set var="sum" value="${sum+(product.unitPrice * product.quantity)}"/>
                     <tr>
                        <td>${product.productId}-${product.pname}</td>
                        <td><fmt:formatNumber value="${product.unitPrice}" type="currency" currencySymbol=""/></td>
                        <td>${product.quantity}</td>
                        <td><fmt:formatNumber value="${product.unitPrice * product.quantity}" type="currency" currencySymbol=""/></td>
                        <td>삭제</td>
                     </tr>
                  </c:forEach>
               </c:otherwise>
            </c:choose>
            <tr>
               <td></td><td></td>
               <th>
                  총액
               </th>
               <th colspan="2" align="left">
                  <fmt:formatNumber value="${sum}" type="currency" currencySymbol=""/>
               </th>
            </tr>
         </table>
         <a href="products.jsp" class="btn btn-secondary">&laquo;쇼핑 계속하기</a>
      </div>
   </div>
   
   <jsp:include page="footer.jsp"/>
</body>
</html>

장바구니 삭제하기

<deleteCart.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% //스크립틀릿
	//요청URI : /deleteCart.jsp?cartId=CF61A1B17D9247CFCA3D6B33E48528A6
	//요청파라미터 : cartId=CF61A1B17D9247CFCA3D6B33E48528A6
	//session.getId() : 세션고유아이디 = 고유장바구니 = 동일웹브라우저 = 1명의고객
	String id = request.getParameter("cartId");//CF61A1B17D9247CFCA3D6B33E48528A6
	//cartId가 없네 => cart.jsp로 이동
	if(id==null || id.trim().equals("")){
		response.sendRedirect("cart.jsp");
		return;
	}
	
	// 장바구니 비우기
	 session.removeAttribute("cartlist"); //세션 한 건만 삭제
	// session.invalidate(); // 모든 세션을 삭제 ( 로그아웃)
	
	
	//cart.jsp로 이동
	response.sendRedirect("cart.jsp");
%>

 


로그인을 해야 장바구니를 들어올 수 있게 security 설정

임의로 manager 권한 설정하기

 

<tomcat-users.xml>

  <role rolename="manager"/><!-- 학생 -->
<user username="admin" password="java" roles="manager"/><!-- 학생 -->

 

<web.xml>

  <security-constraint>
  	<web-resource-collection>
  		<web-resource-name>JSPBook</web-resource-name>
  		<url-pattern>/cart.jsp</url-pattern>
  		<http-method>GET</http-method>
  	</web-resource-collection>
  	<auth-constraint>
  		<description></description>
  		<role-name>manager</role-name>
  	</auth-constraint>
  </security-constraint>

id = admin&nbsp; / pw = java

로그인 후 장바구니에 들어갈 수 있다.

 

 

***** username : admin만 등록 버튼이 보이게 바꾸기 *****

 

<menu.jsp>

<c:if test="${fn:length(username)==0}">
						<a href="addProduct.jsp">로그인해주세요.</a>
					</c:if>

a 링크로 addProduct.jsp에 보내준다

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<% //스크립틀릿
	//시큐리티의 사용자명을 가져옴
	String username = request.getRemoteUser();
%>
<!-- JAVA세계의 변수 username의 값을 JSTL세계의 변수 username에 할당 -->
<c:set var="username" value="<%=username%>" />
<nav class="navbar navbar-expand navbar-dark bg-dark">
	<!-- container : 내 안에 내용 있다 -->
	<div class="container">
		<div class="navbar-header" style="width:100%;">
			<div style="float:left;">
				<a class="navbar-brand" href="welcome.jsp">Home</a>
			</div>
			<div style="float:right;">
				<span class="navbar-brand">
					<!-- 로그인 했음 -->
					<c:if test="${fn:length(username)>0}">
						${username}님 환영합니다. | 
						<a href="/logout.jsp" class="btn btn-sm btn-success pull-right">logout</a>
					</c:if>
					<!-- 로그인 안함 -->
					<c:if test="${fn:length(username)==0}">
						<a href="addProduct.jsp">로그인해주세요.</a>
					</c:if>
				</span>
			</div>
		</div>
	</div>
</nav>

 

<products.jsp>

<!-- tomcat-users.xml의 
		<user username="gdi" password="java" roles="admin" />
		 -->
		<%
		//admin 권한을 가지고 있는 사용자만 등록 버튼이 보이도록 처리
		if(request.isUserInRole("admin")){
		%>
		<div class="form-group row">
			<div class="col-sm-offset-2 col-sm-10">
				<a href="addProduct.jsp" class="btn btn-primary">등록</a>
			</div>
		</div>
		<%
		}
		%>
	</div>

 

위에 코드를 추가해주면

username : admin일 때 장바구니 목록을 볼 수 있고 등록 버튼은 가려진다.

등록 버튼은 username : ssr일 때 보여짐