[JSP][도서쇼핑몰 프로젝트]#12.주문처리페이지 만들기
안녕하세요! 오늘은 쿠키를 이용하여 주문정보를 받아 처리해 주는 페이지를 만들려고 합니다. 쿠키(cookie)는 세션과 마찬가지로 클라이언트와 웹 서버 간의 상태를 지속적으로 유지해 주는 방법입니다. 하지만 쿠키는 세션과 달리 상태정보를 웹서버가 아닌 클라이언트에 저장해 줍니다.
그렇기 때문에 쿠키는 클라이언트의 일정 폴더에 정보를 저장해서 웹 서버의 부하를 줄일 수 있다는것이 장점이고 단점으로는 웹 브라우저가 접속했던 웹사이트에 관한 정보와 개인정보가 기록되기 때문에 보안에 문제가 있습니다. 이러한 보안 문제를 해결하기 위해 웹브라우저에는 쿠키 거부기능이 추가되어 있습니다.
그럼 이제 배송정보를 처리해주는 주문처리페이지를 만들어보겠습니다.
📋순서
1. 장바구니 페이지 수정
2. 배송 정보 페이지 작성
3. 배송 정보 처리 페이지 작성
4. 주문 정보 페이지 작성
5. 주문 완료 페이지 작성
6. 주문 취소 페이지 작성
7. 결과
#01. 장바구니 페이지 수정
cart.jsp파일에 <주문하기>버튼을 클릭하면 배송정보 페이지로 넘어가도록 추가해 줍니다.
<a href="./shippingInfo.jsp?cartId=<%=cartId%>" class="btn btn-success">주문하기</a>
#02. 배송정보 페이지 작성
shippingInfo.jsp파일을 새로 생성해 줍니다. 성명, 배송일, 국가, 우편번호, 주소 값을 입력받습니다.
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<!-- Favicon -->
<link href="img/favicon.ico" rel="icon">
<!-- Google Web Fonts -->
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Poppins&family=Roboto:wght@700&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap" rel="stylesheet">
<!-- Icon Font Stylesheet -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.4.1/font/bootstrap-icons.css" rel="stylesheet">
<link href="lib/flaticon/font/flaticon.css" rel="stylesheet">
<!-- Libraries Stylesheet -->
<link href="lib/owlcarousel/assets/owl.carousel.min.css" rel="stylesheet">
<!-- Customized Bootstrap Stylesheet -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Template Stylesheet -->
<link href="css/style.css" rel="stylesheet">
<title>배송 정보</title>
</head>
<body>
<jsp:include page="menu.jsp" />
<div class="jumbotron">
<div class="container my-3 py-3">
<div class="border-start border-5 border-primary ps-5 mb-5" style="max-width: 600px;">
<h6 class="text-primary text-uppercase">Oder</h6>
<h1 class="display-5 text-uppercase mb-0">배송 정보</h1>
</div>
</div>
</div>
<div class="container">
<form action="./processShippingInfo.jsp" class="form-horizontal" method="post">
<div class="row g-0 bg-light overflow-hidden">
<div class="d-flex flex-column justify-content-center">
<div class="p-4" style="line-height: 3em">
<input type="hidden" name="cartId" value="<%=request.getParameter("cartId")%>" />
<div class="form-group row">
<label class="col-sm-2">성명</label>
<div class="col-sm-3">
<input name="name" type="text" class="form-control" />
</div>
</div>
<div class="form-group row">
<label class="col-sm-2">배송일</label>
<div class="col-sm-3">
<input name="shippingDate" type="text" class="form-control" />(yyyy/mm/dd)
</div>
</div>
<div class="form-group row">
<label class="col-sm-2">국가</label>
<div class="col-sm-3">
<input name="country" type="text" class="form-control" />
</div>
</div>
<div class="form-group row">
<label class="col-sm-2">우편번호</label>
<div class="col-sm-3">
<input name="zipCode" type="text" class="form-control" />
</div>
</div>
<div class="form-group row">
<label class="col-sm-2">주소</label>
<div class="col-sm-5">
<input name="addressName" type="text" class="form-control" />
</div>
</div>
<div class="form-group row">
<div class="col-sm-offset-2 col-sm-10 ">
<a href="./cart.jsp?cartId=<%=request.getParameter("cartId") %>" class="btn btn-secondary" role="button"> 이전 </a>
<input type="submit" class="btn btn-primary" value="등록" />
<a href="./checkOutCancelled.jsp" class="btn btn-primary" role="button">취소</a>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
<!-- footer -->
<%@ include file="footer.jsp"%>
<!-- Back to Top -->
<a href="#" class="btn btn-primary py-3 fs-4 back-to-top"><i class="bi bi-arrow-up"></i></a>
<!-- JavaScript Libraries -->
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="lib/easing/easing.min.js"></script>
<script src="lib/waypoints/waypoints.min.js"></script>
<script src="lib/owlcarousel/owl.carousel.min.js"></script>
<!-- Template Javascript -->
<script src="js/main.js"></script>
</body>
</html>
#03. 배송 정보 처리 페이지
다음은 정보 처리 페이지를 만들어주는데요. processShippingInfo.jsp파일을 새로 생성해줍니다.
<%request.setCharacterEncoding("UTF-8");%>
한글을 처리해 주기 위해 문자 인코딩유형을 utf-8로 설정하도록 request 내장 객체의 setChaeacterEncoding()메소드를 작성합니다.
cartId.setMaxAge(24*60*60);
cartId, name, zipCode, country, addressName의 생성한 쿠키의 유효기간을 24시간(24x60x60)으로 설정하도록 작성합니다.
response.addCookie(cartId);
앞서 작성된 정보들에 대해 쿠키를 등록하도록 response 내장 객체의 addCookie()메소드를 작성합니다.
전체코드
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.net.URLEncoder"%>
<%
request.setCharacterEncoding("UTF-8");
Cookie cartId = new Cookie("Shipping_cartId", URLEncoder.encode(
request.getParameter("cartId"),"utf-8"));
Cookie name = new Cookie("Shipping_name",URLEncoder.encode(
request.getParameter("name"),"utf-8"));
Cookie shippingDate = new Cookie("Shipping_shippingDate",URLEncoder.encode(
request.getParameter("shippingDate"),"utf-8"));
Cookie country = new Cookie("Shipping_country",URLEncoder.encode(
request.getParameter("country"),"utf-8"));
Cookie zipCode = new Cookie("Shipping_zipCode",URLEncoder.encode(
request.getParameter("zipCode"),"utf-8"));
Cookie addressName = new Cookie("Shipping_addressName",URLEncoder.encode(
request.getParameter("addressName"),"utf-8"));
cartId.setMaxAge(24*60*60);
name.setMaxAge(24*60*60);
country.setMaxAge(24*60*60);
zipCode.setMaxAge(24*60*60);
addressName.setMaxAge(24*60*60);
response.addCookie(cartId);
response.addCookie(name);
response.addCookie(shippingDate);
response.addCookie(country);
response.addCookie(zipCode);
response.addCookie(addressName);
response.sendRedirect("orderConfirmation.jsp");
%>
#04. 주문 정보페이지 작성하기
주문 정보를 보여주는 페이지를 작성해 줍니다. orderConfirmation.jsp파일을 만들어 줍니다.
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="java.net.URLDecoder"%>
<%@ page import="dto.Product" %>
<%@ page import="dao.ProductRepository" %>
<%
request.setCharacterEncoding("UTF-8");
String cartId = session.getId();
String shipping_cartId = "";
String shipping_name = "";
String shipping_shippingDate = "";
String shipping_country = "";
String shipping_zipCode = "";
String shipping_addressName = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
Cookie thisCookie = cookies[i];
String n = thisCookie.getName();
if (n.equals("Shipping_cartId"))
shipping_cartId = URLDecoder.decode((thisCookie.getValue()), "utf-8");
if (n.equals("Shipping_name"))
shipping_name = URLDecoder.decode((thisCookie.getValue()), "utf-8");
if (n.equals("Shipping_shippingDate"))
shipping_shippingDate = URLDecoder.decode((thisCookie.getValue()), "utf-8");
if (n.equals("Shipping_country"))
shipping_country = URLDecoder.decode((thisCookie.getValue()), "utf-8");
if (n.equals("Shipping_zipCode"))
shipping_zipCode = URLDecoder.decode((thisCookie.getValue()), "utf-8");
if (n.equals("Shipping_addressName"))
shipping_addressName = URLDecoder.decode((thisCookie.getValue()), "utf-8");
}
}
%>
<html>
<head>
<!-- Favicon -->
<link href="img/favicon.ico" rel="icon">
<!-- Google Web Fonts -->
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Poppins&family=Roboto:wght@700&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap" rel="stylesheet">
<!-- Icon Font Stylesheet -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.4.1/font/bootstrap-icons.css" rel="stylesheet">
<link href="lib/flaticon/font/flaticon.css" rel="stylesheet">
<!-- Libraries Stylesheet -->
<link href="lib/owlcarousel/assets/owl.carousel.min.css" rel="stylesheet">
<!-- Customized Bootstrap Stylesheet -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Template Stylesheet -->
<link href="css/style.css" rel="stylesheet">
<title>주문 정보</title>
</head>
<body>
<jsp:include page="menu.jsp" />
<div class="jumbotron">
<div class="container">
<h1 class="display-3">주문 정보</h1>
</div>
</div>
<div class="container col-8 alert alert-info">
<div class="text-center ">
<h1>영수증</h1>
</div>
<div class="row justify-content-between">
<div class="col-4" align="left">
<strong>배송 주소</strong> <br> 성명 : <% out.println(shipping_name); %> <br>
우편번호 : <% out.println(shipping_zipCode);%><br>
주소 : <% out.println(shipping_addressName);%>
(<% out.println(shipping_country);%>) <br>
</div>
<div class="col-4" align="right">
<p> <em>배송일: <% out.println(shipping_shippingDate);%></em>
</div>
</div>
<div>
<table class="table table-hover">
<tr>
<th class="text-center">도서</th>
<th class="text-center">#</th>
<th class="text-center">가격</th>
<th class="text-center">소계</th>
</tr>
<%
int sum = 0;
ArrayList<Product> cartList = (ArrayList<Product>) session.getAttribute("cartlist");
if (cartList == null)
cartList = new ArrayList<Product>();
for (int i = 0; i < cartList.size(); i++) { // 상품리스트 하나씩 출력하기
Product book = cartList.get(i);
int total = book.getUnitPrice() * book.getQuantity();
sum = sum + total;
%>
<tr>
<td class="text-center"><em><%=book.getBookName()%> </em></td>
<td class="text-center"><%=book.getQuantity()%></td>
<td class="text-center"><%=book.getUnitPrice()%>원</td>
<td class="text-center"><%=total%>원</td>
</tr>
<%
}
%>
<tr>
<td> </td>
<td> </td>
<td class="text-right"> <strong>총액: </strong></td>
<td class="text-center text-danger"><strong><%=sum%> </strong></td>
</tr>
</table>
<a href="./shippingInfo.jsp?cartId=<%=shipping_cartId%>"class="btn btn-secondary" role="button"> 이전 </a>
<a href="./thankCustomer.jsp" class="btn btn-success" role="button"> 주문 완료 </a>
<a href="./checkOutCancelled.jsp" class="btn btn-secondary" role="button"> 취소 </a>
</div>
</div>
<!-- footer -->
<%@ include file="footer.jsp"%>
<!-- Back to Top -->
<a href="#" class="btn btn-primary py-3 fs-4 back-to-top"><i class="bi bi-arrow-up"></i></a>
<!-- JavaScript Libraries -->
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="lib/easing/easing.min.js"></script>
<script src="lib/waypoints/waypoints.min.js"></script>
<script src="lib/owlcarousel/owl.carousel.min.js"></script>
<!-- Template Javascript -->
<script src="js/main.js"></script>
</body>
</html>
#05. 주문 완료 페이지 작성
<주문 완료> 버튼을 클릭했을 때, 완료되었다는 문구가 나오는 페이지입니다. thankCustomer.jsp파일을 만들고 다음과 같이 작성하여 줍니다.
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.net.URLDecoder"%>
<html>
<head>
<!-- Favicon -->
<link href="img/favicon.ico" rel="icon">
<!-- Google Web Fonts -->
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Poppins&family=Roboto:wght@700&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap" rel="stylesheet">
<!-- Icon Font Stylesheet -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.4.1/font/bootstrap-icons.css" rel="stylesheet">
<link href="lib/flaticon/font/flaticon.css" rel="stylesheet">
<!-- Libraries Stylesheet -->
<link href="lib/owlcarousel/assets/owl.carousel.min.css" rel="stylesheet">
<!-- Customized Bootstrap Stylesheet -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Template Stylesheet -->
<link href="css/style.css" rel="stylesheet">
<title>주문 완료</title>
</head>
<body>
<%
String shipping_cartId = "";
String shipping_name = "";
String shipping_shippingDate = "";
String shipping_country = "";
String shipping_zipCode = "";
String shipping_addressName = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
Cookie thisCookie = cookies[i];
String n = thisCookie.getName();
if (n.equals("Shipping_cartId"))
shipping_cartId = URLDecoder.decode((thisCookie.getValue()), "utf-8");
if (n.equals("Shipping_shippingDate"))
shipping_shippingDate = URLDecoder.decode((thisCookie.getValue()), "utf-8");
}
}
%>
<jsp:include page="menu.jsp" />
<div class="container-fluid bg-bookImg my-2 py-2">
<div class="jumbotron" style="padding-top: 80px; padding-bottom: 80px">
<div class="container my-3 py-3">
<div class="border-start border-5 border-dark ps-5 mb-5">
<h6 class="text-dark text-uppercase">Special Sale</h6>
<h1 class="display-5 text-uppercase text-white mb-0">주문완료</h1>
</div>
</div>
<div class="container">
<h2 class="alert alert-danger">주문해주셔서 감사합니다.</h2>
</div>
</div>
</div>
<div class="container" style="padding-top: 30px">
<p><b> 주문은 <% out.println(shipping_shippingDate); %>에 배송될 예정입니다! ! </b>
<p><b> 주문번호 : <% out.println(shipping_cartId); %></b>
<p><a href="./products01.jsp" class="btn btn-secondary"> « 도서 목록</a>
</div>
<!-- footer -->
<%@ include file="footer.jsp"%>
<!-- Back to Top -->
<a href="#" class="btn btn-primary py-3 fs-4 back-to-top"><i class="bi bi-arrow-up"></i></a>
<!-- JavaScript Libraries -->
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="lib/easing/easing.min.js"></script>
<script src="lib/waypoints/waypoints.min.js"></script>
<script src="lib/owlcarousel/owl.carousel.min.js"></script>
<!-- Template Javascript -->
<script src="js/main.js"></script>
</body>
</html>
<%
session.invalidate();
for (int i = 0; i < cookies.length; i++) {
Cookie thisCookie = cookies[i];
String n = thisCookie.getName();
if (n.equals("Shipping_cartId"))
thisCookie.setMaxAge(0);
if (n.equals("Shipping_name"))
thisCookie.setMaxAge(0);
if (n.equals("Shipping_shippingDate"))
thisCookie.setMaxAge(0);
if (n.equals("Shipping_country"))
thisCookie.setMaxAge(0);
if (n.equals("Shipping_zipCode"))
thisCookie.setMaxAge(0);
if (n.equals("Shipping_addressName"))
thisCookie.setMaxAge(0);
response.addCookie(thisCookie);
}
%>
#06. 주문 취소페이지 작성하기
위의 완료페이지와 같이 <주문취소> 버튼을 눌렀을 때, 문구가 나오는 페이지입니다. checjOutCancelled.jsp파일을 만들어줍니다.
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<!-- Favicon -->
<link href="img/favicon.ico" rel="icon">
<!-- Google Web Fonts -->
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Poppins&family=Roboto:wght@700&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap" rel="stylesheet">
<!-- Icon Font Stylesheet -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.4.1/font/bootstrap-icons.css" rel="stylesheet">
<link href="lib/flaticon/font/flaticon.css" rel="stylesheet">
<!-- Libraries Stylesheet -->
<link href="lib/owlcarousel/assets/owl.carousel.min.css" rel="stylesheet">
<!-- Customized Bootstrap Stylesheet -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Template Stylesheet -->
<link href="css/style.css" rel="stylesheet">
<title>주문 취소</title>
</head>
<body>
<jsp:include page="menu.jsp" />
<div class="jumbotron">
<div class="container">
<h1 class="display-3">주문 취소</h1>
</div>
</div>
<div class="container">
<h2 class="alert alert-danger">주문이 취소되었습니다.</h2>
</div>
<div class="container">
<p><a href="./main.jsp" class="btn btn-secondary"> « 메인으로</a>
</div>
<!-- footer -->
<%@ include file="footer.jsp"%>
<!-- Back to Top -->
<a href="#" class="btn btn-primary py-3 fs-4 back-to-top"><i class="bi bi-arrow-up"></i></a>
<!-- JavaScript Libraries -->
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="lib/easing/easing.min.js"></script>
<script src="lib/waypoints/waypoints.min.js"></script>
<script src="lib/owlcarousel/owl.carousel.min.js"></script>
<!-- Template Javascript -->
<script src="js/main.js"></script>
</body>
</html>