📌 CartController.java 내용 추가
package controller;
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.servlet.ModelAndView;
import logic.Cart;
import logic.Item;
import logic.ItemSet;
import logic.Sale;
import logic.ShopService;
import logic.User;
@Controller
@RequestMapping("cart")
public class CartController {
@Autowired
private ShopService service;
//http://localhost:8088/springmvc1/cart/cartAdd?id=1&quantity=1
@RequestMapping("cartAdd")
public ModelAndView add(Integer id, Integer quantity, HttpSession session) {
ModelAndView mav = new ModelAndView("cart/cart"); //뷰 이름
Item item = service.getItem(id); //상품 정보를 db에서 읽어 오기
//session의 "CART" 속성에 장바구니 정보를 저장.
Cart cart = (Cart)session.getAttribute("CART");
if(cart == null) {
cart = new Cart();
session.setAttribute("CART", cart); //CART 객체를 속성에 등록
}
//cart의 itemSetList에 추가
//itemSetList 존재하는 상품이 추가 되는 경우 수량만 증가시킴
cart.push(new ItemSet(item, quantity));
mav.addObject("cart",cart);
mav.addObject("message", item.getName() + ":" + quantity + "개 장바구니 추가");
return mav;
}
//http://localhost:8088/springmvc1/cart/cartDelete?index=0
@RequestMapping("cartDelete")
public ModelAndView delete(int index, HttpSession session) {
//index : cart.getItemSetList()의 인덱스.
ModelAndView mav = new ModelAndView("cart/cart");
Cart cart = (Cart)session.getAttribute("CART");
//요소 List.remove(index) : 삭제되는 해당 요소를 전달(리턴)
//delSet : 삭제되는 ItemSet 객체
ItemSet delSet = cart.getItemSetList().remove(index);
mav.addObject("cart", cart);
mav.addObject("message", delSet.getItem().getName() + " 이(가) 장바구니에서 삭제.");
return mav;
}
//http://localhost:8088/springmvc1/cart/cartView
@RequestMapping("cartView")
public ModelAndView view(HttpSession session) {
ModelAndView mav = new ModelAndView("cart/cart");
Cart cart = (Cart)session.getAttribute("CART");
mav.addObject("cart", cart);
return mav;
}
/*
* AOP 클래스 : CartAspect 클래스
* 로그인이 되어야 실행 가능하도록 AOP 부분 추가하기
* 장바구니에 주문상품이 없는 경우 실행 불가 AOP 부분 추가하기
*/
@RequestMapping("checkout")
public String checkout(HttpSession session) {
return null;
}
**/*
* 주문 확정 : end 요구
* 1. 로그인, 장바구니 상품 검증 필요 =>aop로 설정하기
* 2. 장바구니 상품을 saleitem 테이블에 저장하기
* 3. 로그인 정보로 주문정보(sale)테이블에 저장
* 4. 장바구니 상품제거
* 5. 주문정보 end.jsp 페이지로 출력
*/**
**@RequestMapping("end")
public ModelAndView checkend(HttpSession session) {
ModelAndView mav = new ModelAndView();
Cart cart = (Cart)session.getAttribute("CART");
User loginUser = (User)session.getAttribute("loginUser");
Sale sale = service.checkend(loginUser, cart); //sale, saleitem 테이블에 데이터 저장
cart.getItemSetList().clear(); //장바구니 상품제거
mav.addObject("sale", sale);
return mav;
}**
}
📌 SaleItem.java 생성
package logic;
public class SaleItem {
private int saleid;
private int seq;
private int itemid;
private int quantity;
private Item item;
public SaleItem() {}
public SaleItem(int saleid, int seq, ItemSet itemSet) {
this.saleid = saleid;
this.seq = seq;
this.item = itemSet.getItem();
this.itemid = itemSet.getItem().getId();
this.quantity = itemSet.getQuantity();
}
//getter, setter, toString
public int getSaleid() {
return saleid;
}
public void setSaleid(int saleid) {
this.saleid = saleid;
}
public int getSeq() {
return seq;
}
public void setSeq(int seq) {
this.seq = seq;
}
public int getItemid() {
return itemid;
}
public void setItemid(int itemid) {
this.itemid = itemid;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
@Override
public String toString() {
return "SaleItem [saleid=" + saleid + ", seq=" + seq + ", itemid=" + itemid + ", quantity=" + quantity
+ ", item=" + item + "]";
}
}
📌 Sale.java 생성
package logic;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Sale {
private int saleid;
private String userid;
private Date saledate;
private User User;
private List<SaleItem> itemList = new ArrayList<>();
public int getTotal() {
int sum = 0;
for(SaleItem si : itemList) {
sum += si.getItem().getPrice() * si.getQuantity();
}
return sum;
}
//getter, setter, toString
public int getSaleid() {
return saleid;
}
public void setSaleid(int saleid) {
this.saleid = saleid;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public Date getSaledate() {
return saledate;
}
public void setSaledate(Date saledate) {
this.saledate = saledate;
}
public User getUser() {
return User;
}
public void setUser(User user) {
User = user;
}
public List<SaleItem> getItemList() {
return itemList;
}
public void setItemList(List<SaleItem> itemList) {
this.itemList = itemList;
}
@Override
public String toString() {
return "Sale [saleid=" + saleid + ", userid=" + userid + ", saledate=" + saledate + ", User=" + User
+ ", itemList=" + itemList + "]";
}
}
📌 ShopService.java 내용 추가
package logic;
import java.io.File;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import dao.ItemDao;
**import dao.SaleDao;**
import dao.UserDao;
import dao.saleItemDao;
/*
* @Component : 해당 클래스를 객체화
* - Service 기능 : Controller 와 Model사이의 중간 역할의 클래스
*/
@Service //@Component + Service 기능
public class ShopService {
@Autowired //현재 내 컨테이너(객체)들 중에 itemDao 객체를 주입.
private ItemDao itemDao;
@Autowired
private UserDao userDao;
**@Autowired
private SaleDao saleDao;**
public List<Item> itemList() {
return itemDao.list();
}
public Item getItem(Integer id) {
return itemDao.getItem(id);
}
//db에 내용 저장. 파일 업로드.
//item : 저장 정보. 입력된 파라미터 값 + 업로드 된 파일의 내용
public void itemCreate(@Valid Item item, HttpServletRequest request) {
//item.getPicture() : 업로드 된 파일의 내용
if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
uploadFileCreate(item.getPicture(), uploadPath); //업로드 구현 완료
item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름
}
//maxid : item테이블 중 최대 id 값
int maxid = itemDao.maxId();
item.setId(maxid+1);
itemDao.insert(item);
}
private void uploadFileCreate(MultipartFile file, String uploadPath) {
//uploadPath : 파일이 업로드 되는 폴더
String orgFile = file.getOriginalFilename(); //업로드 된 파일의 이름
File fpath = new File(uploadPath);
if(!fpath.exists()) fpath.mkdirs(); //업로드 폴더를 생성(없으면)
try {
//파일의 내용 => uploadPath + orgFile 로 파일 저장
file.transferTo(new File(uploadPath + orgFile)); //파일업로드
} catch(Exception e) {
e.printStackTrace();
}
}
public void itemUpdate(Item item, HttpServletRequest request) {
//item.getPicture() : 업로드 된 파일의 내용
if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
uploadFileCreate(item.getPicture(), uploadPath); //파일 업로드 : 업로드된 내용을 서버에 파일로 저장
item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름을 db에 등록하기 위해 설정
}
itemDao.update(item);
}
public void itemDelete(Integer id) {
itemDao.delete(id);
}
public void userInsert(@Valid User user) {
userDao.insert(user);
}
public User getUser(String userid) {
return userDao.selectOne(userid);
}
public void userUpdate(@Valid User user) {
userDao.update(user);
}
public void userDelete(String userid) {
userDao.delete(userid);
}
public void userChgPass(String userid, String pass) {
userDao.chgpass(userid,pass);
}
public String getSearch(User user, String url) {
return userDao.search(user, url);
}
public List<User> userlist() {
return userDao.list();
}
**/*
* 로그인 정보, 장바구니 정보에서 sale, saleitem 테이블에 데이터 저장
* 결과를 Sale 객체로 저장
* 1. sale 테이블의 saleid의 최대 값 조회 : 최대값+1
* 2. sale 테이블에 userid,sysdate 등록
* 3. Cart 데이터에서 saleitem 데이터 추출. insert
* 4. saleitem 정보를 sale객체에 모든 데이터 저장
* 5. sale 데이터 리턴
*/
public Sale checkend(User loginUser, Cart cart) {
//1. sale 테이블의 saleid의 최대 값 조회
int maxid = saleDao.getMaxSaleId();
//2. sale 테이블 등록
Sale sale = new Sale();
sale.setSaleid(maxid + 1);
sale.setUserid(loginUser.getUserid());
sale.setUser(loginUser);
saleDao.insert(sale);
//3. Cart 데이터에서 saleitem 데이터 추출. insert
int seq = 0;
for(ItemSet is : cart.getItemSetList()) {
SaleItem salitem = new SaleItem(sale.getSaleid(), ++seq, is);
sale.getItemList().add(salitem);
saleItemDao.insert(saleitem);
}
return sale;
}**
}
📌 end.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%-- /springmvc1/src/main/webapp/WEB-INF/view/cart/end.jsp --%>
<!DOCTYPE html><html><head><meta charset="UTF-8">
<title>주문 확정 상품</title></head>
<body><h2>${sale.user.username}님이 주문하신 정보 입니다.</h2>
<h2>배송지 정보</h2>
<table><tr><td width="30%">주문아이디</td>
<td width="70%">${sessionScope.loginUser.userid}</td></tr>
<tr><td width="30%">이름</td>
<td width="70%">${sessionScope.loginUser.username}</td></tr>
<tr><td width="30%">우편번호</td>
<td width="70%">${sessionScope.loginUser.postcode}</td></tr>
<tr><td width="30%">주소</td>
<td width="70%">${sessionScope.loginUser.address}</td></tr>
<tr><td width="30%">전화번호</td>
<td width="70%">${sessionScope.loginUser.phoneno}</td></tr>
</table>
<h2>주문 완료 상품 </h2>
<table>
<tr><th>상품명</th><th>가격</th><th>수량</th><th>합계</th></tr>
<c:forEach items="${sale.itemList}" var="saleitem" >
<tr><td>${saleitem.item.name}</td>
<td><fmt:formatNumber value="${saleitem.item.price}" pattern="###,###"/></td>
<td>${saleitem.quantity}</td>
<td><fmt:formatNumber value="${saleitem.item.price *saleitem.quantity}" pattern="###,###"/></td></tr>
</c:forEach>
<tr><td colspan="4" align="right">
총 구입 금액 : <fmt:formatNumber value="${sale.total}" pattern="###,###"/>원
</td></tr>
<tr><td colspan="4">
<a href="../item/list">상품 목록</a>
</td></tr></table></body></html>
📌 SaleDao.java 생성
package dao;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;
import logic.Sale;
@Repository
public class SaleDao {
private NamedParameterJdbcTemplate template;
private Map<String, Object> param = new HashMap<>();
private RowMapper<Sale> mapper = new BeanPropertyRowMapper<>(Sale.class);
@Autowired
public void setDataSource(DataSource dataSource) {
template = new NamedParameterJdbcTemplate(dataSource);
}
public int getMaxSaleId() {
return template.queryForObject("select nvl(max(saleid),0) from sale", param, Integer.class);
}
public void insert(Sale sale) {
String sql = "insert into sale (saleid, userid, saledate) values (:saleid, :userid, sysdate)";
SqlParameterSource param = new BeanPropertySqlParameterSource(sale);
template.update(sql, param);
}
}
📌 saleItemDao.java 생성
package dao;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;
import logic.Sale;
import logic.SaleItem;
@Repository
public class SaleItemDao {
private NamedParameterJdbcTemplate template;
private Map<String, Object> param = new HashMap<>();
private RowMapper<Sale> mapper = new BeanPropertyRowMapper<>(Sale.class);
@Autowired
public void setDataSource(DataSource dataSource) {
template = new NamedParameterJdbcTemplate(dataSource);
}
public void insert(SaleItem saleitem) {
String Sql = "insert into saleitem (saleid, seq, itemid, quantity, price)"
+ " values(:saleid, :seq, :itemid, :quantity, :item.price)";
SqlParameterSource param = new BeanPropertySqlParameterSource(saleitem);
template.update(Sql, param);
}
}