상품관리 (상품 상세 보기 구현)

Back-End/Spring 2019. 6. 12. 12:29
728x90
반응형

상품관리 (상품 상세 보기 구현)


상품이름에 링크를 걸어 상품 상세정보를 출력하고, 장바구니 기능을 사용할수있게 한다.


 -상품 상세 보기-


1. list 파일에서 "상품상세보기" 링크를 클릭 하면 URL을 컨트롤러로 보낸다. 


2. 그리고 끝에 들어가는 상품 번호는 URL에 포함된 변수이므로 @PathVariable로 저장이 된다.


3. list파일에서 보낸 URL을 컨트롤러에서 받고, 그 URL에 맞는 @RequestMapping된 메소드를 실행한다.


4. 매핑된 메소드 안에는 데이터를 보낼 뷰를 설정하고, 보낼 데이터를 동시에 설정하기 위해 ModelAndView 타입을 사용하고, 


5. setViewName( ) 메소드 (데이터를 보낼 뷰의 위치) , addObject( ) 메소드 (보낼 데이터와 보낼 데이터의 이름을 지정) Product

사용해 ModelAndView 타입으로 리턴한다. (즉, 상품번호를 리턴함)


6. DAO 구현 클래스에서 sqlsession의 selectone( ) 메소드를 사용해서 sqlsession에 저장된 값 중 하나 (상품번호) 를 리턴한다.

   (단, namespace와 id를 맞게 입력을 해야 mapper과 매핑이 되니 주의)


7. mapper에서 select id에 namespace 이름을 적고, 조건을 설정해서 sql구문을 사용하기 위해

id에 인터페이스에서 구현한 product_id (상품번호)를 넣는다.




1. product_list 중 일부 (상품 상세보기를 하기 위해 상품이름에 링크를 거는 코드 추가)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <tr>
        <th>상품ID</th>
        <th>상품사진</th>
        <th>상품명</th>
        <th>가격</th>
    </tr>
    
<c:forEach var="row" items="${list }">
    <tr align = "center">
    <td>${row.product_id }</td>
    <td><img src="${path }/images/${row.picture_url}"
    width="100" height = "100"></td>
    
    <td>
    <a href = "${path }/shop/product/detail/${row.product_id}">
    ${row.product_name }</a> //끝에 상품 코드가 들어간다. 그리고 끝에 들어가는 상품 번호는
//URL에 포함된 변수이므로 @PathVariable로 저장이 된다.
    </td>
cs


이 URL을 컨트롤러로 받아서 처리


2. ProductController.java 중 일부 (url 매핑 처리 코드 추가)

1
2
3
4
5
6
7
8
9
10
11
12
13

//상세정보 페이지에서 URL이 매핑되서 실행

    @RequestMapping("/detail/{product_id}")

    public ModelAndView detail(

            //아까 product_list 페이지에서 보낸 id와, 
            @PathVariable("product_id") //URL에 포함된 변수이기 때문에 반드시 @PathVariable를 사용한다.

int product_id,
            ModelAndView mav) {

        //데이터를 보낼 뷰를 설정하고, 보낼 데이터를 동시에 설정하기 위해 ModelAndView를 사용
        //ModelAndView에 데이터를 보낼 뷰의 위치를 설정하고,
        //보낼 데이터를 설정하고, ModelAndView타입으로 리턴한다.

        mav.setViewName("/shop/product_detail");
        mav.addObject("dto", productService.detailProduct(product_id));

        return mav;
    }

cs



3. ProductServiceImpl.java (서비스 인터페이스 구현 클래스) 중 일부

1
2
3
4
@Override
    public ProductDTO detailProduct(int product_id) {
        return productDao.detailProduct(product_id); //상품아이디를 매개변수로 받아서 Dao에 있는 상품의 정보를 리턴
    }

cs



4. ProductDAOImpl.java (DAO 인터페이스 구현 클래스) 중 일부

1
2
3
4
5
6
7
@Override
    public ProductDTO detailProduct(int product_id) { 
        return sqlSession.selectOne(//sqlsession에 저장된 값중에 하나를 리턴한다 (상품번호)
                "product.detail_product",product_id);
        //앞쪽에 namespace와 뒤쪽에 id를 적는다. 이렇게 해야 Mapper와 매핑이 된다.
    }
 
cs



  1. selectOne : 쿼리 결과가 없으면 null을 반환한다.

         쿼리 결과로 레코드가 하나만 나와야 한다.

         DB에 레코드가 하나만 있는 경우에 사용 => 다수의 레코드가 있을 시 TooManyResultsException 에러가 발생


  2. selectList : 쿼리 결과를 List<E>로 반환한다.

                   결과가 없을 시에는 빈 List를 반환한다 (null을 반환한다,)




5. productMapper.xml 중 일부 


하나의 데이터가 DTO에 저장이 되서 계속 넘어가는 구조

1
2
3
4
5
    
<select id = "detail_product" resultType = "com.example.spring02.model.shop.dto.ProductDTO" >

    <!-- 상품 상세정보 확인 id -->

    select * from product
    where product_id=#{product_id} //select id에 namespace 이름을 적고, 조건을 설정해서 sql구문을 사용하기 위해
    </select> //id에 인터페이스에서 구현한 product_id (상품번호)를 넣는다.
cs



6. product_detail.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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
 
<%@include file="../include/header.jsp"%>
 
</head>
<body>
    <%@ include file="../include/menu.jsp"%>
    <h2>상품 정보</h2>
    <table>
        <tr>
            <!-- 이미지를 불러오기위한 url 작성 -->
            <td><img src="${path}/images/${dto.picture_url}" width="300px"
                height="300px"></td>
            <td align="center">
                <table>
 
                    <tr>
                        <td>상품명</td>
                        <td>${dto.product_name }</td>
                    </tr>
 
                    <tr>
                        <td>가격</td>
                        <td>${dto.price }</td>
                    </tr>
 
                    <tr>
                        <td>&nbsp;</td>
                        <td>${dto.description }</td>
                        <!-- 상품 설명을 가져옴 -->
                    </tr>
 
                    <tr>
                        <td colspan="2">
                            
* 장바구니에 담기 기능 *

<form name="form1" method="post"
action="${path }/shop/cart/insert.do">
                                <input type="hidden" name="product_id"
                                    value="${dto.product_id }">
                                <!-- 상품코드를 히든타입으로 넘김 -->
                                <select name="amount">
 
                                    <c:forEach begin="1" end="10" var="i">
                                        <option value="${i}">${i}</option>
                                        <!-- 장바구니에  10개 까지 담을수 있다.-->
                                    </c:forEach>
                                </select>&nbsp;개 <input type="submit" value="장바구니에 담기">
                                
                            </form> <a href="${path}/shop/product/list.do">상품목록</a>
                        </td>
                    </tr>
                </table>
    </table>
</body>
</html>
cs




728x90
반응형
: