Servlet관리자용주문목록3 : 고객주문목록에서 주문 상태 및 운송장정보 변경

주문상태,운송장번호 수정 시나리오

  1. 페이지 요청 : /AdminOrderDetail.ao?trade_num=20200917-1
  2. 주문상태, 운송장 번호 입력
    • 주문번호 저장해서 이동 (hidden)
  3. ‘수정하기’ 버튼 클릭 -> submit
  4. 수정할 페이지 이동 (+ 가상주소)
    • 주문상태, 운송장번호, 주문번호
  5. 컨트롤러 -> Action -> DAO
    1. DAO 이동시 (주문상태, 운송장번호, 주문번호 )포함 이동
    2. update 구문사용 (주문상태,운송장번호 수정) 주문번호 - 조건절
  6. 페이지 이동 (관리자 주문 리스트)




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

1
2
3
4
5
6
7
8
9
10
11
12
13
	//주문상태와 운송장번호  변경
}else if(command.equals("/AdminOrderModify.ao")){
System.out.println("C : AdminOrderModify.ao 호출");
action = new AdminOrderModifyAction();
try{ forward = action.execute(request, response);
}catch(Exception e) {e.printStackTrace();}
//주문상태와 운송장번호 변경을 볼 수 있는 상세페이지
}else if(command.equals("/AdminOrderDetail.ao")){
System.out.println("C : AdminOrderDetails.ao 호출");
action = new AdminOrderDetailAction();
try{ forward = action.execute(request, response);
}catch(Exception e) {e.printStackTrace();}
}




AdminOrderModifyAction.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
public class AdminOrderModifyAction implements Action {

@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("M : AdminOrderModifyAction의 execute() 호출");
//한글처리
request.setCharacterEncoding("UTF-8");

// 로그인 정보 (로그인 처리필요)
HttpSession session = request.getSession();
String id = (String) session.getAttribute("id");
ActionForward forward = new ActionForward();
if(id == null || !id.equals("admin")){
forward.setPath("./MemberLogin.me");
forward.setRedirect(true);
return forward;
}

//전달정보 파라미터값 저장
String trade_num = request.getParameter("trade_num");
int status = Integer.parseInt(request.getParameter("status"));
String trans_num = request.getParameter("trans_num");

//AdminOrderDAO 객체 생성 -> 배송지 수정등을 가능하게 하면 받아야할 파라미터가 많아져서 비효율적이다.
//=> DTO를 사용하면 한번에 들고 다닐 수 있다.
OrderDTO odto = new OrderDTO();
odto.setO_trade_num(request.getParameter("trade_num"));
odto.setO_status(Integer.parseInt(request.getParameter("status")));
odto.setO_trans_num(request.getParameter("trans_num"));

AdminOrderDAO aodao = new AdminOrderDAOImpl();
//aodao.updateOrder(trade_num); //주문상태만 단순변경하는 메서드
aodao.updateOrder(odto); //주문상태와 운송번호 같이 변경하는 메서드 +a 가능

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

}




AdminOrderDAO.java에 updateOrder()메서드 코드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface AdminOrderDAO {
// 인터페이스안의 추상메서드이기때문에

// 관리자가 주문목록을 확인하는 기능 getAdminOrderList()
public List getAdminOrderList();

// 주문번호를 이용하여 주문상태만 변경
public void updateOrder(String trade_num);

// 주문번호를 사용해서 주문상태,운송장번호 변경 가능
public void updateOrder(OrderDTO odto);

// 주문번호에 해당하는 주문정보(리스트 전체)를 가져오는 동작을 처리
public abstract List getAdminOrderDetail(String trade_num);

}




AdminOrderDAOImpl.java에 updateOrder()메서드 오버라이딩하여 코드 추가

  • updateOrder(String trade_num)메서드는 pstmt.setInt(1, 1)` 이렇게 작성하면 다른 옵션들은 처리를 고민해야한다.
  • 1~5번까지(1-“발송준비” 2 - “발송완료” 3 - “배송중” 4 - “배송완료” 5 - “주문취소”) 모든 버튼을 다 만들어야할까? 따라서 이 코드는 매우 비효율적이다.
  • 따라서 updateOrder(OrderDTO odto)메서드를 작성해야한다.
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
//주문목록에서 주문상태만 단순 변경
@Override
public void updateOrder(String trade_num) {
try{
getCon();
sql="update itwill_order set o_status=? where o_trade_num=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, 1); //1-발송준비 2 - "발송완료" 3 - "배송중" 4 - "배송완료" 5 - "주문취소"
pstmt.setString(2, trade_num);
pstmt.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
closeDB();
}
}//end of updateOrder()

//주문번호를 사용해서 주문상태, 운송장번호 수정 가능
//오버라이딩인 동시에 메서드 오버로딩
@Override
public void updateOrder(OrderDTO odto) {
try{
getCon();
sql="update itwill_order set o_status=?, o_trans_num=? where o_trade_num=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, odto.getO_status());
pstmt.setString(2, odto.getO_trans_num());
pstmt.setString(3, odto.getO_trade_num());

int num = pstmt.executeUpdate(); //몇줄의 row가 변경되었는지를 int로 리턴해줌
System.out.println("DAO: 주문상태랑 운송장번호 수정: "+num);
}catch(Exception e){
e.printStackTrace();
}finally{
closeDB();
}
}//end of updateOrderDetail()




admin_order_list.jsp 링크 수정

  • 수정버튼의 기존 코드 './AdminOrderModify.ao?trade_num=<%=odto.getO_trade_num()%>'에서 './AdminOrderDetail.ao?trade_num=<%=odto.getO_trade_num()%>'로 변경
1
2
3
4
5
6
<td> <input type="button" class="btn" value="수정" 
onclick="location.href='./AdminOrderDetail.ao?trade_num=<%=odto.getO_trade_num()%>'" >
/
<input type="button" class="btn" value="삭제"
onclick="location.href=" >
</td>




AdminOrderDetailAction.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
public class AdminOrderDetailAction implements Action {

@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 한글처리
request.setCharacterEncoding("UTF-8");

// 관리자 ID해당하는 세션값 제어
HttpSession session = request.getSession();
String id = (String) session.getAttribute("id");
ActionForward forward = new ActionForward();
if(id == null || !id.equals("admin")){
forward.setPath("./MemberLogin.me");
forward.setRedirect(true);
return forward;
}

// trade_num 파라미터값 저장
String trade_num = request.getParameter("trade_num");

// 주문번호에 해당하는 정보를 전부 가져오는 동작을 처리
AdminOrderDAO aodao = new AdminOrderDAOImpl();

// 주문정보를 저장
request.setAttribute("adminOrderdetailList", aodao.getAdminOrderDetail(trade_num));

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




AdminOrderDAO.java에 getAdminOrderDetail()메서드 코드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface AdminOrderDAO {
// 인터페이스안의 추상메서드이기때문에

// 관리자가 주문목록을 확인하는 기능 getAdminOrderList()
public List getAdminOrderList();

// 주문번호를 이용하여 주문상태 변경
public void updateOrder(String trade_num);

// 주문번호에 해당하는 주문정보(리스트 전체)를 가져오는 동작을 처리
public abstract List getAdminOrderDetail(String trade_num);

}




AdminOrderDAOImpl.java에 getAdminOrderDetail()메서드 오버라이딩하여 코드 추가

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
//주문번호에 해당하는 주문정보(리스트 전체)를 가져오는 동작을 처리
@Override
public List getAdminOrderDetail(String trade_num) {
List<OrderDTO> adminOrderdetailList = new ArrayList<OrderDTO>();
try{
getCon();
sql="select * from itwill_order where o_trade_num=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, trade_num);
rs = pstmt.executeQuery();
while(rs.next()){
OrderDTO odto = new OrderDTO();
odto.setO_date(rs.getDate("o_date"));
odto.setO_g_amount(rs.getInt("o_g_amount"));
odto.setO_g_color(rs.getString("o_g_color"));
odto.setO_g_name(rs.getString("o_g_name"));
odto.setO_g_num(rs.getInt("o_g_num"));
odto.setO_g_size(rs.getString("o_g_size"));
odto.setO_m_id(rs.getString("o_m_id"));
odto.setO_receive_memo(rs.getString("o_receive_memo"));
odto.setO_num(rs.getInt(1)); //컬럼명 대신 인덱스번호로도 가능
odto.setO_receive_addr1(rs.getString("o_receive_addr1"));
odto.setO_receive_addr2(rs.getString("o_receive_addr2"));
odto.setO_receive_name(rs.getString("o_receive_name"));
odto.setO_receive_phone(rs.getString("o_receive_phone"));
odto.setO_status(rs.getInt("o_status"));
odto.setO_sum_money(rs.getInt("o_sum_money"));
odto.setO_trade_date(rs.getDate("o_trade_date"));
odto.setO_trade_num(rs.getString(2)); //컬럼명 대신 인덱스번호로도 가능
odto.setO_trade_payer(rs.getString("o_trade_payer"));
odto.setO_trade_type(rs.getString("o_trade_type"));
odto.setO_trans_num(rs.getString("o_trans_num"));

adminOrderdetailList.add(odto);
}
}catch(Exception e){
e.printStackTrace();
}finally{
closeDB();
}
return adminOrderdetailList;
}//end of getAdminOrderDetail()




admin_order_modify.jsp 생성

  • 금액에 천의 단위를 입력하고 싶으면 DecimalFormat 클래스를 사용하면 된다.
    • DecimalFormat dc = new DecimalFormat("###,###,###,###,###원");
  • 테이블전체를 form태그로 감싸야한다.
  • AdminOrderDAO 객체 생성 -> 폼태그로 전달받은 파라미터값을 리퀘스트파라미터로 받는다. -> 배송지 수정들을 가능하게 하면 받아야할 파라미터가 많아져서 비효율적이다. 인자가 많아질수록 성능이 비효율적이다 => DTO를 사용하면 한번에 들고 다닐 수 있다.
    • 보통 인자는 4~5까지는 파라미터로 받고 그 이상인 경우는 DTO나 BEAN을 이용해야 성능이 좋다.
1
2
3
4
5
6
7
8
9
10
11
//전달정보 파라미터값 저장
String trade_num = request.getParameter("trade_num");
int status = Integer.parseInt(request.getParameter("status"));
String trans_num = request.getParameter("trans_num");

//AdminOrderDAO 객체 생성 -> 배송지 수정들을 가능하게 하면 받아야할 파라미터가 많아져서 비효율적이다.
//=> DTO를 사용하면 한번에 들고 다닐 수 있다.
OrderDTO odto = new OrderDTO();
odto.setO_trade_num(request.getParameter("trade_num"));
odto.setO_status(Integer.parseInt(request.getParameter("status")));
odto.setO_trans_num(request.getParameter("trans_num"));
  • 전체태그
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<%
//한글처리
request.setCharacterEncoding("UTF-8");

//전달된 값 저장
String trade_num = request.getParameter("trade_num");
List<OrderDTO> adminOrderdetailList = (List<OrderDTO>) request.getAttribute("adminOrderdetailList");

//공통항목을 처리하는 객체
OrderDTO odto_total = adminOrderdetailList.get(0);

//천의 단위 콤마
DecimalFormat dc = new DecimalFormat("###,###,###,###,###원");
%>
<form action="./AdminOrderModify.ao" method="post">
<input type="hidden" name="trade_num" value="<%=trade_num%>">
<table border="1">
<caption>관리자 - 주문 상세보기 / 수정하기</caption>
<!-- 주문정보 -->
<tr>
<th>주문번호</th>
<td colspan="4"><%=trade_num %></td>
</tr>
<tr>
<th colspan="5">구매 상품 정보</th>
</tr>
<tr>
<th>상품명</th>
<th>수량</th>
<th>크기</th>
<th>색상</th>
<th>가격</th>
</tr>
<%
int totalSum=0;
for(OrderDTO odto : adminOrderdetailList){
totalSum += odto.getO_sum_money();
%>
<tr>
<td><%=odto.getO_g_name() %></td>
<td><%=odto.getO_g_amount() %></td>
<td><%=odto.getO_g_size() %></td>
<td><%=odto.getO_g_color() %></td>
<td><%=dc.format(odto.getO_sum_money()) %></td>
</tr>
<%} %>
<!-- 배송지 정보 -->
<tr>
<th colspan="5">배송지 정보</th>
</tr>
<tr>
<th>받는 사람</th>
<th>연락처</th>
<th>배송주소</th>
<th>세부 배송주소</th>
<th>요구사항</th>
</tr>
<tr>
<td><%=odto_total.getO_receive_name() %></td>
<td><%=odto_total.getO_receive_phone() %></td>
<td><%=odto_total.getO_receive_addr1() %></td>
<td><%=odto_total.getO_receive_addr2() %></td>
<td><%=odto_total.getO_receive_memo() %></td>
</tr>

<!-- 결제정보 -->
<tr>
<th colspan="5">결제 정보</th>
</tr>
<tr>
<th>주문 합계 금액</th>
<th>결제 방법</th>
<th>입금자(구매자)</th>
<th>주문상태</th>
<th>운송장 번호</th>
</tr>
<tr>
<td><%=dc.format(totalSum) %></td>
<td><%=odto_total.getO_trade_type() %></td>
<td><%=odto_total.getO_trade_payer() %></td>
<td>
<div class="pure-css-select-style theme-square">
<select name="status">
<option value="0"
<% if(odto_total.getO_status() == 0){%> selected <%} %>
>대기중</option>
<option value="1"
<% if(odto_total.getO_status() == 1){%> selected <%} %>
>발송준비</option>
<option value="2"
<% if(odto_total.getO_status() == 2){%> selected <%} %>
>발송완료</option>
<option value="3"
<% if(odto_total.getO_status() == 3){%> selected <%} %>
>배송중</option>
<option value="4"
<% if(odto_total.getO_status() == 4){%> selected <%} %>
>배송완료</option>
<option value="5"
<% if(odto_total.getO_status() == 5){%> selected <%} %>
>주문취소</option>
</select>
</div>
</td>
<td>
<input type="text" name="trans_num" value="<%=odto_total.getO_trans_num() %>">
</td>
</tr>
<tr>
<td colspan="3"></td>
<td colspan="2"><input type="submit" class="btn" value="수정"></td>
</tr>
</table>
</form>
<input type="button" class="btn" value="뒤로가기(js코드)" onclick="javascript:history.back()">
<input type="button" class="btn" value="뒤로가기(history객체)" onclick="history.back()">