ProductVO.java
장바구니에 담는 수량 프로퍼티 추가
package kr.or.ddit.vo;
// 자바 빈 클래스
/* 자바빈 규약
1. 프로퍼티
2. 기본생성자
3. getter/setter메서드
*/
/**
* @author PC-13
*
*/
public class ProductVO {
// 프로퍼티 = 멤버변수(필드)
private String productId;
private String pname;
private long unitPrice;
private String description;
private String manufacturer;
private String category;
private long unitsInStock;
private String condition;
private String filename;
private int quantity; // 장바구니에 담은 갯수
// 기본 생성자
public ProductVO() {
}
// 생성자(상품아이디, 상품명, 상품가격)
public ProductVO(String productId, String pname, long unitPrice) {
this.productId = productId;
this.pname = pname;
this.unitPrice = unitPrice;
}
// getter / setter 메서드
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public long getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(long unitPrice) {
this.unitPrice = unitPrice;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public long getUnitsInStock() {
return unitsInStock;
}
public void setUnitsInStock(long unitsInStock) {
this.unitsInStock = unitsInStock;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
@Override
public String toString() {
return "ProductVO [productId=" + productId + ", pname=" + pname + ", unitPrice=" + unitPrice + ", description="
+ description + ", manufacturer=" + manufacturer + ", category=" + category + ", unitsInStock="
+ unitsInStock + ", condition=" + condition + "]";
}
}
product.jsp
장바구니 버튼 생성
<%@page import="kr.or.ddit.vo.ProductVO"%>
<%@page import="java.util.List"%>
<%@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" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page errorPage="/exceptionNoProductId.jsp" %>
<!DOCTYPE html>
<html>
<head>
<title>상품 목록</title>
<link rel="stylesheet" href="/css/bootstrap.min.css">
<script>
function addToCart(){
let form = document.addForm;
let q = document.querySelector('#qu').value;
if(q==0){
alert("수량을 선택해주세요");
return;
}
if(confirm("상품을 장바구니에 추가하시겠습니까?")){
form.submit();
} else{
form.reset();
}
}
</script>
</head>
<body>
<c:set var="lang" value="${param.language}"/>
<c:if test="${lang==null}">
<c:set var="lang" value="ko"/>
</c:if>
<fmt:setLocale value="${lang}"/> <!-- 영어 en -->
<fmt:bundle basename="bundle.message">
<!-- header -->
<!--
디렉티브 태그 속성 속성의 값 -->
<%@ include file="menu.jsp" %>
<%
String pid = request.getParameter("pid");
ProductRepository dao = ProductRepository.getInstance();
ProductVO vo = dao.getProductById(pid);
try{
vo.toString();
}catch(ArithmeticException e){
RequestDispatcher dispatcher =
request.getRequestDispatcher("exceptionNoProductId.jsp");
dispatcher.forward(request, response);
}
%>
<!-- 상품 목록 시작 -->
<div class="jumbotron">
<div class="container">
<h1 class="display-3"><fmt:message key="product_description" /></h1>
</div>
</div>
<div class="container">
<div class="text-right">
<a href="/product.jsp?pid=<%=pid %>&language=ko">Korean</a>
<a href="/product.jsp?pid=<%=pid %>&language=en">English</a>
</div>
<c:set var="vo" value="<%=vo %>"/>
<div class="row">
<div class="col-md-6"> <!-- style = " width : 50%; "-->
<span class="badge badge-danger">${vo.condition}</span>
<h3>
${vo.pname}</h3>
<img src="/images/${vo.filename}" style='width:200px;' />
<p>${vo.description}</p>
<p>
<b><fmt:message key="productId" /> : </b>
${vo.productId}
</p>
<p>
<b><fmt:message key="manufacturer" /> : </b>
${vo.manufacturer}
</p>
<p>
<b><fmt:message key="category" /> : </b>
${vo.category}
</p>
<p>
<b><fmt:message key="unitsInStock" /> : </b>
${vo.unitsInStock}
</p>
<h4>
<fmt:formatNumber value="${vo.unitPrice}" type="number" pattern="#,###" /><fmt:message key="won" />
</h4>
<p>
<!-- 장바구니에 상품을 넣음
addToCart() 핸들러 함수 -->
<form name="addForm" method="post" action="/addCart.jsp">
<input type="text" name="pId" value="${vo.productId}" hidden="hidden">
<label>수량</label>
<input type="number" name="q" value="0" id="qu">
<a href="#" class="btn btn-info" onclick="addToCart()">상품 주문»</a>
<!-- 장바구니 목록 -->
<a href="/cart.jsp" class="btn btn-warning">장바구니»</a>
<a href="/products.jsp" class="btn btn-secondary" role="button"><fmt:message key="product_list" /> »</a>
</form>
</p>
</div>
</div>
</div>
<!-- 상품 목록 끝 -->
<!-- footer -->
<%@ include file="footer.jsp" %>
</fmt:bundle>
</body>
</html>
addCart.jsp
카트 담김 처리 ( 세션 )
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="kr.or.ddit.vo.ProductVO"%>
<%@page import="kr.or.ddit.dao.ProductRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%
String productId = request.getParameter("pId");
//addCart.jsp or addCart.jsp?productId=
if(productId==null || productId.trim().isEmpty()){
response.sendRedirect("/products.jsp");
return;
}
//기본키인 P1234 코드의 상품을 찾아보자
//싱글톤 패턴으로 객체를 1회 생성
ProductRepository dao = ProductRepository.getInstance();
//select * from ProductRepository
//where id='P1234';
ProductVO vo = dao.getProductById(productId);
if(vo==null){
// 상품이 없음 예외 페이지로 이동
response.sendRedirect("/exceptionNoProductId.jsp");
return;
} else {
}
// 장바구니 (세션) => 세션명 : cartlist
List<ProductVO> list = (List<ProductVO>)session.getAttribute("cartlist");
// 장바구니가 없다면 생성
if(list == null){
list = new ArrayList<>();
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++){
if(list.get(i).getProductId().equals(productId)){
cnt=list.get(i).getQuantity()+1;
//장바구니에 상품이 이미 들어있다면 장바구니에 담은 개수만 1 증가
list.get(i).setQuantity(cnt);
}
}
//장바구니에 해당 상품이 없다면
if(cnt==0){
vo.setQuantity(1);
list.add(vo);
}
// 장바구니 확인
// list : 장바구니. List<ProductVO>
for(ProductVO vv : list){
out.print(vv.toString()+"<br/>");
}
response.sendRedirect("/product.jsp?pid="+productId);
%>
<%=productId%>
cart.jsp
카트 조회 & 수량 조절 & 카트 업데이트 & 카트 삭제
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="kr.or.ddit.vo.ProductVO"%>
<%@ page import="java.util.List"%>
<%@ page import="java.util.Date"%>
<%@ 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>
<title>Welcome</title>
<link rel="stylesheet" href="/css/bootstrap.min.css">
<script>
window.onload = function(){
const qu = document.querySelectorAll('.num');
qu.forEach(function(qq){
qq.addEventListener("change", function(e) {
let price = e.target.getAttribute("idx");
let q = e.target.value;
let sumt = e.target.parentNode.nextSibling.nextSibling;
var sum = price*q;
sum = sum.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
sumt.innerText = sum;
let sumsum = document.querySelector('#sumsum');
let sums = 0;
qu.forEach(function(a){
let pp = a.getAttribute("idx");
let qq = a.value;
sums+= pp*qq;
})
sums = sums.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
sumsum.innerText=sums;
let productId = e.target.getAttribute("pId"); // 상품 ID 추가
let data = {"productId" : productId, "quantity" : q}
// 서버로 변경된 수량과 상품 ID 전송
fetch('/updateCartQuantity.jsp', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
}); })
})
}
</script>
</head>
<body>
<!-- header -->
<%@ include file="menu.jsp" %>
<%
// 세션의 고유 아이디(장바구니 번호). 하나의 웹브라우저
String cartId = session.getId();
// 장바구니 세션 가져오기
List<ProductVO> list = (List<ProductVO>)session.getAttribute("cartlist");
%>
<c:set var="cartId" value="<%=cartId %>"/>
<c:set var="list" value="<%=list %>"/>
<!-- 표현문 -->
<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">
<!-- cart=장바구니=session=웹브라우저=sessionId -->
<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 style="text-align:center;">
<th>상품</th>
<th>가격</th>
<th>수량</th>
<th>금액</th>
<th>비고</th>
</tr>
<!-- 장바구니가 비어있다면 -->
<c:if test="${fn:length(list)==0}">
<tr>
<td colspan="6" style="text-align:center;">
장바구니에 상품이 없습니다.
</td>
</tr>
</c:if>
<!-- 장바구니가 있다면 -->
<!--
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="vo" items="${list}">
<c:set var="amt" value="${amt + vo.unitPrice * vo.quantity}"/>
<tr>
<td style="vertical-align: middle; display:flex; align-item:center;">
<span><img src="/images/${vo.filename}" style='width:100px; margin-right:60px;' /></span>
<span><span class="badge badge-danger">${vo.condition}</span> ${vo.productId}<br>${vo.pname}</span></td>
<td style="vertical-align: middle; text-align:center;"><fmt:formatNumber value="${vo.unitPrice}" type="number" pattern="#,###" /></td>
<td style="vertical-align: middle; text-align:center;"><input class="num" idx="${vo.unitPrice}" pId="${vo.productId}" type="number" value="${vo.quantity}" min="1" style="width:50px"></td>
<td style="vertical-align: middle; text-align:center;"><fmt:formatNumber value="${vo.unitPrice * vo.quantity}" type="number" pattern="#,###" /></td>
<td style="vertical-align: middle; text-align:center;">
<a href="/removeCart.jsp?pId=${vo.productId}" class="badge badge-danger">삭제</a>
</td>
</tr>
</c:forEach>
<tr>
<th></th>
<th></th>
<th>총 액</th>
<th id="sumsum"><fmt:formatNumber value="${amt}" type="number" pattern="#,###" /></th>
<th></th>
</tr>
</table>
<a href="/products.jsp" class="btn btn-secondary">«쇼핑 계속하기</a>
</div>
<!-- 장바구니 출력 끝 -->
</div>
<!-- footer -->
<%@ include file="footer.jsp" %>
</body>
</html>
updateCartQuantity.jsp
카트 수량 업데이트
<%@page import="com.google.gson.Gson"%>
<%@page import="java.io.BufferedReader"%>
<%@page import="kr.or.ddit.vo.ProductVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%
//상품 ID와 변경된 수량을 받아옴
// JSON 데이터를 파싱하여 필요한 정보 가져오기
BufferedReader reader = request.getReader();
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
// JSON 데이터 파싱
Gson gson = new Gson();
String reqdata = sb.toString();
ProductVO pvo = gson.fromJson(reqdata, ProductVO.class);
String productId = pvo.getProductId();
int quantity = pvo.getQuantity();
// 세션에서 장바구니 정보를 가져옴
session = request.getSession();
List<ProductVO> list = (List<ProductVO>) session.getAttribute("cartlist");
// 장바구니에서 해당 상품을 찾아 수량 업데이트
for (ProductVO product : list) {
if (product.getProductId().equals(productId)) {
product.setQuantity(quantity);
break;
}
}
// 업데이트된 장바구니 정보를 세션에 저장
session.setAttribute("cartlist", list);
%>
removeCart.jsp
카트 부분 삭제
<%@page import="java.util.List"%>
<%@page import="kr.or.ddit.vo.ProductVO"%>
<%@page import="kr.or.ddit.dao.ProductRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%
///removeCart.jsp?id=P1234 의 요청 파라미터를 받아서 변수에 저장
String pId = request.getParameter("pId");
if(pId==null||pId.trim().isEmpty()){
response.sendRedirect("/products.jsp");
return;
}
//기본키인 P1234 코드의 상품을 찾아보자
//싱글톤 패턴으로 객체를 1회 생성
ProductRepository dao = ProductRepository.getInstance();
//select * from ProductRepository
//where id='P1234';
ProductVO vo = dao.getProductById(pId);
if(vo==null){
// 상품이 없음 예외 페이지로 이동
response.sendRedirect("/exceptionNoProductId.jsp");
return;
}
// 세션에서 장바구니 정보를 가져옴
session = request.getSession();
List<ProductVO> list = (List<ProductVO>) session.getAttribute("cartlist");
// 장바구니에서 해당 상품을 찾아 수량 업데이트
for (int i=0; i<list.size(); i++) {
ProductVO product = list.get(i);
if (product.getProductId().equals(pId)) {
list.remove(i);
break;
}
}
// 업데이트된 장바구니 정보를 세션에 저장
session.setAttribute("cartlist", list);
response.sendRedirect("/cart.jsp");
%>
deleteCart.jsp
카트 전체삭제
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%
//요청URI : /deleteCart.jsp?cartId=CF61A1B17D9247CFCA3D6B33E48528A6
//요청파라미터 : cartId=CF61A1B17D9247CFCA3D6B33E48528A6
//session.getId() : 세션고유아이디 = 고유장바구니 = 동일웹브라우저 = 1명의고객
String cartId = request.getParameter("cartId");
//cartId가 없네? => cart.jsp로 이동
if(cartId==null || cartId.trim().isEmpty()){
response.sendRedirect("/cart.jsp");
return;
}
if(!session.getId().equals(cartId)){
response.sendRedirect("/products.jsp");
return;
}
session.removeAttribute("cartlist");
// session.invalidate(); // 로그아웃
response.sendRedirect("/cart.jsp");
%>
'JAVA > JSP' 카테고리의 다른 글
[JSP] 구현 10 - 구매 영수증 (쿠키) (0) | 2024.07.18 |
---|---|
[JSP] 쿠키(Cookies) (0) | 2024.07.18 |
[JSP] 세션(Sesstion) (1) | 2024.07.16 |
[JSP] 구현 8 - 로그 (0) | 2024.07.16 |
[JSP] 필터 (0) | 2024.07.15 |