<%@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"%>
<!-- 폼태그, 폼페이지
action : 요청URI
요청URI : addCart.jsp
요청파라미터 : {productId=P1234}
요청방식 : post
-->
<%
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("productId");
out.print("id : " + id + "<br />");
// addCart.jsp or addCart.jsp?productId =
// products.jsp로 redirect
if(id == null || id.trim().equals("")) {
// 새로운 UFL을 재요청
response.sendRedirect("/products.jsp");
return; // 아래 쪽은 실행 안 함
}
//기본키인 P1234 코드의 상품을 찾아보자
//ProductRepository 싱글톤 패턴으로 공유된 객체 생성
ProductRepository dao = ProductRepository.getInstance();
//select * from product
//where product_id='P1234'
ProductVO productVO = dao.getProductById(id);
//상품 결과가 없으면
if(productVO == null){
//[상품이 없음]예외처리 페이지로 이동
response.sendRedirect("exceptionNoProductId.jsp");
}else{
}
// 장바구니(세션) => 세션 속성명 : cartlist
ArrayList<ProductVO> list = (ArrayList<ProductVO>)session.getAttribute("cartlist");
// 장바구니가 없으면 생성
if(list == null) {
list = new ArrayList<ProductVO>();
session.setAttribute("cartlist", list);
}
//장바구니가 있다면 다음을 실행
int cnt = 0;
//1)장바구니에 P1234 상품이 이미 들어있는 경우
// private int quantity; //상품을 장바구니에 담은 개수
// quantity를 1 증가
//2)장바구니에 P1234 상품이 없는 경우
// 장바구니에 상품을 넣어주고
// quantity를 1로 처리
//list : 장바구니에 들어있는 상품 목록
for(int i=0;i<list.size();i++){
//list는 장바구니(P1234,P1235,P1236)
//list.get(0).getProductId().equals("P1234")
if(list.get(i).getProductId().equals(id)){
cnt++;
//장바구니에 상품이 이미 들어있다면 장바구니에 담은 개수만 1 증가
list.get(i).setQuantity(list.get(i).getQuantity()+1);
}
}
//장바구니에 해당 상품이 없다면
if(cnt == 0){
productVO.setQuantity(1);
//최종목표 : 장바구니(list)에 상품을 추가
list.add(productVO);
}
//장바구니 확인
for(ProductVO pd : list){
out.print("pd : " + pd.toString()
+ "<br /><hr />");
}
%>
결과 화면1
=> sendRedirect 추가
<%@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"%>
<!-- 폼태그, 폼페이지
action : 요청URI
요청URI : addCart.jsp
요청파라미터 : {productId=P1234}
요청방식 : post
-->
<%
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("productId");
out.print("id : " + id + "<br />");
// addCart.jsp or addCart.jsp?productId =
// products.jsp로 redirect
if(id == null || id.trim().equals("")) {
// 새로운 UFL을 재요청
response.sendRedirect("/products.jsp");
return; // 아래 쪽은 실행 안 함
}
//기본키인 P1234 코드의 상품을 찾아보자
//ProductRepository 싱글톤 패턴으로 공유된 객체 생성
ProductRepository dao = ProductRepository.getInstance();
//select * from product
//where product_id='P1234'
ProductVO productVO = dao.getProductById(id);
//상품 결과가 없으면
if(productVO == null){
//[상품이 없음]예외처리 페이지로 이동
response.sendRedirect("exceptionNoProductId.jsp");
}else{
}
// 장바구니(세션) => 세션 속성명 : cartlist
ArrayList<ProductVO> list = (ArrayList<ProductVO>)session.getAttribute("cartlist");
// 장바구니가 없으면 생성
if(list == null) {
list = new ArrayList<ProductVO>();
session.setAttribute("cartlist", list);
}
//장바구니가 있다면 다음을 실행
int cnt = 0;
//1)장바구니에 P1234 상품이 이미 들어있는 경우
// private int quantity; //상품을 장바구니에 담은 개수
// quantity를 1 증가
//2)장바구니에 P1234 상품이 없는 경우
// 장바구니에 상품을 넣어주고
// quantity를 1로 처리
//list : 장바구니에 들어있는 상품 목록
for(int i=0;i<list.size();i++){
//list는 장바구니(P1234,P1235,P1236)
//list.get(0).getProductId().equals("P1234")
if(list.get(i).getProductId().equals(id)){
cnt++;
//장바구니에 상품이 이미 들어있다면 장바구니에 담은 개수만 1 증가
list.get(i).setQuantity(list.get(i).getQuantity()+1);
}
}
//장바구니에 해당 상품이 없다면
if(cnt == 0){
productVO.setQuantity(1);
//최종목표 : 장바구니(list)에 상품을 추가
list.add(productVO);
}
//장바구니 확인
for(ProductVO pd : list){
out.print("pd : " + pd.toString()
+ "<br /><hr />");
}
response.sendRedirect("product.jsp?productId="+id);
%>
장바구니 추가
cart.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="java.util.Date"%>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<title>Welcome</title>
</head>
<body>
<!-- 머리글에 해당하는 menu.jsp 파일의 내용이 포함되도록 include 디렉티브 태그를 작성 -->
<%@ include file="menu.jsp" %>
<%
// 세션의 고유 아이디(장바구니 번호). 하나의 웹브라우저
String cartId = session.getId();
out.print("cartId : " + cartId);
%>
<c:set var="cartId" value="<%=cartId%>" />
<!-- session.setAttribute("cartlist", list); -->
<c:set var="cartlist" value="${sessionScope.cartlist}" />
<p>${cartlist}</p>
<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="shippingInfo.jsp?cartId=${cartId}" class="btn btn-success">주문하기</a>
</td>
</tr>
</table>
</div>
<!-- /////장바구니 출력 시작///// -->
<div style="padding-top:50px;">
<p></p>
<table class="table table-hover">
<tr>
<th>상품</th><th>가격</th><th>수량</th>
<th>금액</th><th>비고</th>
</tr>
<!-- 장바구니가 비어있다면 -->
<c:if test="${fn:length(cartlist)== 0}" >
<tr style="text-align:center;">
<td colspan="5" style="text-align: center;">장바구니에 상품이 없습니다.</td>
</tr>
</c:if>
<c:if test="${fn:length(cartlist)>0}">
<!--
forEach 태그? 배열(String[], int[][]), Collection(List, Set) 또는
Map(HashTable, HashMap, SortedMap)에 저장되어 있는 값들을
순차적으로 처리할 때 사용함. 자바의 for, do~while을 대신해서 사용함
var : 변수
items : 아이템(배열, Collection, Map)
varStatus : 루프 정보를 담은 객체 활용
- index : 루프 실행 시 현재 인덱스(0부터 시작)
- count : 실행 회수(1부터 시작. 보통 행번호 출력)
-->
<!-- list : List<ProductVO> -->
<c:forEach var="productVO" items="${cartlist}" varStatus="stat">
<!-- amt = amt + 금액 -->
<c:set var="amt" value="${amt + productVO.unitPrice*productVO.quantity}" />
<tr>
<td>${productVO.productId}-${productVO.pname}</td>
<!-- fmt:formatNumber은 숫자형태의 값을 다양한 포맷에 맞게 출력해줌 -->
<td><fmt:formatNumber value="${productVO.unitPrice}" pattern="#,###" /></td>
<td><fmt:formatNumber value="${productVO.quantity}" /></td>
<td><fmt:formatNumber value="${productVO.unitPrice*productVO.quantity}" pattern="#,###" /></td>
<td>삭제</td>
</tr>
</c:forEach>
<tr>
<th></th>
<th></th>
<th>총액</th>
<th><fmt:formatNumber value="${amt}" pattern="#,###" /></th>
<th></th>
</tr>
</c:if>
</table>
<a href="products.jsp" class="btn btn-secondary">«쇼핑 계속하기</a>
</div>
<!-- /////장바구니 출력 끝///// -->
</div>
<!-- 표현문 -->
<%@ include file="footer.jsp" %>
</body>
</html>