20220823_tue
프로젝트명: shop_Teacher
실습내용
- 쇼핑몰 메뉴판에서 상품별 목록조회 기능 구현
- 아이템 테이블 & 상품카테고리 테이블 (DB)
- SELECT * FROM SHOP_ITEM;
- SELECT * FROM ITEM_CATEGORY;
- 두 테이블 모두 공통으로 갖고있는 컬럼은 CATE_CODE 이다.
AND CATE_CODE = '#{cateCode}'
</if>```
<select id="selectItemList" resultMap="itemView">
SELECT ITEM_CODE
, ITEM_NAME
, ITEM_PRICE
, ATTACHED_NAME
FROM ITEM_VIEW
WHERE IS_MAIN = 'Y'
<if test="cateCode != null and !cateCode.equals('')">
AND CATE_CODE = '#{cateCode}'
</if>
ORDER BY ITEM_CODE DESC
</select>
menu.jsp 가서 모두 a태그를 달아준다. 대신 cateCode를 가지고 가야한다.
itemController 가서 상품목록조회 if문 에서 cateCode 받아야한다.
itemService와 itemServiceImpl에서 mapper 쿼리문 에서 작성하며 추가된 매개변수cateCode를 매개변수로 넣어 수정한다.
주의!!! 빈값데려오는 데이터가 여러개여서 객체(boardDTO)로 넘어올때만 getter를 사용한다!!!
ex) 만약 게시글제목 데이터를 가져온다면, boardDTO.getTitle();
그래서 넘어오는 자료형을 보고 getter를 호출한다!!!
위에는 자료형이 boardDTO 이기 때문에 사용한 것!
예) int a = 10;
a.~~ -> 사용불가!! a 객체가 아니라 정수형 변수이기때문에!
그냥 boardNum 하나의 매개변수(문자열)만 데이터가 넘어올 때는 getter사용 불가!
boardNum.getBoardNum (x) -> 위에 처럼 마찬가지로 사용불가하다!
데이터를 넘길 때 방식
1) 하나의 문자열 데이터로 넘길 때: String cateCode
2) 객체명으로 데이터를 넘길 때: ItemDTO itemDTO
<if test="cateCode != null and !cateCode.equals('')">
AND CATE_CODE = '#{cateCode}'
</if>
--> 그러나 조건절 안의 쿼리에서 #{cateCode} 빈값 하나만 있을 때는 getter 호출이 아니지만, if문이나 forEach문 빈값은 무조건!! getter 호출이기 때문에 if문 안에 있는 cateCode 라는 매개변수가 또 있기 때문에 itemDTO 라는 객체명을 만들어서 itemService에 매개변수로 들어가야한다!!!!!!!실습내용
- 장바구니화면에서 '선택구매','선택삭제' 버튼기능 구현
- 선택구매버튼을 클릭하면, '선택한 상품을 구매하시겠습니까?'팝업창을 띄운다.
- cart_list.js 파(자바스트립트 파일내 작성)
function goBuy(){ const checkedCnt = document.querySelectorAll('.chk:Checked').length;//체크박스들중에서 체크된 것들만!그것의 갯수. if(checkedCnt == 0){ alert('선택한 상품이 없습니다.'); return ; //리턴의 2가지 기능 //1)데이터를 넘기도록 돌려줄 값을 쓸 때(일반적) //2)자바에서는 메소드이기때문에 뒤에 아무값도없으면 더이상 읽지않도록 함수종료 기능. } //넘겨야하는 데이터: 내가 체크한 ITEM_CODE,BUY_CNT,BUY_CODE, //TOTAL_PRICE(상관없어서 넘기지않음) location.href = 'insertBuy.buy?';
실습내용
: submit 버튼 두개있을 때 form태그 사용시, 자바스크립트 이용하는 방법
- item_detail.jsp
<body> <div class="detail-container"> <div class="firstDiv"> <div>Main image <c:forEach var="itemView" items="${item}"> <c:if test="${itemView.isMain eq 'Y' }"> <img width="300px" height="360px" src="images/${itemView.attachedName}" name="attachedName"> </c:if> </c:forEach> </div> <div><!-- item매퍼에서 상세조회 쿼리를 만든 결과값들 사용하는 것들... --> <form action="insertCart.ca" method="post"> <input type="hidden" name="itemCode" value="${item[0].itemCode}"> <div>Name : <!-- item 은 List이다!!! 그래서 그냥 item. 으로 사용불가능! --> ${item[0].itemName}</div> <div>Price : <span id="priceSpan">${item[0].itemPrice}</span> </div> <div>Stock : <input type="number" class="my-input" name="putCnt" value="1" min="1"> </div> <div>Total Price : <span id="totalPriceSpan">${item[0].itemPrice}</span></div> <div> <div class="btnDiv"> <!-- submit 버튼이 두개이상있을 때 form 사용법은 자바스크립트!! --> <input type="button" class="btn" value="구매하기" onclick="goBuy();" > <input type="submit" class="btn" value="장바구니"> </div> </div> </form> </div> </div> <div class="secDiv"> <div>itemComment :</div> <div>${item[0].itemComment}</div> </div> <div class="thdDiv"> <div>Detail.</div> <div> <c:forEach var="itemView" items="${item}"> <c:if test="${itemView.isMain eq 'N' }"> <img src="images/${itemView.attachedName}"> </c:if> </c:forEach> </div> </div> </div> </body>
- 자바스크립트문
: 장바구니 상품목록페이지에서 같은 상품끼리는 병합시켜서 보이도록 기능 구현(수량,단가,총가격..)<script type="text/javascript"> //구매하기 버튼 클릭 시 function goBuy() { const formTag = document.querySelector('form');//폼태그 자체를 선택 formTag.action = 'insertBuy.buy';//폼태그의 액션 속성값을 insertBuy.buy 으로 변경하기. formTag.submit();//위에서 변경된 곳으로 페이지이동한다. } </script>
실습내용
- 상품상세보기 페이지에서 구매하기 버튼 클릭시, 입력한 데이터값이 'shop_buy'테이블에 입려되어 조회.(insert)
- shop_buy,buy_detail 테이블 조회
- 트랜잭션 처리 사용하기
package dto;
public class BuyDTO {
private String buyCode;
private String memId;
private String buyDate;
private int totalPrice;
//컨트롤러에서 필요한 변수는 만들어서 사용한다.(getter,setter까지)
private int putCnt;
private String itemCode;
public int getPutCnt() {
return putCnt;
}
public void setPutCnt(int putCnt) {
this.putCnt = putCnt;
}
public String getItemCode() {
return itemCode;
}
public void setItemCode(String itemCode) {
this.itemCode = itemCode;
}
public String getBuyCode() {
return buyCode;
}
public void setBuyCode(String buyCode) {
this.buyCode = buyCode;
}
public String getMemId() {
return memId;
}
public void setMemId(String memId) {
this.memId = memId;
}
public String getBuyDate() {
return buyDate;
}
public void setBuyDate(String buyDate) {
this.buyDate = buyDate;
}
public int getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(int totalPrice) {
this.totalPrice = totalPrice;
}
@Override
public String toString() {
return "BuyDTO [buyCode=" + buyCode + ", memId=" + memId + ", buyDate=" + buyDate + ", totalPrice=" + totalPrice
+ ", buyDetailDTO=" + "]";
}
}
<mapper resource="sqlmap/buy-mapper.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="buyMapper">
<!-- 구매 정보 등록 -->
<!-- insert 할때 주의!
date 처럼 기본적으로 자동값이 있는 경우는 넣지않는다! -->
<insert id="insertBuy">
INSERT INTO SHOP_BUY(
BUY_CODE
, MEM_ID
, TOTAL_PRICE
)VALUES(
#{buyCode}
, #{memId}
, #{putCnt} * (SELECT ITEM_PRICE
FROM SHOP_ITEM
WHERE ITEM_CODE = #{itemCode})
)
</insert>
<!-- 구매코드 1씩 증가 -->
<!--resultType="String" 의 뜻은 디비에서 실제로 쿼리실행했을 때 나오는 결과를 자바로 가져올때는 문자열로 가져오겠다. -->
<select id="selectNextBuyCode" resultType="String">
SELECT 'BUY_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(BUY_CODE, 5))), 0) + 1, 3, 0)
FROM SHOP_BUY
</select>
<!-- 구매하기_상세 -->
<insert id="insertBuyDetail" >
INSERT INTO SHOP_BUY(
BUY_DETAIL_CODE
,ITEM_CODE
,BUY_CNT
,BUY_CODE
)VALUES(
#{buyDetailCode}
,#{itemCode}
,#{buyCnt}
,#{buyCode}
)
</insert>
</mapper>
@WebServlet("*.buy")
public class BuyController extends HttpServlet {
private static final long serialVersionUID = 1L;
private BuyService buyService = new BuyServiceImpl();
public BuyController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//한글 인코딩 처리
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String requestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String command = requestURI.substring(contextPath.length());
System.out.println("command = " + command);
String page = "jsp/template/template.jsp";
boolean isRediect = false;
String contentPage = "";
//구매하기
if(command.equals("/insertBuy.buy")) {
String itemCode = request.getParameter("itemCode");
int putCnt = Integer.parseInt(request.getParameter("putCnt"));
//다음에 들어갈 BUY_CODE 조회
String nextBuyCode = buyService.selectNextBuyCode();
HttpSession session = request.getSession();
MemberDTO loginInfo = (MemberDTO)session.getAttribute("loginInfo");
String memId = loginInfo.getMemId();
BuyDTO buyDTO = new BuyDTO();
buyDTO.setItemCode(itemCode);
buyDTO.setPutCnt(putCnt);
buyDTO.setMemId(memId);
buyDTO.setBuyCode(nextBuyCode);
buyService.insertBuy(buyDTO);
contentPage = "buy/buy_list.jsp";
}
request.setAttribute("contentPage", contentPage);
if(isRediect) {
response.sendRedirect(page);
}
else {
RequestDispatcher dispatcher = request.getRequestDispatcher(page);
dispatcher.forward(request, response);
}
}
}
public interface BuyService {
//장바구니 등록
//void insertCart(CartDTO cartDTO);//putCnt,memID,itemCode 모두 cartDTO에 들어있음.
//구매정보등록
void insertBuy(BuyDTO buyDTO);
//다음에 들어갈 구매코드 조회
String selectNextBuyCode();
}
SqlSessionFactory sqlSessionFactory = SqlSessionManager.getSqlSession();
SqlSession sqlSession = sqlSessionFactory.openSession();
//구매정보등록
@Override
public void insertBuy(BuyDTO buyDTO) {
sqlSession.insert("buyMapper.insertBuy",buyDTO);
sqlSession.commit();
}
//다음에 들어갈 구매코드 1씩 증가
@Override
public String selectNextBuyCode() {
String nextBuyCode = sqlSession.selectOne("buyMapper.selectNextBuyCode");
sqlSession.commit();
return nextBuyCode;
}
}
<%@ 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"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link type="text/css" rel="stylesheet" href="css/template/common.css">
<link type="text/css" rel="stylesheet" href="css/template/menu.css">
</head>
<body>
<h2>구매내역</h2>
<table>
<thead>
<tr>
<td>구매코드</td>
<td>아이디</td>
<td>구매날짜</td>
<td>총 가격</td>
</tr>
</thead>
<tr>//반복문은 수정중인 부분
<c:forEach var="cart" items="${cartList}">
<td>${cart.buyCode }</td>
<td>${sessionScope.loginInfo.memName}</td>
<td>${cart.buyDate }</td>
<td><fmt:formatNumber pattern="₩##,##0" value="${cart.totalPrice}"/></td>
</c:forEach>
</tr>
<tbody>
</tbody>
<tfoot>
</tfoot>
</table>
</body>
</html>
<결과>
shop_teacher 프로젝트 파일을 처음부터 실행을 하면,
구매하기 페이지에서 수량입력후 '구매하기' 버튼클릭시,
디비에서 shop_buy 테이블 조회시 데이터가 삽입된것을 알 수 있다.
- DB 테이블 조회결과
- 콘솔결과
DEBUG [2022-08-23 16:42:11,900] - ==> Preparing: INSERT INTO SHOP_BUY( BUY_CODE , MEM_ID , TOTAL_PRICE )VALUES( ? , ? , (SELECT ? * ITEM_PRICE FROM SHOP_ITEM WHERE ITEM_CODE = ?) ) DEBUG [2022-08-23 16:42:11,902] - ==> Parameters: BUY_001(String), abc(String), 1(Integer), ITEM_005(String) DEBUG [2022-08-23 16:42:11,918] - <== Updates: 1 DEBUG [2022-08-23 16:42:11,918] - Committing JDBC Connection [oracle.jdbc.driver.T4CConnection@5d82def5]