본문 바로가기
Spring/study

상품관리 프로젝트 코드 작성 -3

by avvin 2019. 6. 18.

 상품관리 프로젝트 코드 작성 -3



상품관리 예제 코드 작성 순서 

 

7강) 상품관리 프로젝트 코드 작성 -1 (상품 테이블, 파일업로드 테스트)


1. jsp페이지 및 리소스 파일 넣고 servlet-context에 등록, url 매핑 : include / images ...


2. pom에 파일업로드, 썸네일 라이브러리 등록


3. 등록한 라이브러리에서 사용할 클래스를  servlet-context에 빈으로 등록


4. UploadController.java


5. 파일 업로드 폼.jsp


6. 업로드 결과.jsp

-----------------------------------------------------------------------------------------------------

8강 ) 상품관리 프로젝트 코드 작성 -2 ( 상품목록, 상세화면 )


7. 사용자 페이지

 : productDTO , DAO > Mapper(sample매퍼 사용)  > Service > Controller 작성

  / 상품 목록jsp 

-----------------------------------------------------------------------------------------------------

9강) 상품관리 프로젝트 코드 작성 -3


8. 로그인 페이지, 로그아웃

 : Member DTO , DAO > Mapper(sample매퍼 사용) > Service > Controller 작성


9. 장바구니 (cart 테이블 )

 : Cart DTO , DAO > Mapper(sample매퍼 사용) > Service > Controller 작성

-----------------------------------------------------------------------------------------------------

10강) 상품관리 프로젝트 코드 작성 -4


10. 관리자 로그인, 상품 등록, 수정, 삭제  (admin테이블 )

 :   Admin DTO , DAO > Mapper(sample매퍼 사용) > Service > Controller 작성

    관리자 로그인 페이지, 관리자 메뉴 페이지.jsp





쇼핑몰 페이지


자바파일


Controller


HomeController 

: home.jsp를 실행하기 위해 경유하는 컨트롤러 / 시간 정보 담아서 home.jsp  실행

MemberController

 : 로그인, 로그인 체크, 로그아웃, 

UploadController

 : 업로드폼으로 포워딩, 폼데이터 업로드, 업로드 함수

CartController

 : cart테이블 저장, cart 리스트 반환, 품목 삭제, 전체 삭제, 업데이트??<<

ProductController

 : 상품 목록, 상품 상세보기, 상품 등록 페이지로 포워딩, 등록시 상품목록페이지로 포워

AdminController

 : 관리자 로그인창으로 포워딩, 로그인 체크,  

   관리자 로그아웃처리하고 관리자로그인페이지로 포워딩  


Model


MemberDAO + Impl

MemberDTO

 : userid / passwd / name / email / join_date


CartDAO +Impl

CartDTO

 : cart_id / userid / name / product_id / product_name / price / money / amount 


ProductDAO + Impl

ProductDTO

 : product_id product_name price / description / picture_url / file1


Service


MemberService + Impl

CartService + Impl
ProductService + Impl

AdminService + Impl



설정파일


Mapper ( namespace로 구분 ) ★


memberMapper.xml 

 : 로그인 체크 쿼리

adminMapper.xml

 :  관리자 로그인 체크 쿼리  

cartMapper.xml

 : 장바구니 담기, 장바구니 리스트, 개별상품 삭제, 전체 삭제 쿼리  

productMapper.xml

 : 상품 리스트, 상품 상세, 상품 추가 쿼리  


기본 설정 파일  


web.xml 

 : root-context.xml, servlet-context.xml 로딩


root-context.xml

 : mybatis 객체 빈으로 등록, 등록시 Mappers.xml 스캔


servlet-context.xml

 : include나 image폴더 리소스 매핑 설정 / 업로드 경로 리소스 빈으로 등록 /

   파일 업로드에 필요한 클래스 빈으로 등록 / 컴포넌트 스캔 / 뷰로 포워딩시 pre,suffix 설정


pom.xml



//mybatis mapper 코드는 어디에?<<


views 파일 ( .jsp )


include 파일 : header / menu / admin_menu / style.css 

memberLogin / cart_list / product_detail / product_list / product_write / uploadForm / uploadResult

admin / a
dminLogin



상품관리 sql 작성 : member 테이블 / product 테이블 / cart 테이블



회원 로그인, 로그아웃 처리


MemberDTO 작성


MemberDAO 작성


MemberDAO.java

1
2
3
4
5
6
7
8
9
package com.example.spring02test.model.member.DAO;
 
import com.example.spring02test.model.member.DTO.MemberDTO;
 
public interface MemberDAO {
 
    public String loginCheck(MemberDTO dto);
}
 



MemberDAOImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.example.spring02test.model.member.DAO;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
 
import com.example.spring02test.model.member.DTO.MemberDTO;
 
@Repository
public class MemberDAOImpl implements MemberDAO {
 
    @Inject
    SqlSession sqlSession;
    
    @Override
    public String loginCheck(MemberDTO dto) 
        
        //mybatis mapper 파일(mapper/memeberMapper.xml)
        //네임스페이스가 member이고 id가 login_check인 select(태그)문 실행
        return sqlSession.selectOne("member.login_check", dto);
    }
    
}



memberMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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와 중복되지 않도록 네임스페이스 기재 -->
<mapper namespace="member">
<!-- DAO에서 selectOne()에 매개값으로  namespace.id, 
      비교할 DTO객체(resultType)값 줌-->
      
    <select id="login_check"
    resultType"com.example.spring02test.model.member.dto.MemberDTO">
    
    select * from member 
    where userid= #{userid} and passwd=#{passwd}
    <!-- #{ }는 쿼리문에서 ?처리된 부분을 
    pstmt.set[Type](index, value)로 처리하는것과 같음 -->
    </select>    
</mapper>
cs



login.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%@ include file="../include/header.jsp" %>
<script>
$(function(){
    $("#btnLogin").click(function(){ //id=btnLogin을 클릭하면
        var userid=$("#userid").val(); //id=userid의 value
        var passwd=$("#passwd").val();
        if(userid==""){
            alert("아이디를 입력하세요.");
            $("#userid").focus();
            return;
        }
        if(passwd==""){
            alert("비밀번호를 입력하세요.");
            $("#passwd").focus();
            return;
        }
        document.form1.action="${path}/member/login_check.do";
        document.form1.submit();
    });
});
</script>
</head>
<body>
<%@ include file="../include/menu.jsp" %>
<h2>로그인</h2>
<form name="form1" method="post">
<table border="1" width="400px">
    <tr>
        <td>아이디</td>
        <td><input id="userid" name="userid"></td>
    </tr>
    <tr>
        <td>비밀번호</td>
        <td><input type="password" id="passwd" name="passwd"></td>
    </tr>
    <tr>
        <td colspan="2" align="center">
            <button type="button" id="btnLogin">로그인</button>
            <c:if test="${param.message == 'nologin' }">
                <div style="color:red;">
                    먼저 로그인하세요.
                </div>
            </c:if>
            <c:if test="${message == 'error' }">
                <div style="color:red;">
                    아이디 또는 비밀번호가 일치하지 않습니다.
                </div>
            </c:if>
            <c:if test="${message == 'logout' }">
                <div style="color:red;">
                    로그아웃되었습니다.
                </div>
            </c:if>
        </td>
    </tr>
</table>
</form>
</body>
</html>
cs




jquery 사용을 위한 문법


... 생략 ...

<script>

$(function(){

... jQuery 메서드, 액션을 입력 ...

});

</script>

... 생략 ...



$(document).ready(function(){ }); 와 $(function(){ }); 는 동일한 의미입니다. 코딩이 길어지다 간편하게 후자와 같이 많이 사용을 합니다. 

출처: https://theqoop.tistory.com/295 []







MemberService.java ( 인터페이스 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.example.spring02test.service.member;
 
import javax.servlet.http.HttpSession;
 
import com.example.spring02test.model.member.DTO.MemberDTO;
 
public interface MemberService {
    
    //로그아웃은 DB에 접속할 필요가 없으므로 DAO한테까지 처리를 넘길 필요가 없다
    //Controller는 Service로 처리할 데이터를 넘기고, 
    //Service는 데이터베이스 접근이 필요한 데이터 처리를 DAO로 넘긴다. 무조건 다 넘기는게 아님
    //(Servide단의 사용은 개발자 재량이나 일반적으로 이렇게 쓰임)
    
    public String logincheck(MemberDTO dto, HttpSession session);
    
 
    public void logout(HttpSession session);
    //logout()은 유지되고있는 session을 매개값으로 받아서 세션을 초기화시키는 메서드
    
}
 
cs



session을 어떤 식으로 사용하는지 살펴보기



MemberServiceImpl.java ( 구현클래스 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.example.spring02test.service.member;
 
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
 
import org.springframework.stereotype.Service;
 
import com.example.spring02test.model.member.DAO.MemberDAO;
import com.example.spring02test.model.member.DTO.MemberDTO;
 
@Service
public class MemberServiceImpl implements MemberService {
 
    @Inject
    MemberDAO memberDao;
    
    @Override
    public String logincheck(MemberDTO dto, HttpSession session) {
        //Dao에 로그인체크를 맡긴다
        //맞으면 이름이 넘어오고 틀리면 null이 넘어옴
        String name=memberDao.loginCheck(dto);
        
        if(name != null) { //맞으면
            //세션변수 등록
            //Controller에서 매개값으로 넘어온 dto의 userid값을 
            //session에 등록해준다.
            session.setAttribute("userid", dto.getUserid());
            session.setAttribute("name", name);
        }
        return name;
    }
 
    @Override
    public void logout(HttpSession session) {
        //세션을 모두 초기화시킴
        session.invalidate();
 
    }
 
}
 
cs




MemberController.java


컨트롤러 : 1.URL 매핑 2. 데이터 처리 넘기고 넘어온 데이터 내장객체에 담기  3. 뷰로 포워딩이나 리다이렉트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.example.spring02test.controller.member;
 
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import com.example.spring02test.model.member.DTO.MemberDTO;
import com.example.spring02test.service.member.MemberService;
 
@Controller
@RequestMapping("/member/*")
public class MemberController {
 
    //로깅툴 slf4j.Logger
    private static final Logger logger=
            LoggerFactory.getLogger(MemberController.class);
    
    //인터페이스 객체를 생성해서 구현객체 사용
    @Inject
    MemberService memberService;
    
    @RequestMapping("login.do")
    public String login() {
        return "member/login";
    }
    
    // @RequestParam은 폼의 개별값, 
    //@ModelAtrribute는 폼의 전체 데이터(dto) 받아올 때 사용
    @RequestMapping("login_check.do")
    public ModelAndView login_check(@ModelAttribute MemberDTO dto,// 폼데이터 세트!
            HttpSession session, ModelAndView mav) {
        
        //다운받은 예제 코드에는 블럭 안에서 MAV객체 생성했는데
        //이건 파라미터 자리에서 변수 선언만 해봄
        //그럼 객체가 알아서 생성 되는건가?
        
        String name = memberService.logincheck(dto, session);
        
        //위에 생성한 로깅툴 실행
        logger.info("name : " + name);
        
        //세션에 정보를 저장하거나, 세션을 초기화하는 처리는 서비스에서 진행한다.
        //DAO에서는 데이터베이스와 관련된 과정만 받아서 처리한다.
        //DAO까지 session객체를 매개값으로 보낼 필요는 없다.
        //서비스단에서 name 정보를 받아와 받아온 name정보가 있으면(로그인 성공이면)
        //home으로 포워딩한다.
        
        //아이디가 불일치한다면
        if(name != null) {
            mav.setViewName("home");
        }else { //로그인에 실패하면 login 페이지로 다시 되돌아가게한다.
            mav.setViewName("member/login");
            mav.addObject("message""아이디, 패스워드를 확인해주세요.");
        }
        
        return mav;
    }
    
    @RequestMapping("logout.do")
    public ModelAndView logout(
            HttpSession session, ModelAndView mav) {
        
        memberService.logout(session); //세션 초기화 작업 맡기기
        mav.setViewName("member/login");
        mav.addObject("message""로그아웃합니다.");
    
        return mav; //로그인 페이지로 이동
    }
    
}
 
cs



 @RequestParam은 폼의 개별값, @ModelAtrribute는 폼의 전체 데이터(dto) 받아올 때 사용




장바구니 



CartDTO.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.example.spring02test.model.shop.dto;
 
public class CartDTO {
    private int cart_id; //카트에 담기는 아이템 번호?
    private String userid;
    private String name;
    private int product_id;
    private String product_name;
    private int price;
    private int money;
    private int amount;
    
    public int getCart_id() {
        return cart_id;
    }
    public void setCart_id(int cart_id) {
        this.cart_id = cart_id;
    }
    public String getUserid() {
        return userid;
    }
    public void setUserid(String userid) {
        this.userid = userid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getProduct_id() {
        return product_id;
    }
    public void setProduct_id(int product_id) {
        this.product_id = product_id;
    }
    public String getProduct_name() {
        return product_name;
    }
    public void setProduct_name(String product_name) {
        this.product_name = product_name;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public int getMoney() {
        return money;
    }
    public void setMoney(int money) {
        this.money = money;
    }
    public int getAmount() {
        return amount;
    }
    public void setAmount(int amount) {
        this.amount = amount;
    }
    @Override
    public String toString() {
        return "CartDTO [cart_id=" + cart_id + ", userid=" + userid + ", name=" + name + ", product_id=" + product_id
                + ", product_name=" + product_name + ", price=" + price + ", money=" + money + ", amount=" + amount + "]";
    }
 
}
 
cs



CartDAO.java ( 인터페이스 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.example.spring02test.model.shop.dao;
 
import java.util.List;
 
import com.example.spring02test.model.shop.dto.CartDTO;
 
public interface CartDAO {
    
    List<CartDTO> cartMoney(); //mapper봐도 무슨 메서드인지 모르겠다
    //정의만 돼있고 사용하질 않는다.?? 왜 있는거
    
    void insert(CartDTO dto); //장바구니 추가
    List<CartDTO> listCart(String userid); //장바구니 목록
    void delete(int cart_id); // 장바구니 아이템 개별 삭제 
    void deleteAll(String uerid); //장바구니 비우기
    void update(int cart_id);
    int sumMoney(String userid);// 장바구니 금액 합계
    int CountCart(String userid, int product_id);//장바구니 상품 갯수
    void modifyCart(CartDTO dto); 
}
 
cs





CartDAOImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.example.spring02test.model.shop.dao;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
 
import com.example.spring02test.model.shop.dto.CartDTO;
 @Repository
public class CartDAOImpl implements CartDAO {
 
    @Inject
    SqlSession sqlSession; //root-context에 빈으로 등록한 mybatis객체
    
    //매퍼 봐도 무슨 목적으로 사용하는지 모르겠는 메서드 
    //DB 접근해서 가져온 데이터를 쓰는 곳이 없다
    @Override
    public List<CartDTO> cartMoney() {
        return null;
    }
 
    
    @Override
    public void insert(CartDTO dto) {
        sqlSession.insert("cart.inset",dto);
    } namespace.id
 
    @Override
    public List<CartDTO> listCart(String userid) {
        
        return sqlSession.selectList("cart.listCart",userid);
    }
 
    @Override
    public void delete(int cart_id) {
        sqlSession.delete("cart.delete", cart_id);
    }
 
    @Override
    public void deleteAll(String userid) {
        sqlSession.delete("cart.deleteAll", userid);
    }
 
    @Override
    public void update(int cart_id) {
        sqlSession.update("cart.update", cart_id);
 
    }
 
    @Override
    public int sumMoney(String userid) {
        return sqlSession.selectOne("cart.sumMoney", userid);
    }
 
...생략...
}
 




sqlSession.method( statement , object parameter )


statement : mapper의 namespace.(query tag)id



CartService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.example.spring02test.service.shop;
 
import java.util.List;
 
import com.example.spring02test.model.shop.dto.CartDTO;
 
public interface CartService {
    
    //CartDAO와 동일하게
    List<CartDTO> cartMoney();
    void insert(CartDTO dto); //장바구니 추가
    List<CartDTO> listCart(String userid); //장바구니 목록
    void delete(int cart_id); //장바구니 개별 삭제
    void deleteAll(String userid); //장바구니 비우기
    void update(int cart_id); 
    int sumMoney(String userid); //장바구니 금액 합계
    int countCart(String userid, int product_id); //장바구니 상품 갯수
    void updateCart(CartDTO dto); //장바구니 수정 
    void modifyCart(CartDTO dto);
}





CartServiceImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.example.spring02test.service.shop;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.springframework.stereotype.Service;
 
import com.example.spring02test.model.shop.dao.CartDAO;
import com.example.spring02test.model.shop.dto.CartDTO;
 
@Service
public class CartServiceImpl implements CartService {
 
    
    @Inject
    CartDAO cartDao;
    
    @Override
    public List<CartDTO> cartMoney() {
        return null;
    }
 
    @Override
    public void insert(CartDTO dto) {
        cartDao.insert(dto);
    }
 
    @Override
    public List<CartDTO> listCart(String userid) {
        return cartDao.listCart(userid);
    }
 
    @Override
    public void delete(int cart_id) {
        cartDao.delete(cart_id);
    }
 
    @Override
    public void deleteAll(String userid) {
        cartDao.deleteAll(userid);
    }
 
    @Override
    public void update(int cart_id) {
        cartDao.update(cart_id);
    }
 
    @Override
    public int sumMoney(String userid) {
        return cartDao.sumMoney(userid);
    }
 
    @Override
    public int countCart(String userid, int product_id) {
        return cartDao.countCart(userid, product_id);
    }
 
...생략...
}
 
cs



CartController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package com.example.spring02test.controller.shop;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
 
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import com.example.spring02test.model.shop.dto.CartDTO;
import com.example.spring02test.service.shop.CartService;
 
@Controller
@RequestMapping("/member/cart/*")
public class CartController {
 
    @Inject
    CartService cartService;
 
    @RequestMapping("insert.do")
    // 페이지 이동시 list로 URL 변경을 원하므로 리다이렉트 사용
    // 로그인 시에만 장바구니 기능 이용할 수 있도록 로그인 정보를 담고있는 세션 객체 필요
    public String insert(@ModelAttribute CartDTO dto, HttpSession session) {
 
        // session객체의 attribute는 Object타입
        String userid = (String) session.getAttribute("userid");
 
        if (userid == null) {
            return "redirect:/member/login.do";
        }
        dto.setUserid(userid);
        cartService.insert(dto);
 
        return "redirect:/shop/cart/list.do";
    }
 
    // 장바구니 리스트 :cartService의 listCart, sumMoney 메서드 사용
    // 장바구니 목록과 금액합계는 로그인 아이디 정보가 있어야하므로
    // 세션에서 아이디 정보를 받아낸다.
    @RequestMapping("list.do")
    public ModelAndView list(ModelAndView mav, HttpSession session) {
 
        // 장바구니 목록, 금액 합계, 배송료, 리스트의 사이즈(주문 아이템 갯수) 등
        // dto로 표현되지 않는 여러가지 정보를 담아 뷰로 넘겨야하므로 HashMap 사용
        Map<String, Object> map = new HashMap<String, Object>();
 
        String userid = (String) session.getAttribute("userid");
        if (userid != null) {// 로그인한 상태이면
            List<CartDTO> list = cartService.listCart(userid);// 서비스단에서 장바구니 목록을 가져오고
            int sumMoney = cartService.sumMoney(userid);// 금액 합계를 가져오고
            int fee = sumMoney >= 30000 ? 0 : 2500;// 금액 합계에 대한 배송료를 계산하고
            // 금액,배송비,총액,리스트사이즈,장바구니목록
            // 각 값들을 map에 넣어준다.
            map.put("sumMoney", sumMoney);
            map.put("fee", fee);
            map.put("sum", fee + sumMoney);
            map.put("list", list);
            map.put("count", list.size());
 
            mav.setViewName("shop/cart_list"); // 장바구니리스트로 뷰 설정
            mav.addObject("map", map);
            // ModelAndView 객체에 map을 담고 리스트 뷰를 설정해준 뒤 포워딩.
 
            return mav;
 
        } else {
            // 로그인하지 않은 상태이면 로그인 페이지로
            // 아무 Object도 안줘도 되나?
            mav.setViewName("member/login");
            return mav;
        }
    }
 
    @RequestMapping("delete.do")
    public String delete(int cart_id) {
 
        cartService.delete(cart_id);
 
        return "redirect:/shop/cart/list.do";
    }
 
    @RequestMapping("deleteAll.do")
    public String deleteAll(HttpSession session) {
 
        // 세션에셔 유저아이디 가져오는걸 service에서 안하고 서비스에서 하나?
        // ServiceImpl에서 진행해도 되는 처리과정
        String userid = (String) session.getAttribute("userid");
        if (userid != null) {
            cartService.deleteAll(userid);
        }
 
        return "redirect:/shop/cart/list.do";
    }
 
    // ServiceImple의 modifyCart/delete 메서드 사용
    @RequestMapping("update.do")
    public String update(int[] amount, int[] cart_id, HttpSession session) {
 
        String userid = (String) session.getAttribute("userid");
 
        for (int i = 0; i < cart_id.length; i++) {
 
            // amount가 0이면 카트아이디를 삭제
            if (amount[i] == 0) {
                cartService.delete(cart_id[i]);
            } else {
                CartDTO dto = new CartDTO();
                dto.setUserid(userid);
                dto.setCart_id(cart_id[i]);
                dto.setAmount(amount[i]);
                cartService.modifyCart(dto);
            }
        }
 
        return "redirect:/shop/cart/list.do";
    }
 
}
 
cs



컨트롤러 : 1.URL 매핑 2. 데이터 처리 넘기고 넘어온 데이터 내장객체에 담기  3. 뷰로 포워딩이나 리다이렉트


cart_id는 어디에서 오는건지 >?

cartMapper.xml

1
2
3
4
5
6
<!-- 장바구니에 담기 -->
    <insert id="insert">
        insert into cart (cart_id, userid, product_id, amount)
        values 
          (seq_cart.nextval, #{userid}, #{product_id}, #{amount} )
    </insert>
cs


cart_id는 장바구니에 상품 insert시 dbms에 생성했던 시퀀스를 이용해 number를 부여한다.


redirect는 컨트롤러를, ModelAndView는 view를 설정?? 


컨트롤러의 메서드에서 리턴타입이 없는 경우는 url맵핑 주소 = 이동할 페이지 이름이 같은 경우


나머지는 MAV나 String으로 포워딩




cart_list.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%@ include file="../include/header.jsp"%>
<script>
    //include된 header파일에 jquery 소스 등록돼있음
    //<script src="http://code.jquery.com/jquery-3.3.1.js">
    $(function() {
        /* 상품 목록 버튼 */
        $("#btnList").click(function() {
            location.href = "${path}/shop/product/list.do";
        });
 
        $("#btnDelete").click(function() {
            if (confirm("장바구니를 비우시겠습니까?")) {
                location.href = "${path}/shop/cart/deleteAll.do";
            }
        });
 
    });
</script>
</head>
</head>
<body>
<%@ include file="../include/menu.jsp"%>
<h2>장바구니</h2>
<c:choose>
<c:when test="${map.count == 0}"
장바구니가 비었습니다.
</c:when>
<c:otherwise>
<!-- 장바구니가 비어있지 않으면 상품목록 리스트 출력 -->
<form id="form1" name="form1" method="post"
    action="${path}/shop./cart/update.do"></form>
<table border="1" width="400px">
    <tr>
        <th>상품명</th>
        <th>단가</th>
        <th>수량</th>
        <th>금액</th>
        <th>&nbsp;</th>
    </tr>
    <!-- list.do로 url매핑된 메서드가 실행될때 mav에 담아 포워딩한 map 오브젝트 -->
    <c:foreach var="row" items="${map.list }">
        <tr align="center">
            <td>
                ${row.product_name}
            </td>
            <td>
                <fmt:formatNuber value="${row.price}" pattern="#,###,###" />
            </td>
            <td>
            <!-- 세자리수마다 콤마가 찍히도록 수량 정보를 받고, 
             카트에 담을 때 생성되었던 카트 아이디를 hidden을 사용해 폼데이터로 함께 넘겨준다. -->
                <input type="number" name="amount" style="width: 30px;"
                    value="<fmt:formatNumber value="${row.amount}" pattern="#,###,###"/>">
                <input type="hidden" name="cart_id" value="${row.cart_id}">
            </td>
            <td>
                <fmt:formatNumber value="${row.money}"
                    pattern="#,###,###" />
            </td>
            <td>
                <a href="${path}/shop/cart/delete.do?cart_id=${row.cart_id}">[삭제]</a>
            </td>
        </tr>
    </c:foreach>
</table>
</c:otherwise>
</c:choose>
<button type="button" id="btnList">상품목록</button>
</body>
</html>
cs



JSTL format 을 이용하여 세자리마다 콤마를 찍어줄수 있다.

파싱전 문자열값 : ${price } <br/>
파싱후 문자열값: <fmt:formatNumber value="${price }" pattern="#,###" />

출처: https://roqkffhwk.tistory.com/50 [야근싫어하는 개발자]



1
2
<input type="number" name="amount" style="width: 30px;"
                    value="<fmt:formatNumber value="${row.amount}" pattern="#,###,###"/>">
cs


>> value=" ${row.amount} " 에 포맷 패턴 적용