Servlet/CartServlet in MVC

CartServlet in MVC

Soul-Learner 2014. 7. 18. 22:56

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";

}

}



/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>