상품관리 프로젝트 코드 작성 -2
상품관리 예제 코드 작성 순서
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 / adminLogin
pom.xml 수정할 부분 다시 체크하기
root-context.xml 에서 datasource bean부분
root-context.xml 에 mybatis mapper interface bean을 자동으로 검색하여 생성해주는 코드 추가
<mybatis-spring:xcan base-package="com.example.spring02.model.memo">
root-context.xml 에 sqlSession객체 빈으로 등록 ( DAO에서 사용 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <!-- SqlSessionFactory 객체 주입 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:/mybatis-config.xml"></property> <property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property> </bean> <!-- SqlSession 객체 주입 --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg> </bean> <!-- mybatis mapper 코드가 포함된 클래스를 찾아서 bean으로 등록하도록 설정해야함 --> <mybatis-spring:scan base-package="com.example.spring02test.model.memo" /> | cs |
ProductDTO / ProductDAO 작성
servlet-context에 등록한 스프링 내장객체인 MultipartFile클래스를 사용하여 DTO 객체에 파일도 포함시킬 수 있다.
ProductDTO.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 | package com.example.spring02test.model.shop.dto; import org.springframework.web.multipart.MultipartFile; public class ProductDTO { private int product_id; private String product_name; private int price; private String description; private String picture_url; private MultipartFile file1; 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 String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPicture_url() { return picture_url; } public void setPicture_url(String picture_url) { this.picture_url = picture_url; } public MultipartFile getFile1() { return file1; } public void setFile1(MultipartFile file1) { this.file1 = file1; } //하나의 상품 정보 전체를 문자열로 반환해주는 메서드로 오버라이딩 @Override public String toString() { return "ProductDTO [product_id=" + product_id + ", product_name=" + product_name + ", price=" + price + ", description=" + description + ", picture_url=" + picture_url + ", file1=" + file1 + "]"; } } |
ProductDAO.java ( 인터페이스 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package com.example.spring02test.model.shop.dao; import java.util.List; import com.example.spring02test.model.shop.dto.ProductDTO; public interface ProductDAO { List<ProductDTO> listProduct(); //상품 전체 목록 ProductDTO detailProduct(int product_id); //상품 상세 정보 void updateProduct(ProductDTO dto); //상품 상세 정보 수정 void deleteProduct(int product_id); //등록한 상품 삭제 void insertProduct(ProductDTO dto); //상품 등록 String fileInfo(int product_id); //파일의 정보 //파일 삭제할때 파일명 비교하기위해 파일명을 가져오는 메서드 } |
ProductDAOImpl.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 | package com.example.spring02test.model.shop.dao; import java.util.List; import javax.inject.Inject; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Repository; import com.example.spring02test.model.shop.dto.ProductDTO; @Repository public class ProductDAOImpl implements ProductDAO { //DAO니까 mybatis의 sqlSession을 주입받음 @Inject SqlSession sqlSession; @Override public List<ProductDTO> listProduct() { return sqlSession.selectList("product.list_product"); } ...생략 } |
sqlSession에 데이터 처리 떠넘김
sqlSession 설정에 매퍼파일 설정을 해놨으므로 매퍼에서 sql코드 확인
src/main/resources 하위에 mapper 패키지 생성후 productMapper.xml 작성
sqlSession.selectList("product.list_product")
product는 매퍼 파일에서 설정하는 namespace
list_product는 쿼리 설정 태그의 id
매퍼는 sample 매퍼 파일을 복사해와서 수정해서 쓴다.
sampleMapper.xml
1 2 3 4 5 6 7 8 9 | <?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="sample"> </mapper> |
productMapper.xml 일부
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?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="product"> //namespace <select id="list_product" //id resultType="com.example.spring02test.model.shop.dto.ProductDTO"> select * from product order by product_name </select> ...생략 </mapper> |
ProductService 작성
ProductService.java ( 인터페이스 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package com.example.spring02test.service.shop; import java.util.List; import com.example.spring02test.model.shop.dto.ProductDTO; public interface ProductService { //메서드는 DAO클래스와 동일 List<ProductDTO> listProduct(); ProductDTO detailProduct(int product_id); String fileInfo(int product_id); void updateProduct(ProductDTO dto); void deletePrduct(int product_id); void insertProduct(ProductDTO dto); } | cs |
ProductServiceImpl.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 | 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.ProductDAO; import com.example.spring02test.model.shop.dto.ProductDTO; @Service public class ProductServiceImpl implements ProductService { @Inject ProductDAO productDao; @Override public List<ProductDTO> listProduct() { return productDao.listProduct(); } @Override public ProductDTO detailProduct(int product_id) { return productDao.detailProduct(product_id); } @Override public String fileInfo(int product_id) { return productDao.fileInfo(product_id); } @Override public void updateProduct(ProductDTO dto) { productDao.updateProduct(dto); } @Override public void deletePrduct(int product_id) { productDao.deleteProduct(product_id); } @Override public void insertProduct(ProductDTO dto) { productDao.insertProduct(dto); } } |
ProductController 작성
컨트롤러에서 해야하는 일
1. URL매핑
2. service나 DAO에 데이터 처리 떠넘기고
3. view페이지로 포워딩
jsp로 처리된 데이터를 보내야하면
3-1) 리턴타입 String으로 설정 + model객체를 사용 + view로 포워딩
3-2) 리턴타입 ModelAndView로 설정 + ModelAndView(데이터Object와 view정보 담고있음) 리턴
ProductController.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 | package com.example.spring02test.controller.shop; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.example.spring02test.model.shop.dto.ProductDTO; import com.example.spring02test.service.shop.ProductServiceImpl; @Controller @RequestMapping("/shop/product/*") public class ProductController { @Inject ProductServiceImpl productServiceImpl; @RequestMapping("list.do") public ModelAndView list(ModelAndView mav){ //1. ModelAndView setViewName과 addObject 메서드 사용하여 데이터 담기 mav.setViewName("/shop/product_list"); //상품리스트 페이지로 mav.addObject("list", productServiceImpl.listProduct()); return mav; };//상품목록 //product_list.jsp>>> @RequestMapping("/detail/{product_id}") public ModelAndView detail( @PathVariable("product_id") int product_id, ModelAndView mav) { mav.setViewName("/shop/product_detail"); mav.addObject("dto", productServiceImpl.detailProduct(product_id)); return mav; }//상품 디테일 @RequestMapping("write.do") public String write() { return "shop/product_write"; }//데이터처리 없이 글쓰기 페이지로 포워딩 ...생략... | cs |
상품리스트 페이지 만들기
product_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 | <%@ 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(){ $("#btnAdd").click(function(){ loation.href="${path}/shop/product/write.do"; }); }); /* Add버튼을 누르면 write.do 실행하는 함수 */ </script> </head> <body> <%@ include file="../include/menu.jsp" %> <h2>상품 목록</h2> <button type="button" id="btnAdd"> 상품 등록 </button> <table border="1" width="500px"> <tr> <th> 상품ID</th> <th> </th> <th>상품명</th> <th>가격</th> </tr> <!--반복문 태그 c:forEach에서 list(ProductDTO)의 원소 변수 row 선언--> <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> </td> <td> <fmt:formatNumber value="${row.price}" pattern="#,###"/> </td> </tr> </c:forEach> </table> </body> </html> | cs |
*<th> : table head 기본값은 굵은 글씨, 가운데정렬
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 | <%@ 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" %> </head> <body> <%@ include file="../include/menu.jsp" %> <h2> 상품 정보 </h2> <table> <tr> <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> </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> </c:forEach> </select> <input type="submit" value="장바구니에 담기"> </form> <a href="${path}/shop.product/list.do">상품목록</a> </td> </tr> </table> </body> </html> | cs |
@PathVariable 예시
memo_list.jsp
1 2 3 4 5 6 | <script> function memo_view(idx){ location.href="${path}/memo/view/"+idx; } // 파라미터가 아니라 고유 주소로 넘어간다. //@PathVariable로 받을 수 있다. //?를 사용하면 같은 주소로 이동하여 ?이하는 파라미터로 넘어가고 고유 주소 </script> |
MemoController.java
1 2 3 4 5 6 7 8 | //http://localhost/spring02/memo/view/6 => @PathVariable @RequestMapping("view/{idx}") public ModelAndView view(@PathVariable int idx, ModelAndView mav) { mav.setViewName("memo/view"); //출력 페이지 지정 mav.addObject("dto",memoService.memo_view(idx)); //데이터 저장 return mav; //출력 페이지로 이동 } |
'Spring > study' 카테고리의 다른 글
spring 11강 itextpdf를 활용한 pdf 파일 만들기 (0) | 2019.06.26 |
---|---|
상품관리 프로젝트 코드 작성 -3 (0) | 2019.06.18 |
상품관리 프로젝트 코드 작성 -1 (0) | 2019.06.13 |
spring 7강 상품테이블 만들기, File Upload 테스트 (0) | 2019.06.11 |
spring 6강 Oracle과 mybatis 연동 실습(자바 코드에 SQL 명령어를 함께 작성하는 방식) (0) | 2019.06.06 |