상품관리 프로젝트 코드 작성 -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 / adminLogin
상품관리 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 |
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> </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} " 에 포맷 패턴 적용
'Spring > study' 카테고리의 다른 글
spring 12강 Google Chart, JFree Chart (0) | 2019.06.26 |
---|---|
spring 11강 itextpdf를 활용한 pdf 파일 만들기 (0) | 2019.06.26 |
상품관리 프로젝트 코드 작성 -2 (0) | 2019.06.14 |
상품관리 프로젝트 코드 작성 -1 (0) | 2019.06.13 |
spring 7강 상품테이블 만들기, File Upload 테스트 (0) | 2019.06.11 |