CartServlet in MVC
Controller Servlet in MVC
JSP 개발 방법론 Model 2 ( MVC ) 를 이용할 때 Servlet 에서 모든 요청을 받도록 설정하기
CartServlet.java
package org.kdea.java.cart;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("*.cart") /* '/cart/*' 와 같은 형식도 가능하지만 /cart/아래의 jsp에 대한 요청도 서블릿이 받게 되므로 주의요 */
public class CartServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String clsName = getClsName(request); //요청URL에 포함된 클래스명을 추출하여 요청처리 서비스 클래스로 사용한다
//System.out.println("clsName="+clsName);
request.setCharacterEncoding("euc-kr");
String viewPage = null;
CartService service = null; // 모든 서비스 클래스가 구현해야 할 인터페이스
try {
Class<?> cls = Class.forName("org.kdea.java.cart."+clsName);
service = (CartService)cls.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
viewPage = service.process(request, response);
getServletContext().getRequestDispatcher(viewPage)
.forward(request, response);
}
private String getClsName(HttpServletRequest request) {
//요청URL 중에서 포트번호 이후의 경로를 추출한다
String uri = request.getRequestURI();/* /JavaWeb/cart/CartIn.cart */
//위에서 추출한 경로 중에서 마지막 '/' 부터 그 이후의 문자열을 추출한다
String cmd = uri.substring(uri.lastIndexOf("/"));/* /CartIn.cart */
//위에서 추출한 경로 중에서 앞의 '/'와 끝부분의 '.' 사이에 있는 문자열만 추출한다
String clsName = cmd.substring(1,cmd.lastIndexOf("."));/* CartIn */
return clsName;
}
}
CartService.java (인터페이스)
package org.kdea.java.cart;
import javax.servlet.http.*;
public interface CartService
{
public String process(HttpServletRequest request, HttpServletResponse response);
}
CartIn.java (하나의 요청을 처리하는 클래스)
package org.kdea.java.cart;
import javax.servlet.http.*;
public class CartIn implements CartService
{
@Override
public String process(HttpServletRequest request, HttpServletResponse response)
{
String bn = request.getParameter("bookName");
String pub = request.getParameter("pub");
int price = Integer.valueOf(request.getParameter("price"));
int qty = Integer.valueOf(request.getParameter("qty"));
BookItem book = new BookItem();
book.setBookName(bn);
book.setPub(pub);
book.setPrice(price);
book.setQty(qty);
Object cartObj = request.getSession().getAttribute("cartMgr");
CartManager cartMgr = null;
if(cartObj==null) {
cartMgr = new CartManager();
request.getSession().setAttribute("cartMgr", cartMgr);
}else{
cartMgr = (CartManager)cartObj;
}
cartMgr.addProduct(book);
request.setAttribute("cartInResult", true);
request.setAttribute("book", book);
return "/cart/cartAdd.jsp";
}
}
<%@page import="org.kdea.java.cart.*"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
boolean added = (Boolean)request.getAttribute("cartInResult");
BookItem book = (BookItem)request.getAttribute("book");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>장바구니 담기</title>
<style type="text/css">
body { text-align: center;}
#div1 {width:300px; border:1px solid black; margin:20px; font-size:9pt;
padding:10px; display:inline-block; text-align: left; }
a { text-decoration: none; }
</style>
<script type="text/javascript">
var saved = <%=added%>;
if(saved) alert('장바구니에 저장되었습니다');
else alert('장바구니에 저장하는 중에 오류가 발생했습니다');
</script>
</head>
<body><p>
선택하신 상품이 다음과 같이 장바구니에 저장되었습니다<p>
<div id="div1">
<ul>
<li>도서명 <%=book.getBookName()%> </li>
<li>출판사 <%=book.getPub()%> </li>
<li>가 격 <%=book.getPrice()%> </li>
<li>수 량 <%=book.getQty()%> </li>
<li>총 주문금액 <%=book.getTotal()%> </li>
</ul>
</div>
<hr>
[<a href="cart_form.jsp">책구입 1</a>]
[<a href="cart_form2.jsp">책구입 2</a>]
[<a href="cart_form3.jsp">책구입 3</a>]
[<a href="CartShowList.cart">장바구니 목록보기</a>]
</body>
</html>
CartShowList.java
package org.kdea.java.cart;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CartShowList implements CartService
{
@Override
public String process(HttpServletRequest request,
HttpServletResponse response) {
Object cartObj = request.getSession().getAttribute("cartMgr");
CartManager cartMgr = null;
if(cartObj==null) {
//System.out.println("아직 CartManager가 생성되지 않았습니다");
cartMgr = new CartManager();
request.getSession().setAttribute("cartMgr", cartMgr);
}
return "/cart/cart_show.jsp";
}
}
/cart/cart_show.jsp
<%@page import="org.kdea.java.cart.*"%>
<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<% CartManager cartMgr = (CartManager)request.getSession().getAttribute("cartMgr");
List<BookItem> cart = cartMgr.getCart();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>장바구니 목록보기</title>
<style type="text/css">
body { text-align: center; }
table { border:1px solid black; width:600px; margin:10px;
display: inline-table; font-size: 9pt; }
th { border-bottom:3px double black; padding:5px;background-color:lightgray;}
td { border-bottom:1px dotted black; padding:5px;}
.strCell { text-align: left; }
.numCell { text-align: right; }
.qty { width:40px; text-align: right; }
a { text-decoration: none; }
</style>
<script type="text/javascript" src="jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('button.btQtyChange').click(function(){
var tr = $(this).parent('td').parent('tr');
var idx = tr.attr('data-idx');
var qty = tr.find('[name=qty]').val();
reqUpdate(idx,qty);
});
$('button.btDel').click(function(){
var tr = $(this).parent('td').parent('tr');
var idx = tr.attr('data-idx');
if(confirm('해당항목을 장바구니에서 정말로 삭제하시겠어요?')) {
reqDelete(idx);
}
});
$('a#order').click(function(){
if(confirm('장바구니에 있는 품목을 결재하시겠어요?'))
$.ajax(
{
url:'CartOrder.cart',
type:'POST',
/*data:{'cmd':'order'},*/
dataType:'text',
success :function(resData){
var jsonObj = eval('('+resData+')');
if(jsonObj.ordered) {
alert('결재에 성공했습니다');
};
}
}
);
});
$('a#emptyCart').click(function(){
if(confirm('장바구니에 있는 모든 품목을 삭제하시겠어요?'))
$.ajax(
{
url:'CartEmpty.cart',
type:'POST',
/*data:{'cmd':'emptyCart'},*/
dataType:'text',
success:function(resData){
var jsonObj = eval('('+resData+')');
if(jsonObj.cartEmpty) {
location.reload();
};
}
}
);
});
});
function reqUpdate(idx, qty) {
/*var obj = new Object();
obj.idx = idx;
obj.qty = qty;*/
$.ajax(
{
url:'CartChangeQty.cart',
type:'POST',
data:{/*'cmd':'changeQty',*/'idx':idx, 'qty':qty },
dataType:'text',
success :function(resData){
var jsonObj = eval('('+resData+')');
var idx = jsonObj.idx;
var subTotal = jsonObj.subTotal;
var grandTotal = jsonObj.grandTotal;
$('tr[data-idx='+idx+'] [name=subTotal]').text(subTotal);
$('#grandTotal').text(grandTotal+' 원');
}
}
);
}
function reqDelete(idx) {
$.ajax(
{
url:'CartDeleteItem.cart',
type:'POST',
data:{/*'cmd':'deleteItem',*/'idx':idx },
dataType:'text',
success :function(resData){
var jsonObj = eval('('+resData+')');
var idx = jsonObj.idx;
var removed = jsonObj.removed;
var grandTotal = jsonObj.grandTotal;
if(removed) {
$('tr[data-idx='+idx+']').remove();
$('#grandTotal').text(grandTotal+' 원');
$('tr:not(:has(th))').each(function(idx){
$(this).attr('data-idx',idx);
});
}
}
}
);
}
</script>
</head>
<body><p>
<table>
<caption>장바구니 목록보기</caption>
<tr><th>도서명</th><th>출판사</th><th>가 격(원)</th><th>수 량(권)</th>
<th>소 계(원)</th><th>변 경</th><th>삭 제</th></tr>
<%
for(int i=0;i<cart.size();i++) {
BookItem book = cart.get(i); %>
<tr data-idx="<%=i%>">
<td class="strCell"><%=book.getBookName()%></td>
<td class="strCell"><%=book.getPub()%></td>
<td class="numCell"><%=book.getPrice()%></td>
<td class="numCell">
<input type="number" class="qty" name="qty"
value="<%=book.getQty()%>" min="1">
</td>
<td class="numCell" name='subTotal'><%=book.getTotal()%></td>
<td><button class="btQtyChange">적용</button></td>
<td><button class="btDel">삭제</button></td>
</tr>
<% }
%>
</table>
<hr width="80%">
<div style='width:400px;'>
<div style='width:290px;display:inline-block;'>장바구니 총 금액합계 : </div>
<div style='width:100px;display:inline-block;'id='grandTotal'>
<%=cartMgr.getTotal()%> 원</div>
</div>
[<a href="#" id="order">결재하기</a>]
[<a href="#" id="emptyCart">장바구니 비우기</a>]
<hr>
[<a href="cart_form.jsp">책구입 1</a>]
[<a href="cart_form2.jsp">책구입 2</a>]
[<a href="cart_form3.jsp">책구입 3</a>]
</body>
</html>