주문 처리를 위한 DAO 를 만들기 위해서 주문 정보를 담을 VO를 만든다.
DTO (VO)
OrderVO
public class OrderVO { private int odseq; private int oseq; private String id; private Timestamp indate; private int pseq; private int quantity; private String mname; private String zip_num; private String address; private String phone; private String pname; private int price2; setter, getter
주문 처리 등록을 위해 CartVO 자바빈 클래스에 oseq 주문번호를 추가한다.
CartVO
public class CartVO { private int odseq; //주문 상세 번호 private int oseq; //주문번호 private int cseq; //장바구니 번호 private String id; //회원아이디 private int pseq; //상품번호 private String mname; //회원이름 private String pname; //상품이름 private int quantity; //수량 private int price2; //가격 private String image; private Timestamp indate; setter, getter
주문 처리의 테이블 내용은 다음과 같다.
SQL
-- 주문 테이블 명 tbl_orders create table tbl_orders( oseq number PRIMARY KEY, -- 주문번호 id varchar2(20) , -- 주문자 아이디 , tbl_member 테이블의 기본키의 id컬럼 indate date default sysdate -- 주문일 )TABLESPACE macaronics ; -- tbl_orders 시퀀스 생성 create SEQUENCE orders_seq START WITH 1 INCREMENT BY 1 NOMAXVALUE NOCYCLE ; -- tbl_orders 외래키 제약 조건 추가 alter table TBL_ORDERS add CONSTRAINT TBL_ORDERS_id_fk FOREIGN KEY (id) REFERENCES tbl_member(id) on DELETE CASCADE ; -- 주문 상세 테이블 생성 create table tbl_order_detail( odseq number PRIMARY KEY , -- 주문 상세번호 order_detail_seq 시퀀스 객체로 자동 일련 번호 부여 oseq number , -- FK 주문번호 tbl_orders 테이블의 기본 키인 oseq 컬럼 pseq number , -- FK 상품번호 tbl_product 테이블릐 기본 키인 pseq 컬럼 quantity number, -- 주문수량 result char(1) DEFAULT 1 -- 처립여부 1: 미처리 2 : 처리 )TABLESPACE macaronics ; -- 주문 상세 테이블 시퀀스 생성 create SEQUENCE order_detail_seq START WITH 1 INCREMENT by 1 NOMAXVALUE NOCACHE NOCYCLE; -- TBL_ORDER_DETAIL oseq 외래키 제약 조건 추가 alter table TBL_ORDER_DETAIL add CONSTRAINT tbl_order_detail_oseq_FK FOREIGN key(oseq) REFERENCES tbl_orders(oseq) on DELETE CASCADE ; -- TBL_ORDER_DETAIL pseq 외래키 제약 조건 추가 alter table TBL_ORDER_DETAIL add CONSTRAINT tbl_order_detail_pseq_FK FOREIGN key(pseq) REFERENCES tbl_product (pseq) on DELETE CASCADE ;
주문 테이블을 엑세스하는 DAO 클래스 만들기
DAO
주문 등록에 순서는 다음과 같이 개발진행한다.
1. tbl_orders 등록하기
2. 등록된 oseq 가져오기
3. 주문 상세 tbl_order_detail 테이블에 개별 주문 상품 등록 하기
OrderDAO
package net.macaronics.web.dao; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import config.MybatisService; import net.macaronics.web.dto.CartVO; import net.macaronics.web.dto.OrderVO; public class OrderDAO { private static OrderDAO instance; private Logger logger =LogManager.getLogger(OrderDAO.class); private SqlSession sqlSession; private OrderDAO() { } public static OrderDAO getInstance() { if (instance == null) { instance = new OrderDAO(); } return instance; } //주문 tbl_orders 테이블에 등록 public int insertOrder(List<CartVO> cartList, String id){ int maxOseq=0; try{ sqlSession =MybatisService.getFactory().openSession(); //1. tbl_orders 등록하기 sqlSession.insert("order.insertOrder", id); sqlSession.commit(); //2. 등록된 oseq 가져오기 maxOseq=sqlSession.selectOne("order.selectMaxOseq"); logger.info("maxOseq -----------------{} " , maxOseq); //3. 주문 상세 tbl_order_detail 테이블에 개별 주문 상품 등록 하기 for(CartVO cartVO : cartList){ //주문 테이블의 maxOseq 번호를 자바빈에 저장하기 cartVO.setOseq(maxOseq); insertOrderDetail(cartVO); } }catch(Exception e){ e.printStackTrace(); }finally{ MybatisService.sessionClose(sqlSession); } return maxOseq; } // 주문 상세 tbl_order_detail 테이블에 개별 주문 상품 등록 public void insertOrderDetail(CartVO cartVO){ try{ logger.info("insertOrderDetail ------- {}" , cartVO.toString()); sqlSession=MybatisService.getFactory().openSession(); sqlSession.insert("order.insertOrderDetail", cartVO); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.commit(); MybatisService.sessionClose(sqlSession); } } //주문 목록 불러오기 public List<OrderVO> listOrderById(String id, String result, int oseq){ List<OrderVO> orderList=new ArrayList<>(); try{ sqlSession =MybatisService.getFactory().openSession(); Map<String, Object> map =new HashMap<>(); map.put("id", id); map.put("result", result); map.put("oseq", oseq); orderList=sqlSession.selectList("order.listOrderById" , map); }catch(Exception e){ e.printStackTrace(); }finally{ MybatisService.sessionClose(sqlSession); } return orderList; } //현재 진행중인 주문처리 목록 상세 보기를 위한 tbl_orders 테이블의 주문번호 불러오기 public List<Integer> selectSeqOrdering(String id){ List<Integer> oseqList=new ArrayList<>(); try{ sqlSession=MybatisService.getFactory().openSession(); oseqList=sqlSession.selectList("order.selectSeqOrdering", id); }catch(Exception e){ e.printStackTrace(); }finally{ MybatisService.sessionClose(sqlSession); } return oseqList; } }
주문 처리를 위한 액션 클래스
Action
OrderInsertAction
package net.macaronics.web.controll; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import net.macaronics.web.controll.action.Action; import net.macaronics.web.dao.CartDAO; import net.macaronics.web.dao.OrderDAO; import net.macaronics.web.dto.CartVO; import net.macaronics.web.dto.MemberVO; public class OrderInsertAction implements Action { @Override public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String url = "MacaronicsServlet?command=order_list&oseq="; HttpSession session =request.getSession(); MemberVO loginUser=(MemberVO)session.getAttribute("loginUser"); if(loginUser==null){ url = "MacaronicsServlet?command=login_form"; }else{ CartDAO cartDAO =CartDAO.getInstance(); //장바구니에 담긴 목록을 가져온다. List<CartVO> cartList=cartDAO.listCart(loginUser.getId()); OrderDAO orderDAO =OrderDAO.getInstance(); //주문 상품으로 등록한다. 반환 값으로 현재 등록한 주문번호를 가져온다. int maxOseq=orderDAO.insertOrder(cartList, loginUser.getId()); //장바구니 비우기 for(CartVO cart: cartList){ cartDAO.deleteCart(cart.getCseq(), loginUser.getId()); } url +=maxOseq; } response.sendRedirect(url); } }
OrderListAction
package net.macaronics.web.controll; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import net.macaronics.web.controll.action.Action; import net.macaronics.web.dao.CartDAO; import net.macaronics.web.dao.OrderDAO; import net.macaronics.web.dto.CartVO; import net.macaronics.web.dto.MemberVO; import net.macaronics.web.dto.OrderVO; public class OrderListAction implements Action{ //주문 처리후 바로 보여주는 주문 목록 페이지 @Override public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String url ="mypage/orderList.jsp"; HttpSession session =request.getSession(); MemberVO loginUser =(MemberVO)session.getAttribute("loginUser"); if(loginUser ==null){ url="MacaronicsServlet?command=login_form"; }else{ OrderDAO orderDAO =OrderDAO.getInstance(); int oseq=Integer.parseInt(request.getParameter("oseq")); // 미처리 항목 1을 넣는다. List<OrderVO> orderList =orderDAO.listOrderById(loginUser.getId(), "1", oseq); int orderTotalPrice =0; for(OrderVO orderVO : orderList){ orderTotalPrice +=orderVO.getPrice2()*orderVO.getQuantity(); } request.setAttribute("orderList", orderList); request.setAttribute("orderTotalPrice", orderTotalPrice); } request.getRequestDispatcher(url).forward(request, response); } }
View
주문 내역 리스트 출력
orderList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="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> <jsp:include page="../include/Header.jsp" /> </head> <body> <jsp:include page="../include/HeaderMenu.jsp" /> <!-- catg header banner section --> <section id="aa-catg-head-banner"> <img src="/dailyShop/img/slider/4.jpg" alt="fashion img" height="300" style="margin-left: auto; margin-right: auto; display: block;"> <div class="aa-catg-head-banner-area"> <div class="container"> </div> </div> </section> <!-- / catg header banner section --> <!-- product category --> <section id="aa-product-category"> <div class="container"> <div class="row"> <div class="col-lg-9 col-md-9 col-sm-8 col-md-push-3"> <div class="aa-product-catg-content"> <div class="aa-product-catg-body"> <div class="table-responsive"> <table class="table table-striped"> <tr class="danger"> <th>상품명</th> <th>수량</th> <th>가격</th> <th>주문일</th> <th>진행상태</th> </tr> <tr> <c:forEach items="${orderList}" var="orderVO"> <tr> <td>${orderVO.pname}</td> <td>${orderVO.quantity }</td> <td><fmt:formatNumber type="currency" value="${orderVO.price2*orderVO.quantity }"/></td> <td><fmt:formatDate value="${orderVO.indate }" type="date" /></td> <td>처리 진행 중</td> </tr> </c:forEach> </tr> </table> </div> </div> <div class="text-center"> <input type="button" value="쇼핑 계속하기" class="btn btn-primary" onclick="location.href='MacaronicsServlet?command=index'" > </div> </div> </div> <div class="col-lg-3 col-md-3 col-sm-4 col-md-pull-9"> <aside class="aa-sidebar"> <!-- single sidebar --> <div class="aa-sidebar-widget"> <h3>Category</h3> <ul class="aa-catg-nav"> <li><a href="MacaronicsServlet?command=category&kind=1">남성운동화</a></li> <li><a href="MacaronicsServlet?command=category&kind=2">여성운동화</a></li> <li><a href="MacaronicsServlet?command=category&kind=3">남성구두</a></li> <li><a href="MacaronicsServlet?command=category&kind=4">여성구두</a></li> <li><a href="MacaronicsServlet?command=category&kind=5">On Sale</a></li> </ul> </div> </aside> </div> </div> </div> </section> <!-- / product category --> <jsp:include page="../include/Footer.jsp" />
제작 : macaronics.net - Developer Jun Ho Choi
소스 : https://github.com/braverokmc79/jsp_sin
${request.getContextPath() } 처리를 안한 부분이 있으므로
루트 설정( http://macaronics.net/index.php/m01/jsp/view/1352) 및 server.xml 에서 DB 컨넥션 설정은 필수 설정이다.
댓글 ( 4)
댓글 남기기