Servlet구매하기2 : 구매하기

OrderFrontController.java의 doProcess()의 주소비교 후 처리부분에 코드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
// 주소에 따른 처리 구분 (주소 매핑후 이동)
if(command.equals("/OrderStar.or")){
System.out.println("C: /OrderStar.or 호출");
action = new OrderStarAction();
try { forward = action.execute(request, response);
} catch (Exception e) { e.printStackTrace(); }
//주문하기
}else if(command.equals("/OrderAdd.or")){
System.out.println("C: /OrderAdd.or 호출");
action = new OrderAddAction();
try { forward = action.execute(request, response);
} catch (Exception e) { e.printStackTrace(); }
}




OrderStarAction.java 생성

  • 구매페이지에 장바구니 정보 가져와서 뷰페이지에서 보여주기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class OrderStarAction implements Action {

@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("M : OrderStarAction의 execute() 호출");
// 로그인 정보 (로그인 처리필요)
HttpSession session = request.getSession();
String id = (String) session.getAttribute("id");
ActionForward forward = new ActionForward();
if(id == null){
forward.setPath("./MemberLogin.me");
forward.setRedirect(true);
return forward;
}
//장바구니정보 저장
BasketDAO bkdao = new BasketDAO();
Vector total = bkdao.getBasketList(id);
request.setAttribute("basketList", total.get(0));
//장바구니에 저장된 상품정보 정보
request.setAttribute("goodsList", total.get(1));

//구매회원정보 저장
MemberDAO mdao = new MemberDAO();
//MemberBean mb = mdao.getMember(id); 한 줄에 처리
request.setAttribute("memberbean", mdao.getMember(id));

//페이지이동
forward.setPath("./goods_order/goods_buy.jsp");
forward.setRedirect(false);
return forward;
}

}




OrderAddAction.java 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class OrderAddAction implements Action {

@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("M : OrderAddAction의 execute() 호출");
// 로그인 정보 (로그인 처리필요)
HttpSession session = request.getSession();
String id = (String) session.getAttribute("id");
ActionForward forward = new ActionForward();
if(id == null){
forward.setPath("./MemberLogin.me");
forward.setRedirect(true);
return forward;
}

// 전달된 정보를 저장
// 한글처리
// OrderDTO 객체 생성 -> 정보 저장
OrderDTO odto = new OrderDTO();
odto.setO_m_id(id);
odto.setO_receive_name(request.getParameter("o_receive_name"));
odto.setO_receive_phone(request.getParameter("o_receive_phone"));
odto.setO_receive_addr1(request.getParameter("o_receive_addr1"));
odto.setO_receive_addr2(request.getParameter("o_receive_addr2"));
odto.setO_receive_memo(request.getParameter("o_receive_memo"));
odto.setO_trade_payer(request.getParameter("o_trade_payer"));
odto.setO_trade_type("온라인 입금"); //라디오버튼값 고정, 필요시 value를 받아서 set하기

BasketDAO bkdao = new BasketDAO();
Vector data = bkdao.getBasketList(id);

// 장바구니 정보
List<BasketDTO> basketList = (List<BasketDTO>) data.get(0);

// 상품정보
List<GoodsDTO> goodsList = (List<GoodsDTO>) data.get(1);

// 결재 모듈(카카오,아임포트,U+) 추가영역
System.out.println("M : 결제모듈 성공");

// OrderDAO 객체 생성 - addOrder(주문정보,장바구니정보,상품정보)
OrderDAO odao = new OrderDAO();
odao.addOrder(odto, basketList, goodsList);
System.out.println("M : itwill_order 테이블에 저장완료");

//구매확정 메일이나 문자 , 카톡메세지 등을 유저에게 보내는 추가영역
System.out.println("M : 구매확정 내역 전송 완료");

//상품정보 수정 - 구매 수량만큼 구매갯수 차감
GoodsDAO gdao = new GoodsDAO();
gdao.updateAmount(basketList);

//장바구니 비우기(삭제)
bkdao.deleteBasket(id);

//페이지이동
forward.setPath("./OrderList.or");
forward.setRedirect(true);
return forward;
}

}




OrderDAO.java 생성 후 addOrder()메서드 코드 추가

  • Calendar new로 객체생성은 할 수 없고 getInstance()로 만들어져있는 객체를 가져와다가 활용해야한다

    • 이를 싱글톤패턴이라고 부른다
  • 날짜정보 포맷 : SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

    • 예시20200917
  • 구매할 상품 번호는 basketList과 goodsList둘 다 있다. 어디서 가져와야할까?

    • basketList안의 상품번호가 정확하다.
  • List에서 정보를 꺼내오려면 get(인덱스)을 사용해서 거기서 또 GTO의 정보를 꺼내야한다

    • 불편하기때문에 미리 DTO객체를 생성
      1
      2
      3
      4
      for(int i=0; i<basketList.size(); i++){
      //미리생성
      BasketDTO bkdto = (BasketDTO) basketList.get(i);
      GoodsDTO gdto = (GoodsDTO) goodsList.get(i);
  • 전체코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//주문등록하기
public void addOrder(OrderDTO odto, List<BasketDTO> basketList, List<GoodsDTO> goodsList) {
int o_num = 0; //일련번호
int trade_num = 0; //주문번호

//주문번호 계산시 사용
//Calendar new로 객체생성은 할 수 없고 getInstance()로 만들어져있는 객체를 가져와다가 활용해야한다
//이를 싱글톤패턴이라고 부른다
Calendar cal = Calendar.getInstance(); //시스템날짜
//날짜 정보를 포맷
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); //예시20200917

try{
getCon();
//주문테이블(itwillbs_order) 번호 계산하기
sql = "selct max(o_num) from itwill_order";
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
if(rs.next()){
o_num = rs.getInt(1)+1;
}
trade_num = o_num;
System.out.println("trade_num= "+trade_num);
System.out.println("o_num= "+o_num);

//전달정보 사용해서 데이터베이스에 추가
for(int i=0; i<basketList.size(); i++){
BasketDTO bkdto = (BasketDTO) basketList.get(i);
GoodsDTO gdto = (GoodsDTO) goodsList.get(i);

sql = "insert into itwill_order values(?,?,?,?,?,"
+ "?,?,?,?,?,"
+ "?,?,?,?,?,"
+ "?,now(),?,now(),?)";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, o_num);
pstmt.setString(2, sdf.format(cal.getTime())+"-"+trade_num); //20200917-숫자들
pstmt.setInt(3, bkdto.getB_g_num()); //구매할 상품 번호basketList과 goodsList둘다있다
pstmt.setString(4, gdto.getName());
pstmt.setInt(5, bkdto.getB_g_amount());

pstmt.setString(6, bkdto.getB_g_size());
pstmt.setString(7, bkdto.getB_g_color());
pstmt.setString(8, bkdto.getB_m_id());
pstmt.setString(9, odto.getO_receive_name());
pstmt.setString(10, odto.getO_receive_addr1());
pstmt.setString(11, odto.getO_receive_addr2());
pstmt.setString(12, odto.getO_receive_phone());
pstmt.setString(13, odto.getO_receive_memo());

// 상품의 금액 * 상품 구매갯수
pstmt.setInt(14, bkdto.getB_g_amount() * gdto.getPrice());

pstmt.setString(15, odto.getO_trade_type());
pstmt.setString(16, odto.getO_trade_payer());
pstmt.setString(17, ""); //운송번호 : 추후 운송장번호가 나오면 관리자가 기입
pstmt.setInt(18, 0);//주문상태 : 추후 상태에 맞춰서 관리자가 변경함

pstmt.executeUpdate();

o_num++; //일련번호를 증가시킴
//한 사람의 장바구니에 있는 모든 주문을 입력하기 전까지 계속해서 1씩 증가시킴
//유저가 바뀌는 경우 sql구문(max(o_num))이 시작번호를 계산한다
}
System.out.println("DAO: 주문성공");
}catch(Exception e){
e.printStackTrace();
}finally {
closeDB();
}
}//end of addOrder()




GoodsDAO.java에서 updateAmount() 추가 작성

  • 장바구니에 있던 상품이 구매가 완료되면 재고수량에서 구매수량만큼을 업데이트해줘야한다.
  • 이퀄기호(=) 없는 for문을 쓰는 것이 좋다
    • i는 0부터 시작 권장
    • 이퀄기호 없는 조건식 사용 권장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//구매시 재고수량수정
public void updateAmount(List<BasketDTO> basketList) {
try{
getCon();
//이퀄기호 없는 for문을 쓰는 것이 좋다
for(int i=0; i<basketList.size(); i++){
BasketDTO bkdto = basketList.get(i); //받아올때 제네릭으로 캐스팅해서 받아왔으므로 캐스팅안해도됨
sql = "update itwill_goods set amount=amount-? where gno=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, bkdto.getB_g_amount());
pstmt.setInt(2, bkdto.getB_g_num());
pstmt.executeUpdate();
}
System.out.println("DAO: 구매 후 재고수량수정완료");
}catch (Exception e) {
e.printStackTrace();
} finally {
closeDB();
}
}//end of updateAmount




BasketDAO.java 생성 후 deleteBasket()메서드 오버로딩하여 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//장바구니 상품 전체 삭제 (오버로딩)
public void deleteBasket(String id) {
try{
getCon();
sql ="delete from itwill_basket where b_m_id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.executeUpdate();
System.out.println("DAO: 구매 후 본인 장바구니 전체 삭제 완료");
}catch(Exception e){
e.printStackTrace();
}finally {
closeDB();
}
}//end of 장바구니전체삭제




goods_buy.jsp 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<%
//OrderStarAction에 저장한 정보를 가져오기
//장바구니정보 저장된 거 가져오기
List basketList = (List) request.getAttribute("basketList");
//장바구니에 저장된 상품정보 정보저장된 거 가져오기
List goodsList = (List) request.getAttribute("goodsList");
//구매회원정보 저장된 거 가져오기
MemberBean mb = (MemberBean) request.getAttribute("memberbean");


%>
<table border="1">
<caption>주문상세내역</caption>
<tr>
<th>사진</th>
<th>상품명</th>
<th>수량(단위: 개)</th>
<th>색상</th>
<th>사이즈</th>
<th>가격(단위: 원)</th>
</tr>
<%
for(int i=0; i<basketList.size(); i++){
BasketDTO bkdto = (BasketDTO) basketList.get(i);
GoodsDTO gdto = (GoodsDTO) goodsList.get(i);
%>
<tr>
<td><img src="./upload/<%=gdto.getImage().split(",")[0]%>" height="100px"></td>
<td><%=gdto.getName() %></td>
<td><%=bkdto.getB_g_amount() %></td>
<td><%=bkdto.getB_g_color() %></td>
<td><%=bkdto.getB_g_size() %></td>
<td><%=gdto.getPrice() %></td>
</tr>
<%} %>
</table>

<hr>
<fieldset>
<legend>주문자정보</legend>
<%

%>
<form action="./OrderAdd.or" method="post"></form>
구매자 이름 : <input type="text" name="name" value="<%=mb.getName() %>" readonly><br>
구매자 연락처 : <input type="text" name="tel" value=""><br>
구매자 이메일 : <input type="text" name="email" value="<%=mb.getEmail()%>" readonly><br>
<h2>배송지정보</h2>
받는 사람 이름 : <input type="text" name="o_receive_name" value=""><br>
받는 사람 연락처 : <input type="text" name="o_receive_phone" value=""><br>
배송지 주소 : <input type="text" name="o_receive_addr1" value=""><br>
나머지 주소 : <input type="text" name="o_receive_addr2" value=""><br>
기타 요청사항 : <input type="text" name="o_memo" value=""><br>
<h2>결제정보</h2>
<input type="radio" name="o"> 신용카드
<input type="radio" name="o"> 온라인입금
<input type="radio" name="o"> 휴대폰 결재
<input type="radio" name="o"> 문화상품권<br>
입급자명 (온라인 입금전용): <input type="text" name="o_trade_payer" value="<%=mb.getName()%>"> <br>
<hr>
<input type="submit" class="btn" value="결제하기">
<input type="reset" class="btn" value="초기화">
</fieldset>




BasketListAction.java에서 장바구니에 정보가 하나도 없을 경우 예외처리

  • BasketList가 null인 경우 예외처리 - 아래 코드 추가
1
2
3
4
5
6
//장바구니에 정보가 하나도 없을 경우
if(basketList.size() <= 0){
request.setAttribute("basketListNull", true);
}else{
request.setAttribute("basketListNull", false);
}
  • 전체코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class BasketListAction implements Action {

@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("M : BasketListAction의 execute() 호출");
// 로그인 정보 (로그인 처리필요)
HttpSession session = request.getSession();
String id = (String) session.getAttribute("id");
ActionForward forward = new ActionForward();
if(id == null){
forward.setPath("./MemberLogin.me");
forward.setRedirect(true);
return forward;
}
//한글처리
request.setCharacterEncoding("UTF-8");

//BasketDAO 이용하여 장바구니 정보(옵션, 구매수량)+해당 상품정보(이름,이미지,가격) 가져오는 메서드 호출
BasketDAO bkdao = new BasketDAO();
Vector totalData = bkdao.getBasketList(id);

List<BasketDTO> basketList = (List<BasketDTO>) totalData.get(0);

//장바구니에 정보가 하나도 없을 경우
if(basketList.size() <= 0){
request.setAttribute("basketListNull", true);
}else{
request.setAttribute("basketListNull", false);
}

//request에 저장
// request.setAttribute("totalData", totalData);
// List<BasketDTO> basketList
// =(List<BasketDTO>) totalData.get(0);
// request.setAttribute("basketList", basketList);
// => 원래 정보는 벡터에 저장되어 있지만, Action페이지에서
// 벡터의 정보를 꺼내서 각각 request에 저장해서 전달
// => View에서는 복잡한 연산을 피해야함. 바로 사용가능한 List형태로 전달하는것이 좋다.

request.setAttribute("basketList", totalData.get(0));
request.setAttribute("goodsList", totalData.get(1));

//페이지이동
forward.setPath("./goods_order/goods_basket.jsp");
forward.setRedirect(false);

return forward;
}

}




goods_basket.jsp에서 장바구니에 정보가 하나도 없을 경우 예외처리

  • BasketList가 null인 경우 예외처리
1
2
3
4
5
6
boolean listIsNull = (boolean) request.getAttribute("basketListNull");
if(listIsNull){ //전달된 리스트정보가 null인 경우

}else{

}
  • 전체코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<%
//한글처리
request.setCharacterEncoding("UTF-8");

//Listnull인경우 처리
boolean listIsNull = (boolean) request.getAttribute("basketListNull");
if(listIsNull){ //전달된 리스트정보가 null인 경우
%>
<table border="1">
<caption><%=session.getAttribute("id") %>님의 장바구니</caption>
<tr>
<th>번호</th>
<th>사진</th>
<th>상품명</th>
<th>크기</th>
<th>색상</th>
<th>수량</th>
<th>가격</th>
<th>삭제</th>
</tr>
<%
}else{ ////전달된 리스트정보가 null이 아닌 경우
//basketList에서 구현한 정보를 전달받아서 처리
List basketList = (List) request.getAttribute("basketList");
List goodsList = (List) request.getAttribute("goodsList");
BasketDTO bk = (BasketDTO) basketList.get(0);
%>
<!-- 장바구니 번호, 사진(대표이미지), 상품명, 사이즈,색상,수량,가격, 삭제 -->
<table border="1">
<caption><%=bk.getB_m_id() %>님의 장바구니</caption>
<tr>
<th>번호</th>
<th>사진</th>
<th>상품명</th>
<th>크기</th>
<th>색상</th>
<th>수량</th>
<th>가격</th>
<th>삭제</th>
</tr>
<%
//EL태그는 FOR문과 상관없이 <c:forEach> 사용해서 출력해야한다.
for(int i=0; i<basketList.size(); i++){
BasketDTO bkdto = (BasketDTO) basketList.get(i);
GoodsDTO gdto = (GoodsDTO) goodsList.get(i);
%>
<tr>
<!-- 순차 넘버링 -->
<td><%=i+1%></td>
<td><img src="./upload/<%=gdto.getImage().split(",")[0] %>" height="100px"></td>
<td><%=gdto.getName() %></td>
<td><%=bkdto.getB_g_size() %></td>
<td><%=bkdto.getB_g_color() %></td>
<td><%=bkdto.getB_g_amount() %></td>
<td><%=gdto.getPrice() %></td>
<td>
<input type="button" class="btn" value="[장바구니에서 삭제]"
onclick="location.href='./BasketDelete.ba?b_num=<%=bkdto.getB_num()%>'">
</td>
</tr>
<%
}
} %>
</table>
<input type="button" class="btn" value="[구매하기]" onclick="location.href='./OrderStar.or'">
<input type="button" class="btn" value="[계속 쇼핑하기]" onclick="location.href='./GoodsList.go'">