웹스토어(model1) 첫 단계 예제
웹스토어 상품주문(장바구니 기능) 예제
Product.jsp DTO 추가
package kr.gov.dto;
/*
* *자바 빈(bean)을 이요한 정보 조회
* 1.자바 빈
* 1) Java EE 프로그래밍시 여러 객체를 거치면서 만들어지는 데이터를 저장하거나 전달하는데 사용되는 클래스.
* 2) 자바의 DTO(Data Transfer Object, 데이터 전송 객체)클래스, VO(Value Object, 값객체) 클래스와
* 같은 개념.
* 2.자바 빈 특징
* 1) 속성의 접근 제한자는 private이다.
* 2) 각속성(attribute, property)은 각각의 setter/getter를 가진다.
* 3) 인자 없는 생성자를 반드시 가지며 다른 생성자도 추가할수 있다.
*/
//Product라는 클래스 => 자바빈의 객체가 되는 것.
public class Product {
private String productId; //상품 아이디
private String pname; //상품
private Integer unitprice; //상품가격
private String description; //상품 설명
private String menufecturer; //제조사
private String category; //분류
private long numberOfstock; //재고 수
private String condition; //신상품 or 중고품 or 재생품
private String filename; //제품이미지
private int quantity; //장바구니에 담은 개수
public Product() {
}
//생성자 오버로드
public Product(String productId, String pname, Integer unitprice) {
super();
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 Integer getUnitprice() {
return unitprice;
}
public void setUnitprice(Integer unitprice) {
this.unitprice = unitprice;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getMenufecturer() {
return menufecturer;
}
public void setMenufecturer(String menufecturer) {
this.menufecturer = menufecturer;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public long getNumberOfstock() {
return numberOfstock;
}
public void setNumberOfstock(long numberOfstock) {
this.numberOfstock = numberOfstock;
}
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;
}
}
product.jsp form추가 헨들러 추가
<%@page import="kr.gov.dto.Product"%>
<%@page import="kr.gov.dao.ProductRepository"%>
<%@page errorPage="exceptionNoProductId.jsp" %> <!-- id값이 유효하지 않으면 에러페이지로 이동시킨다. -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- <jsp:useBean id="productDAO" class="kr.gov.dao.ProductRepository" scope="session"/> --%>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 상세 정보</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css">
</head>
<body>
<jsp:include page="menu.jsp"/>
<div class="jumbotron">
<div class="contaner">
<h1 class="display-3">상품 정보</h1>
</div>
</div>
<%
//넘어온 상품 아이디값을 얻었다.
String id =request.getParameter("id");
ProductRepository dao = ProductRepository.getInstance();
//넘어온 상품아이디값을 이용해 실제 해당되는 Product객체를 얻음.
Product product = dao.getProductById(id);
%>
<div class="container">
<div class="row">
<div class="col-md-5">
<%-- <img alt="" src="C:/workspace-jsp/upload/<%=product.getFilename() %>" style="width:100%"> --%>
<img alt="" src="${pageContext.request.contextPath}/resources/images/<%=product.getFilename() %>" style="width:100%">
</div>
<div class="col-md-6">
<h3><%=product.getPname() %></h3>
<p><%=product.getDescription() %></p>
<p><b>상품 코드 :</b><span class="badge badge-danger" ><%=product.getProductId() %><span></b></p>
<p><b>제조사 : </b><%=product.getMenufecturer() %></p>
<p><b>분류 : </b><%=product.getCategory() %></p>
<p><b>제고 수 : </b><%=product.getNumberOfstock() %></p>
<h4><%=product.getUnitprice() %>원</h4>
<p><form name="addForm" action="./addCart.jsp?id=<%=product.getProductId() %>" method="post">
<!-- 상품 주문을 클릭하면 자바스크립트 핸들러 함수 addToCart()호출 -->
<a href="#" class="btn btn-info" onclick="addToCart()">상품 주문»</a>
<!-- 장바구니 버튼 추가, 클릭시 /cart.jsp로 이동함 -->
<a href="./cart.jsp" class="btn btn-warning">장바구니»</a>
<a href="./products.jsp" class="btn btn-secondary">상품 목록»</a>
</form>
<!--
<p><a href="addProduct.jsp" class="btn btn-info">상품 등록»</a></p>
<a href="./products.jsp" class="btn btn-secondary">상품 목록»</a>
-->
</div>
</div>
<hr>
</div>
<jsp:include page="footer.jsp"/>
<script type="text/javascript">
/* 장바구니에 추가하기 위한 헨들러 함수 */
function addToCart() {
if(confirm('해당 상품을 장바구니에 추가하겠습니까?')) { /* confirm() : 사용자가 선택할 때 이용(확인, 취소) */
document.addForm.submit();
}
else {
document.addForm.reset();
}
}
</script>
</body>
</html>
products.jsp(상품목록)에서 상세정보를 선택하여 실행한 페이지
addCart.jsp 파일추가(상품주문 처리) / 세션에 따라 상품 주문받기
<%@page import="java.util.ArrayList"%>
<%@page import="kr.gov.dto.Product"%>
<%@page import="kr.gov.dao.ProductRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품주문</title>
</head>
<body>
<%
//전송된 상품 id
String id = request.getParameter("id");
//상품 id 넘어오지 않았을때 강제로 products.jsp 이동시키고 종료
if(id == null || id.trim().equals("")) {
response.sendRedirect("products.jsp");
return;
}
//상품 데이터 접근 클레스의 인스턴스 생성
ProductRepository dao = ProductRepository.getInstance();
//해당 id값을 이용해서 상품상세정보 얻어오는 코드
Product product = dao.getProductById(id);
if(product == null) { //해당 상품이 없을경우
response.sendRedirect("exceptionNoProductId.jsp");
}
//모든 상품을 가져옴
ArrayList<Product> goodList = dao.getAllProducts();
Product goods = new Product();
for(int i=0; i<goodList.size(); i++) {
/* 상품리스트 중에서 사용자 주문을 한 그 상품의 id가 일치하는 코드를 얻어서 Product에 대입 */
goods = goodList.get(i);
if(goods.getProductId().equals(id)) {
break;
}
}
//세션 속성의 이름이 cardList인 session정보(장바구니에 담겨져있는 물품 목록)를 가져와서 ArrayList에 대입
ArrayList<Product> list = (ArrayList<Product>)session.getAttribute("cardList");
/* cardlist값이 null이라면(처음엔 당연히 null 담겨있는게 없으니까) 새로운 ArrayList를 만들고
세션에 ArrayList만들고 세션에 cardlist이름으로 list라는 값을 대입*/
if(list == null) {
list = new ArrayList<>();
session.setAttribute("cardlist", list);
}
/* 사용자가 주문한 상품이 장바구니에 이미 담긴 물품인지 검색해서 있다면 수량을 증가 */
int cnt = 0;
Product goodsQnt = new Product();
for(int i=0; i<list.size(); i++) {
goodsQnt = list.get(i);
if(goodsQnt.getProductId().equals(id)) {
cnt++;
int orderQuantity = goodsQnt.getQuantity() + 1;
goodsQnt.setQuantity(orderQuantity);
}
}
/* 사용자가 주문한 상품이 장바구니에 없다면 수량을 1로 바꿔주고
장바구니 역할을 하고있는 ArrayList에 추가함.*/
if(cnt == 0){
goods.setQuantity(1);
list.add(goods);
}
response.sendRedirect("product.jsp?id=" + id);
%>
</body>
</html>
cart.jsp
<%@page import="java.text.DecimalFormat"%>
<%@page import="kr.gov.dto.Product"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>장바구니</title>
<link rel="stylesheet" href="./resources/css/bootstrap.min.css">
<%
//세션 ID값 가져오기
String cartId = session.getId();
DecimalFormat dFormat = new DecimalFormat("###,###"); //숫자를 천단위 구분
%>
</head>
<body>
<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>
</tr>
</table>
</div>
<div style="padding-top: 50px;">
<!-- table-hover : 마우스 포인터가 있는 행의 배경을 바꾸어 눈에 띄도록 만들어진 클래스 -->
<table class="table table-hover">
<tr>
<th>상품</th>
<th>가격</th>
<th>수량</th>
<th>소계</th>
<th>비고</th>
</tr>
<%
int sum = 0;
//세션 속성의 이름이 cardList인 세션 정보(장바구니에 담긴 물품 목록)를 가져와서 ArrayList에 대입
ArrayList<Product> cartList = (ArrayList<Product>)session.getAttribute("cardList");
/* cart.jsp 파일에서 전체상품을 삭제하는 deleteCard.jsp에서 session.invalidate()를 호툴하게 되면
cartList는 null이 되기 때문에 아래와 같은 코드가 반드시 필요함. */
if(cartList == null) {
cartList = new ArrayList<>();
}
//상품 리스트 하나씩 출력하기
for(int i = 0; i < cartList.size(); i++) {
Product product = cartList.get(i);
int total = product.getUnitprice() * product.getQuantity();
sum += total;
%>
<tr>
<td><%= product.getProductId() %>-<%= product.getPname() %></td>
<td><%= dFormat.format(product.getUnitprice()) %></td>
<td><%= product.getQuantity() %></td>
<td><%= dFormat.format(total) %></td>
<td><a href="./removeCard.jsp?id=<%= product.getProductId() %>" class="badge badge-danger">삭제</a></td>
</tr>
<%
}
%>
<tr>
<th></th>
<th></th>
<th>총액</th>
<th><%= dFormat.format(sum) %></th>
<th></th>
</tr>
</table>
<a href="./products.jsp" class="btn btn-secondary">쇼핑 계속하기 »</a>
</div>
<hr/>
</div>
<jsp:include page="footer.jsp"/>
</body>
</html>
DecimalFormat 숫자를 천단위 구분하는 클래스
DecimalFormat dfFormat = new DecimalFormat("###,###");
dfFormat.format(숫자변수);
CRED - 삭제
removeCard.jsp
<%@page import="java.util.ArrayList"%>
<%@page import="kr.gov.dto.Product"%>
<%@page import="kr.gov.dao.ProductRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>해당상품 삭제</title>
</head>
<body>
<%
String id = request.getParameter("id"); //삭제할 상품 id
//상품 id 넘어오지 않았을 때 강제로 products.jsp이동시키고 종료
if(id == null || id.trim().equals("")) {
response.sendRedirect("products.jsp");
return;
}
//상품 데이터 접근 클레스의 인스턴스 생성
ProductRepository dao = ProductRepository.getInstance();
//해당 id값을 이용해서 상품상세정보를 얻어오는 코드
Product product = dao.getProductById(id);
if(product == null) {
response.sendRedirect("exceptionNoProductId.jsp");
}
ArrayList<Product> cardList = (ArrayList<Product>)session.getAttribute("cardList");
Product goodQnt = new Product();
for(int i=0; i<cardList.size(); i++) {
goodQnt = cardList.get(i);
if(goodQnt.getProductId().equals(id)) {
cardList.remove(goodQnt);
}
}
response.sendRedirect("cart.jsp");
%>
</body>
</html>
장바구니 비우기 - 전체 삭제하기 (세션삭제)
deleteCart.jsp
\<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>장바구니 비우기</title>
</head>
<body>
<%
//모든 상품을 삭제하기 위해서 sessionID값을 얻음
String id = request.getParameter("cartId");
if(id == null || id.trim().equals("")) { //trim() : 공백
response.sendRedirect("cart.jsp");
return;
}
session.invalidate(); //세션 삭제(비활성화)
response.sendRedirect("cart.jsp");
%>
</body>
</html>