BACK END/Spring

12일(09.01)Spring_MyBatis_Products (주문하기-로그인설정, 로그아웃, 장바구니-세션,담기,결제)

라미보 2022. 9. 1. 16:50

 

 

 

상품상세보기 페이지에서 주문하기를 눌렀을때, 상품번호와 상품수량, 현재페이지번호를 가지고 넘어간다.

로그인이 안되어있으면 로그인을 하도록 login.mem요청을 하고

로그인이 되었으면 넘겨받은 상품번호와 페이지번호를 가지고 다시 돌아간다.

 

 

📁 WEB-INF/ product

💾 productDatilView.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
productDetail.jsp <br>
<%=application.getRealPath("/resources")%> <br>
<%=application.getContextPath()%><br> <!-- /ex  request.getContextPath() 와 같다.-->
<%=request.getContextPath()%><br><br><!--  /ex  application.getContextPath()와 같다.-->



<center>
<h1><span>상품 상세보기 화면</span></h1>
<table border="1" width="500" height="400">

	<tr>
	<td rowspan=6>
	<img height=70 width=70
				src="<%=application.getContextPath()%>/resources/${pbean.image}">
				<!-- 웹서버에 접근하기위한 경로설정 -->
			<!-- 	/ex/resources/a.jpg 
				-> ex에 포함되어 있는 내용 C:\Spring_hbr\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\16_Spring_Mybatis_Products\resources
				 -->
	</td>
		<td align=center>상품명</td>
		<td>&nbsp;${pbean.name}</td>
	</tr>
	<tr>
		<td>가격</td>
		<td>&nbsp;${pbean.price}</td>
	</tr>
	<tr>
		<td>재고 수량</td>
		<td>&nbsp;${pbean.stock}</td>
	</tr>
	<tr>
		<td>설명</td>
		<td>&nbsp;${pbean.contents}</td>
	</tr>

	<tr>
		<td>주문 수량</td>
		<td>
		<form action="add.mall" method="post">
			<input type="hidden" name="num" value="${pbean.num}"> 
			<input type="hidden" name="pageNumber" value="${pageNumber }"/>
			<input type="text" name="orderqty" value="1">&nbsp;
			<input type="submit" value="주문">
		</form>
		</td>
	</tr>
	<!-- 	hidden으로 상품번호와 페이지번호를 넘겨서 로그인시 페이지 이동하게 한다. -->

	<tr>
		<td colspan="2" align="center"> 
			<a href="list.prd?pageNumber=${param.pageNumber}">상품 리스트</a>
		</td>
	</tr>
</table>
</center>


<td>주문 수량</td>
<td>
<form action="add.mall" method="post">
<input type="hidden" name="num" value="${pbean.num}"> 
<input type="hidden" name="pageNumber" value="${pageNumber }"/>
<input type="text" name="orderqty" value="1">&nbsp;
<input type="submit" value="주문">

 hidden으로 상품번호와 페이지번호를 넘겨서 로그인시 페이지 이동하게 한다.

 주문하기를 누르면 add.mall을 요청하게 된다.

add.mall 요청을 받는CartAddController 로 이동하게 된다.

 

 

테이블에 따로 Orderqty 변수를 만들지 않았으므로, ProductBean에 변수를 만들고 getter, setter 해준다.

📁 product.model

💾 ProductBean

private int orderqty;
	
	
	public int getOrderqty() {
		return orderqty;
	}


	public void setOrderqty(int orderqty) {
		this.orderqty = orderqty;
	}

 

 

 

 

📁mall.controller

💾 CartAddController

 

package mall.controller;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import product.model.ProductBean;

@Controller
public class CartAddController {

	private final String command ="/add.mall";
	private final String getPage="";
	
	@Autowired
	ServletContext servletContext;
	
	//add.mall 어디서 요청하는지??? productDetailView 에서 주문하기 눌렀을때 add.mall요청 
	@RequestMapping(command)
	public String cart(ProductBean pbean, HttpSession session,
						@RequestParam("pageNumber") String pageNumber
						) {
		//ProductBean을 가져온다.
		//setNum, setOrderqty , setPageNumber
		
		
		System.out.println("pbean.getNum:"+pbean.getNum());
		System.out.println("pbean.getOrderqty():"+pbean.getOrderqty());
		
		int pnum = pbean.getNum();
		int oqty = pbean.getOrderqty();
		
		
		
		//본격전 주문전 로그인 설정
		if(session.getAttribute("loginInfo")==null) {
		//로그인 안했을때
			
			session.setAttribute("destination","redirect:/detail.prd?num="+pbean.getNum()+"&pageNumber="+pageNumber);
			//로그인하면, datail.prd요청에 따라 DeatailContriller로 이동한다.
			
			return "redirect:/loginForm.mem"; //로그인 안했으면 로그인하도록 이동한다.
			
		}else {
			//로그인했을때
			
		}
		
		return null;
	}

 

 

 

 

 

📁WEB-INF / common

💾common.jsp

<!-- 로그인한 사람의 아이디를 넣는다 -->
접속자 아이디 : ${loginInfo.id }

<%-- 
${sessionScope.loginInfo.id }이 생략 되어 있다.로그인 세션으로 설정했음

el의 내장객체 (범위순서대로)
pageScope
requestScope
sessionScope
 --%>

 

-로그인한 사람의 아이디를 넣는다 
접속자 아이디 : ${loginInfo.id }


${loginInfo.id } 안에 ${sessionScope.loginInfo.id }이 생략 되어 있다.로그인 세션으로 설정했음

- el의 내장객체 (범위순서대로)
pageScope < requestScope < sessionScope

 

 

ProductList.jsp<br>

<a href="start.jsp">시작페이지</a>
<a href="logout.jsp">로그아웃</a> <!-- 여기서 모든 세션 다 해제 -->

로그아웃 설정할수 있게 링크를 걸어준다.

 

 

 

webapp에 logout.jsp 파일 만든다.

💾 logout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
logout.jsp<br>

<%
    	session.invalidate(); //세션설정 해제
		response.sendRedirect("start.jsp");//세션설정 해제되면 돌아간다.
%>

<%
     session.invalidate(); - 세션설정 해제
response.sendRedirect("start.jsp"); - 세션설정 해제되면 돌아간다.
%>

 

 

📁mall.controller

💾 CartAddController

package mall.controller;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import mall.cart.MyCartList;
import product.model.ProductBean;

@Controller
public class CartAddController {

	private final String command ="/add.mall";
	private final String gotoPage="redirect:/list.mall";//장바구니를 담으면 요청한다.
	@Autowired
	ServletContext servletContext;
	
	//add.mall 어디서 요청하는지??? productDetailView(상세보기) 에서 주문하기 눌렀을때 add.mall요청 - 상품번호, 주문수량, 페이지번호넘긴다.
	@RequestMapping(command)
	public String cart(ProductBean pbean, HttpSession session,
						@RequestParam("pageNumber") String pageNumber
						) {
		//ProductBean을 가져온다.- 상품번호, 주문수량, 페이지번호
		//setNum, setOrderqty , setPageNumber
		
		
		System.out.println("pbean.getNum:"+pbean.getNum());
		System.out.println("pbean.getOrderqty():"+pbean.getOrderqty());
		
		int pnum = pbean.getNum();
		int oqty = pbean.getOrderqty();
		
		
		
		//본격전 주문전 로그인 설정
		if(session.getAttribute("loginInfo")==null) {
		//로그인 안했을때
			
			session.setAttribute("destination","redirect:/detail.prd?num="+pbean.getNum()+"&pageNumber="+pageNumber);
			//로그인하면, datail.prd요청에 따라 DeatailContriller로 이동한다.
			
			return "redirect:/loginForm.mem"; //로그인 안했으면 로그인하도록 이동한다. MemberLoginController에서 요청
			
		}else {
			//로그인했을때 장바구니로 담아서 진행하게 한다.
			
			//장바구니 하나 만들어서 계속 끌고 갈 수 있도록 session설정을 한다.
			MyCartList mycart =(MyCartList)session.getAttribute("mycart"); 
			System.out.println("mycart:"+mycart); //
			
			if(mycart==null) {
				//장바구니 생성전
				
				mycart = new MyCartList();
			}
			
				mycart.addOrder(pnum, oqty); //MyCartList에 addOrder에 담을 상품을 집어넣게 된다.
				session.setAttribute("mycart", mycart); //mycart가 관리하는 MyCartList안에 HashMap이 세션설정이 된다.
				return gotoPage;
		}

 

 

@Autowired
ServletContext servletContext; -session 사용하기 위해서

- add.mall 어디서 요청하는지???

productDetailView(상세보기) 에서 주문하기 눌렀을때 add.mall요청→ 상품번호, 주문수량, 페이지번호넘긴다.


@RequestMapping(command)
public String cart(ProductBean pbean, HttpSession session,
@RequestParam("pageNumber") String pageNumber
) {

 

- ProductBean을 가져온다.(상품번호, 주문수량)

-ProductBean 대신에 RequestParam으로 가져와도 된다.
-setNum, setOrderqty , setPageNumber


int pnum = pbean.getNum();
int oqty = pbean.getOrderqty();



- 본격전 주문전 로그인 설정
if(session.getAttribute("loginInfo")==null) { //로그인 안했을때

session.setAttribute("destination","redirect:/detail.prd?num="+pbean.getNum()+"&pageNumber="+pageNumber);
- 로그인하면, datail.prd요청에 따라 DeatailContriller로 이동한다.

return "redirect:/loginForm.mem"; -로그인 안했으면 로그인하도록 이동한다. MemberLoginController에서 요청

}else {
- 로그인했을때 장바구니로 담아서 진행하게 한다.

-장바구니 하나 만들어서 계속 끌고 갈 수 있도록 session설정을 한다.
MyCartList mycart =(MyCartList)session.getAttribute("mycart"); 
System.out.println("mycart:"+mycart); //

if(mycart==null) {
-장바구니 생성전

mycart = new MyCartList(); -MyCartList객체를 만들어 mycar변수로 관리한다.

}

mycart.addOrder(pnum, oqty); - MyCartList에 addOrder에 담을 상품을 집어넣게 된다.
session.setAttribute("mycart", mycart); - mycart가 관리하는 MyCartList안에 HashMap이 세션설정이 된다.
return gotoPage;
}

}

 

 

 

 

📁 mall.cart

💾 MyCartList

 

package mall.cart;

import java.util.HashMap;
import java.util.Map;

public class MyCartList { //장바구니 역할

	private Map<Integer,Integer> orderlists = null; //Map<Integer,Integer> =상품번호(key),주문수량(value)
	
	
	public MyCartList() {
		//장바구니가 만들어지면 여기로 온다. CartAddController에서 온다.
		orderlists = new HashMap<Integer,Integer>();
	}

	
	public void addOrder(int pnum, int oqty) {
		//addOrder 메서드로 주문수량과 상품번호를 Map에 집어 넣겠다.
		
		if(orderlists.containsKey(pnum)) { //같은 상품이 장바구니에 이미 있으면 누적한다.
			//key중에 같은 상풍번호가 있으면 true
			
			int orgqty =orderlists.get(pnum); //이미 담긴 상품번호를 가져온다. 
			orderlists.replace(pnum, orgqty+orgqty); //key=상품번호 ,value=orgqty에 누적되도록 orgqty를 더한다.
			//map을 사용하면 같은번호의 상품을 담으면 덮어쓰기가 되어버리므로 put을 사용해도 된다.(put을 사용한다고 같은번호의 데이터가 또 들어오는것 아니다)
			
		}else {
			//장바구니에 없으면 새로 추가한다.
			orderlists.put(pnum,oqty); //orderlists에 상품번호와 수량이 쌍으로 들어간다.
			
		}
		
	}


	public Map<Integer, Integer> getAllOrderList() {
	
		return orderlists;
	}
	
}

 

 

 

private Map<Integer,Integer> orderlists = null;

- Map<Integer,Integer> =상품번호(key),주문수량(value)


public MyCartList() {
-장바구니가 만들어지면 여기로 온다. CartAddController에서 온다.
   orderlists = new HashMap<Integer,Integer>();
}


public void addOrder(int pnum, int oqty) {
- addOrder 메서드로 주문수량과 상품번호를 Map에 집어 넣겠다.

if(orderlists.containsKey(pnum)) {

- 같은 상품이 장바구니에 이미 있으면 누적한다.
- key중에 같은 상풍번호가 있으면 true

int orgqty =orderlists.get(pnum); - 이미 담긴 상품번호를 가져온다. 
orderlists.replace(pnum, orgqty+orgqty); - key=상품번호 ,value=orgqty에 누적되도록 orgqty를 더한다.
- map을 사용하면 같은번호의 상품을 담으면 덮어쓰기가 되어버리므로 put을 사용해도 된다.(put을 사용한다고 같은번호의 데이터가 또 들어오는것 아니다)

}else {
- 장바구니에 없으면 새로 추가한다.
orderlists.put(pnum,oqty); - orderlists에 상품번호와 수량이 쌍으로 들어간다.

}

}


public Map<Integer, Integer> getAllOrderList() {

return orderlists;
}

 

 

 

 

CartAddController 에서 gotoPage="redirect:/list.mall";//장바구니를 담으면 요청한다.

mallList.jsp으로 이동한다.

 

mallList.jsp으로 이동하는 CartListController를 생성한다.

 

 

 

 

📁mall.controller

💾 CartListController

package mall.controller;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import mall.cart.MyCartList;
import mall.cart.ShppingInfo;
import product.model.ProductBean;
import product.model.ProductDao;

@Controller
public class CartListController {

	
	private final String command="/list.mall"; //CartAddController에서 요청한다.
	private final String getPage="/mallList";

	
	@Autowired
	private ProductDao pdao;
	
	@RequestMapping(command)
	public String cartList(HttpSession session) {
		
		//getPage="/mallList" 이동할때 장바구니 정보가 필요하다.
		MyCartList mycart =(MyCartList)session.getAttribute("mycart"); 
		Map<Integer,Integer> map = mycart.getAllOrderList(); //장바구니를 가져오는 메서드이다.
		
		//상품번호, 주문수량으로 쇼핑정보를 가져온다. Map으로 설정한 번호와 주문수량을 가져온다.
		Set<Integer> keylist =map.keySet(); //key=pnum
		System.out.println("keylist"+keylist); //장바구니 담긴 번호가출력
		
		List<ShppingInfo> shopLists = new ArrayList<ShppingInfo>();
		
		int totalAmount= 0;
		
		for(Integer pnum : keylist ) {
			//Integer pnum에 번호가 들어온다.
			
		ProductBean pbean= pdao.selectProductByNum(String.valueOf(pnum));
			
		//상품정보를 가져와서 ShppingInfo 객체를 만들어서 mallList로 이동한다.
		ShppingInfo shopInfo = new ShppingInfo();
		shopInfo.setPnum(pnum);
		shopInfo.setPname(pbean.getName());
		shopInfo.setQty(map.get(pnum));
		shopInfo.setPrice(pbean.getPrice());
		//총금액은 따로 챙겨간다. 왜?
		int amount =pbean.getPrice()*map.get(pnum);
		shopInfo.setAmount(amount);
		totalAmount += amount;
		//shopInfo.setAmount(pbean.getPrice()*map.get(pnum));
		
		
		shopLists.add(shopInfo);
		}
		
		return getPage;
	}
		
	
}

 

 

 

- getPage="/mallList" 으로 이동할때 장바구니 정보가 필요하다.
MyCartList mycart =(MyCartList)session.getAttribute("mycart");  -장바구니

 

Map<Integer,Integer> map = mycart.getAllOrderList(); - 장바구니 정보를 가져오는 메서드이다.

- 상품번호, 주문수량으로 쇼핑정보를 가져온다. Map으로 설정한 번호와 주문수량을 가져온다.
Set<Integer> keylist =map.keySet(); - key=pnum
System.out.println("keylist"+keylist); - 장바구니 담긴 번호가출력

List<ShppingInfo> shopLists = new ArrayList<ShppingInfo>();

int totalAmount= 0;

for(Integer pnum : keylist ) {
- Integer pnum에 번호가 들어온다.

ProductBean pbean= pdao.selectProductByNum(String.valueOf(pnum));

- 상품정보를 가져와서 ShppingInfo 객체를 만들어서 mallList로 이동한다.
ShppingInfo shopInfo = new ShppingInfo();
shopInfo.setPnum(pnum);
shopInfo.setPname(pbean.getName());
shopInfo.setQty(map.get(pnum));
shopInfo.setPrice(pbean.getPrice());

 

- 총금액은 따로 챙겨간다. 
int amount =pbean.getPrice()*map.get(pnum);
shopInfo.setAmount(amount);
totalAmount += amount;
//shopInfo.setAmount(pbean.getPrice()*map.get(pnum));

shopLists.add(shopInfo);

}
-페이지 이동할때 두가지를 챙겨서 넘어가야 한다.
model.addAttribute("lists", shopLists);
model.addAttribute("totalAmount", totalAmount);

 

 

 

 

 

 

mallList.jsp 주문내역에 한줄의 상품정보를 담는 클래스

📁 mall.cart

💾 ShppingInfo

package mall.cart;

public class ShppingInfo {

	//mallList.jsp 주문내역에 한줄의 상품정보를 담는 클래스

	private int pnum;
	private String pname;
	private int qty;
	private int price;
	private int amount;

	public int getPnum() {
		return pnum;
	}
	public void setPnum(int pnum) {
		this.pnum = pnum;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public int getQty() {
		return qty;
	}
	public void setQty(int qty) {
		this.qty = qty;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public int getAmount() {
		return amount;
	}
	public void setAmount(int amount) {
		this.amount = amount;
	}

}

 

 

 

📁WEB-INF / mall

💾 mallList.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file ="../common/common.jsp" %>
<br>mallList.jsp<br><br>

<!-- 장바구니 담으면 list.mall을 요청하여 장바구니 목록으로 이동한다. -->

<center>
<h1>주문 내역</h1>
<table border="1">
	<tr>
	 <td colspan="5" align="center">주문자 정보 : ${loginInfo.name }(${loginInfo.id })</td>
	</tr>
	
	<tr align="center">
		<th>상품 번호</th>
		<th>상품명</th>
		<th>주문 수량</th>
		<th>단가</th>
		<th>금액</th>
	</tr>
<!-- List<ShppingInfo> shopLists = new ArrayList<ShppingInfo>(); -->
<c:forEach var="shopInfo" items="${lists }">	
	<tr align="center">
		<td>${shopInfo.pnum }</td>
		<td>${shopInfo.pname }</td>
		<td>${shopInfo.qty}</td>
		<td>${shopInfo.price }</td>
		<td>${shopInfo.amount }</td>
	</tr>
</c:forEach>

	<tr align="center">
		<td colspan="3">
		<a href="">결제하기</a>
		<a href="list.prd">추가주문</a> <!-- 상품목록보기로 이동한다. -->
		</td>
		
		<td colspan="2">
		총 금액:${totalAmount }
		</td>
	</tr>
</table>
</center>

 

 

 

 

 

 

 

📁WEB-INF / mall

💾 mallList.jsp

 

<tr align="center">
<td colspan="3">
<a href="calculate.mall">결제하기</a>
<!-- order테이블 insert, ordersdetail테이블, 상품재고수량 감소,  -->
<a href="list.prd">추가주문</a> <!-- 상품목록보기로 이동한다. -->
</td>

 

mallList.jsp에서 결제하기 누르면 calculate.mall 요청을 하고,

 calculate.mall 요청을 받는 CartCalculateController 이동한다.

 

 

 

📁 mall.controller

💾 CartCalculateController

package mall.controller;

import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import mall.cart.MyCartList;
import member.model.MemberBean;
import member.model.MemberDao;
import order.model.OrderDao;
import orderdetail.model.OrderDetailDao;
import product.model.ProductDao;

@Controller
public class CartCalculateController {

	private final String command="calculate.mall";
	private final String gotoPage="redirect:/list.prd";//결제후 목록보기로 간다.
	
	@Autowired
	private MemberDao mdao;
	
	@Autowired
	private ProductDao pdao;
	
	@Autowired /* order패키지를 스캔하도록 mall-servlet에 작성한다. */
	private OrderDao odao;
	
	@Autowired
	private OrderDetailDao oddao;
	
	//mallList에서 결제하기 눌러서 calculate.mall요청을 받음
	@RequestMapping(command)
	public String cal(HttpSession session) {
		//세션으로 설정한 장바구니 상품정보를 가져온다.
		//장바구니 가져오기
		MyCartList mycart =(MyCartList)session.getAttribute("mycart"); 
		
		//장바구니에 담긴 상품정보 가져오기
		Map<Integer,Integer> map = mycart.getAllOrderList();
		
		Set<Integer> keylist = map.keySet();//상품번호를 가져온다,
		System.out.println("keylist:"+keylist);
		
		MemberBean member=(MemberBean)session.getAttribute("loginInfo");
		//로그인한 회원의 정보를 가져온다.
		for(Integer pnum: keylist) {
	
			//반복해서 상품수량 감소, 포인트적립
			mdao.updateMpoint(member.getId(),100);//회원의 아이디와 포인트 가져온다.
		}
		
		return gotoPage;
	}
	
	
}

 

 

-반복해서 상품수량 감소, 포인트적립
mdao.updateMpoint(member.getId(),100);//회원의 아이디와 포인트 가져온다.
-포인트적립이 되었는지는 sql로 확인한다.

-MemberDao로 이동한다.

 

📁 member.model

💾 MemberDao

 

public void updateMpoint(String id , int mpoint) {
		
		MemberBean mb = new MemberBean();//필요한 두가지만 묶어서 간다.
		mb.setId(id);
		mb.setMpoint(mpoint);
		
		sqlSessionTemplate.update(namespace+".UpdateMpoint",mb);
		//update(String,object)
		
	}

 

 

📁 mybatis

💾 member.xml

	<update id="UpdateMpoint">
	 update members
	 set mpoint= mpoint+ #{mpoint}
	 where id=#{id}
	</update>
	
	<!-- 조건에 해당되는 아이디를 찾아서 적립금을 추가해준다. -->

 

 

📁 spring -appServlet

mall-servlet.xml

 

	<context:component-scan base-package="order"/>
	<context:component-scan base-package="orderdetail"/>

 

 

 

 

 

📁 mall.controller

💾 CartCalculateController

package mall.controller;

import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import mall.cart.MyCartList;
import member.model.MemberBean;
import member.model.MemberDao;
import order.model.OrderDao;
import orderdetail.model.OderDetailBean;
import orderdetail.model.OrderDetailDao;
import product.model.ProductDao;

@Controller
public class CartCalculateController {

	private final String command="calculate.mall";
	private final String gotoPage="redirect:/list.prd";//결제후 목록보기로 간다.
	
	@Autowired
	private MemberDao mdao;
	
	@Autowired
	private ProductDao pdao;
	
	@Autowired /* order패키지를 스캔하도록 mall-servlet에 작성한다. */
	private OrderDao odao;
	
	@Autowired
	private OrderDetailDao oddao;
	
	//mallList에서 결제하기 눌러서 calculate.mall요청을 받음
	@RequestMapping(command)
	public String cal(HttpSession session) {
		//세션으로 설정한 장바구니 상품정보를 가져온다.
		//장바구니 가져오기
		MyCartList mycart =(MyCartList)session.getAttribute("mycart"); 
		
		//장바구니에 담긴 상품정보 가져오기
		Map<Integer,Integer> map = mycart.getAllOrderList();
		
		Set<Integer> keylist = map.keySet();//상품번호를 가져온다,
		System.out.println("keylist:"+keylist);
		
		
		MemberBean member=(MemberBean)session.getAttribute("loginInfo");
		//로그인한 회원의 정보를 가져온다.
		
		
		//반복전 orders추가
		//odao.insertData(회원아이디); 회원아이디를 넘겨야 한다.
		odao.insertData(member.getId());
		
		
		//order 테이블에서 가장 큰 oid값 가져오기
		
		int oid = odao.getMaxOid();
		System.out.println("가장 큰 oid값:"+oid);
		
		for(Integer pnum: keylist) {
			//결제가 되면 장바구니에 담긴 수량만큼 재고수량은 감소시켜야한다.
			//pdao.update(상품번호,주문수량);
			pdao.updateStock(pnum,map.get(pnum));
			
			
			
			//반복해서 orderdetails추가 
			//orderdetails에 가장 큰 oid값 가져와서 details에 장바구니 개수만큼 삽입.
			//odid, oid, pnum, qty을 넘겨야 하므로 OderDetailBean으로 넘긴다.
			OderDetailBean odBean = new OderDetailBean();
			odBean.setOid(oid);
			odBean.setPnum(pnum);
			odBean.setQty(map.get(pnum));
			
			oddao.insertData(odBean);
			
			//반복해서 상품수량 감소, 포인트적립
			mdao.updateMpoint(member.getId(),100);//회원의 아이디와 포인트 가져온다.
			//포인트적립이 되었는지는 sql로 확인한다.
		}//for
		
		//장바구니 세션 해제 : 결제후 장바구니가 비어지도록!
		//로그아웃전에 장바구니 세션만 해제
		session.removeAttribute("mycart");
		
		return gotoPage;
	}

}

 

-mallList에서 결제하기 눌러서 calculate.mall요청을 받음
@RequestMapping(command)
public String cal(HttpSession session) {

 

-세션으로 설정한 장바구니 상품정보를 가져온다.
-장바구니 가져오기
MyCartList mycart =(MyCartList)session.getAttribute("mycart"); 

-장바구니에 담긴 상품정보 가져오기
Map<Integer,Integer> map = mycart.getAllOrderList();

Set<Integer> keylist = map.keySet();  -상품번호를 가져온다,
System.out.println("keylist:"+keylist);


MemberBean member=(MemberBean)session.getAttribute("loginInfo");
-로그인한 회원의 정보를 가져온다.


-반복전 orders추가
-odao.insertData(회원아이디); 회원아이디를 넘겨야 한다.
odao.insertData(member.getId());


-order 테이블에서 가장 큰 oid값 가져오기
int oid = odao.getMaxOid();
System.out.println("가장 큰 oid값:"+oid);

for(Integer pnum: keylist) {
-결제가 되면 장바구니에 담긴 수량만큼 재고수량은 감소시켜야한다.
-pdao.update(상품번호,주문수량);
pdao.updateStock(pnum,map.get(pnum)); -ProductDao 이동한다.



-반복해서 orderdetails추가 
-orderdetails에 가장 큰 oid값 가져와서 details에 장바구니 개수만큼 삽입.
-odid, oid, pnum, qty을 넘겨야 하므로 OderDetailBean으로 넘긴다.
OderDetailBean odBean = new OderDetailBean();
odBean.setOid(oid);
odBean.setPnum(pnum);
odBean.setQty(map.get(pnum));

oddao.insertData(odBean); -OrderDetailDao로 이동한다.

-반복해서 상품수량 감소, 포인트적립
mdao.updateMpoint(member.getId(),100);//회원의 아이디와 포인트 가져온다.
-포인트적립이 되었는지는 sql로 확인한다.
}//for

-장바구니 세션 해제 : 결제후 장바구니가 비어지도록!
-로그아웃전에 장바구니 세션만 해제
session.removeAttribute("mycart");

 

 

 

📁 product.model

💾 ProductDao

public void updateStock(Integer pnum, Integer qty) {
		
		ProductBean pb = new ProductBean();
		pb.setNum(pnum);
		pb.setStock(qty);
		sqlSessionTemplate.update(namespace+".UpdateStock",pb);
	}

 

 

📁 mybatis

💾 product.xml

<update id="UpdateStock">
	update products
	set stock = stock- #{stock}
	where num = #{num}
</update>

 

 

 

 

 

📁 order.model

💾OrderBean

package order.model;

public class OrderBean {

	private int oid;
	private String mid;
	private String orderdate;
	
	public int getOid() {
		return oid;
	}
	public void setOid(int oid) {
		this.oid = oid;
	}
	public String getMid() {
		return mid;
	}
	public void setMid(String mid) {
		this.mid = mid;
	}
	public String getOrderdate() {
		return orderdate;
	}
	public void setOrderdate(String orderdate) {
		this.orderdate = orderdate;
	}
	
}

 

 

💾 OrderDao

package order.model;


import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("OrderDao")
public class OrderDao {

	private final String namespace="order.model.Order"; //order.xml
	
	@Autowired
	SqlSessionTemplate sqlSessionTemplate;
	
	public void insertData(String id) {
		
		sqlSessionTemplate.insert(namespace+".InsertData", id);
		
	}

	public int getMaxOid() {
		
		int max =sqlSessionTemplate.selectOne(namespace+".GetMaxOid");
		System.out.println("max:"+max);
		return max;//가장큰값 가지고 돌아간다.
	}

}

 

📁mybatis

💾 order.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="order.model.Order">
	<insert id="InsertData">
		insert into orders
		values(seqoid.nextval,#{mid},sysdate)	
	</insert>
<!-- 	#{mid} -회원의 아이디를 넘기므로  -->

	<select id="GetMaxOid" resultType="int">
	 select max(oid) from orders
	</select>
	
</mapper>
<!-- order.xml -->

 

 

📁 orderdetail.model

💾 OderDetailBean

package orderdetail.model;

public class OderDetailBean {

	private int odid; //sequence
	private int oid; //주문번호
	private int pnum; //상품번호
	private int qty;//주문수량
	
	public int getOdid() {
		return odid;
	}
	public void setOdid(int odid) {
		this.odid = odid;
	}
	public int getOid() {
		return oid;
	}
	public void setOid(int oid) {
		this.oid = oid;
	}
	public int getPnum() {
		return pnum;
	}
	public void setPnum(int pnum) {
		this.pnum = pnum;
	}
	public int getQty() {
		return qty;
	}
	public void setQty(int qty) {
		this.qty = qty;
	}	
}

 

 

💾OrderDetailDao

package orderdetail.model;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("OrderDetailDao")
public class OrderDetailDao {

	
	private final String namespace="order.model.OrderDetail";
	
	@Autowired
	SqlSessionTemplate sqlSessionTemplate;
	
	
	public void insertData(OderDetailBean odBean) {
		
		int cnt =sqlSessionTemplate.insert(namespace+".InsertData",odBean);
		System.out.println("OrderDetailDao insertcnt:"+cnt);
	}

}

 

 

 

📁mybatis

💾 orderdetail.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="order.model.OrderDetail">
	<insert id="InsertData">
  		insert into orderdetails(odid,oid,pnum,qty) values(seqodid.nextval, #{oid},#{pnum},#{qty}) 
  	</insert>

</mapper>
<!-- orderdtail.xml -->