보라코딩
Day71_230407_ JSP, MyBatis (Shop), 파일업로드 본문
Cart.java
package com.mystudy.shop;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
// 장바구니 역할 객체 생성용 클래스
public class Cart {
private List<ProductVO> list; //카트에 담긴 제품 목록
private int total; // 카트에 담긴 전체 품목의 가격 합계 금액
public Cart() {
list = new ArrayList<ProductVO>();
}
/* 장바구니 담기 요청 처리(카트에 제품 추가)
* list에 없으면 제품 추가
* list에 동일 제품 있으면 수량 1개 증가 처리
*/
public void addProduct(String pnum, ProductDAO dao) {
// 카트에 제품이 있는지 확인
ProductVO vo = findProduct(pnum);
// 카트에 없으면 추가, 있으면 수량 1개 증가 처리
if (vo == null) { //카트에 없음 : 제품을 카트에 등록
vo = dao.selectOne(pnum); //1. pnum DB조회해서 VO객체 생성
vo.setQuant(1); // 2. VO객체 수량 증가
list.add(vo); // 3. 카트에 제품 추가
total += vo.getSaleprice(); //4. 카트 합계금액 재계산(제품한개 가격 추가)
} else { //카트에 제품이 있음 -> 수량 증가처리 + total 재계산
vo.setQuant(vo.getQuant()+1); //수량 1증가 처리
// 카트합계금액 재계산 : 기존금액 + 제품1개 가격
total += vo.getSaleprice();
}
}
//카트에서 제품 삭제(꺼내기)
public void delProduct(String pnum) {
ProductVO vo = findProduct(pnum);
if(vo != null) { list.remove(vo); // 카드 합계금액에서 제품 금액 빼기
total = total - vo.getTotalPrice(); } }
// 카트에 있는 제품을 찾아서 전달받은 수량으로 변경
public void updateQuent(String pnum, int quant) {
ProductVO vo = findProduct(pnum);
if (vo == null) return;
// 1. 카트금액변경 : 기존금액(total) - 변경제품금액(totalPrice)
total = total - vo.getTotalPrice();
// 2. 제품수량변경
vo.setQuant(quant);
// 3. 카트금액변경 : 기존금액(total) + 변경제품금액(totalPrice)
total = total + vo.getTotalPrice();
}
//카트에 제품이 있는지 확인(있으면 ProductVO 리턴)
private ProductVO findProduct(String pnum) {
ProductVO vo = null;
Iterator<ProductVO> ite = list.iterator();
while(ite.hasNext()) {
ProductVO listVO = ite.next();
if(listVO.getPnum().equals(pnum)) {
vo = listVO;
break;
}
}
//(실습)개선된for문 형태로 작성
// for(ProductVO value : list) {
// if(value.getPnum().equals(pnum)) {
// vo = value;
// break;
// }
// }
return vo;
}
//setter 만들지 않고 getter만 만들었다!
public List<ProductVO> getList() {
return list;
}
public int getTotal() {
return total;
}
@Override
public String toString() {
return "Cart [list=" + list + ", total=" + total + "]";
}
}
addProduct.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 전달받은 제품번호(pnum)에 해당하는 제품을
장바구니(cart)에 담고 제품상세페이지로 이동(되돌아가기)
1. 장바구니 데이터를 다룰 객체 생성(카트 만들기)
2. 장바구니 제품추가 (전달받은 제품번호 사용)
3. 장바구니에 담은 후 제품상세페이지로 이동
--%>
<jsp:useBean id="cart" class="com.mystudy.shop.Cart" scope="session"/>
<jsp:useBean id="dao" class="com.mystudy.shop.ProductDAO"
scope="session"/>
<%
//전달받은 파라미터값 추출
String pnum = request.getParameter("pnum");
//장바구니(cart)에 제품 받기
cart.addProduct(pnum, dao);
System.out.println("> 카트 제품목록 : " + cart.getList());
System.out.println("> 카트 제품합계 : " + cart.getTotal());
//제품 상세 페이지로 이동
response.sendRedirect("product_content.jsp?pnum="+pnum);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>카트에 담기</title>
<script>
alert("카트에 잘 담았습니다\n$" + {cart.total});
history.back();
</script>
</head>
<body>
</body>
</html>
cartList.jsp
<%@page import="com.mystudy.shop.ProductVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 장바구니(cart)에 있는 제품목록을 화면에 표시 --%>
<jsp:useBean id="cart" class="com.mystudy.shop.Cart" scope="session"/>
<c:set var="list" value="${cart.getList()}"/>
<%
//장바구니에서 제품목록 꺼내기
// List<ProductVO> list = cart.getList(); //자바빈으로 가져와서 이렇게 안해도됨
// System.out.println("> cart list : " + list);
// System.out.println("> cart total : " + cart.getTotal());
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>장바구니(cart)보기</title>
<link href="css/menu.css" rel="stylesheet" type="text/css">
<link href="css/data_table.css" rel="stylesheet" type="text/css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href=" https://fonts.googleapis.com/css2?family=East+Sea+Dokdo&family=Gaegu:wght@700&family=Gowun+Batang:wght@700&display=swap " rel="stylesheet">
<style>
*{
font-family: 'East Sea Dokdo', cursive;
font-family: 'Gaegu', cursive;
font-family: 'Gowun Batang', serif;
}
tfoot {font-size : 1.5em; color : #0099a4;}
</style>
</head>
<body>
<%@ include file="common/menu.jspf" %>
<table>
<thead>
<tr>
<td colspan="6">:: 장바구니 내용</td>
</tr>
<tr>
<td>제품번호</td>
<td>제품명</td>
<td>제품단가</td>
<td>제품수량</td>
<td>제품금액</td>
<td>삭제</td>
</tr>
</thead>
<tbody>
<c:forEach var="vo" items="${list }">
<tr>
<td>${vo.pnum }</td>
<td>${vo.name }</td>
<td>정가 : ${vo.price } <span class="red"> 세일가격 : ${vo.saleprice }</span></td>
<td>
<form action="editQuant.jsp" method="get">
<input type="number" name="quant" value="${vo.quant }" style='width:30px;' >
<input type="submit" value="수정">
<input type="hidden" name="pnum" value="${vo.pnum}">
</form>
</td>
<td>${vo.totalPrice }</td>
<td><button onclick="delProduct('${vo.pnum}')">삭제</button></td>
</tr>
</c:forEach>
</tbody>
<tfoot>
<tr>
<td colspan="6">** 총 결재금액 : ${cart.getTotal() } 원 **</td>
</tr>
</tfoot>
</table>
<script>
function delProduct(pnum){
location.href = "delProduct.jsp?pnum=" + pnum;
}
</script>
</body>
</html>
editQuant.jsp
<%@page import="com.mystudy.shop.Cart"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 제품번호(pnum), 수량(quant) 전달받아
장바구니(cart) 데이터 수정 후 장바구니 보기 페이지(화면)으로 이동 --%>
<%
//1. 파라미터 값 확인(추출)
String pnum = request.getParameter("pnum");
int quant = Integer.parseInt(request.getParameter("quant"));
//2. 카트(cart)에서 제품수량 변경
Cart cart = (Cart)session.getAttribute("cart");
cart.updateQuant(pnum, quant);
//3. 화면전환(cartList.jsp)
response.sendRedirect("cartList.jsp");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
delProduct.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 전달받은 데이터(pnum)을 사용해서 장바구니(cart)에 삭제처리 후
장바구니(cart)에서 제외(삭제)하고 장바구니보기 페이지로 이동 --%>
<jsp:useBean id="cart" class="com.mystudy.shop.Cart" scope="session"/>
<%
//1. 전달받은 파라미터 값 확인(추출)
String pnum = request.getParameter("pnum");
//2. 장바구니(cart)에서 제외하기
cart.delProduct(pnum);
//3. 화면전환
response.sendRedirect("cartList.jsp");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
이번꺼 다소 어렵게 느껴졌다 ㅠ.ㅠ
복습!!!
파일업로드
Servlets.com | com.oreilly.servlet
servlets.com
ex01_fileup_cos.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일업로드</title>
</head>
<body>
<%-- 파일업로드 : cos.jar
0. 사용할 라이브러리 파일 cos.jar 빌드패스 등록
(WebContent > WEB-INF > lib > cos.jar)
1. form 태그 : method="post" 설정(POS 방식만 가능)
2. form 태그 : enctype="multipart/form-data" 설정
3. form input 태그 : <input type="file" ...>
--%>
<form action="ex01_result.jsp" method="post" enctype="multipart/form-data">
<p>올린사람 : <input type="text" name="name"></p>
<p>제목 : <input type="text" name="title"></p>
<p>파일 : <input type="file" name="filename"></p>
<input type="submit" value="파일업로드">
</form>
</body>
</html>
ex01_result.jsp
<%@page import="java.io.File"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 파일 업로드 처리 파일 정보 화면 표시 --%>
<%
//한글처리
request.setCharacterEncoding("UTF-8");
//(주의) form 태그에 enctype="multipart/form-data" 설정하면
// request 객체를 통한 파라미터 값 조회 안됨(MultipartRequest 사용할 것)
//String name = request.getParameter("name");
//System.out.println("> name : " + name); //null
//파일을 저장할 위치 지정
String path = "c:/upload";
//String path = this.getServletContext().getRealPath("/upload");
//System.out.println("> path : " + path);
MultipartRequest mr = new MultipartRequest(
request, //요청객체
path, //실제 파일을 저장할 경로(업로드 위치)
10 * 1024 * 1024, //업로드 파일의 최대크기 지정(byte 단위)
"UTF-8", //인코딩 형식
new DefaultFileRenamePolicy());
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일업로드결과</title>
</head>
<body>
<h1>파일업로드결과 보기</h1>
<h2>올린사람(name) : <%=mr.getParameter("name") %></h2>
<h2>제목(title) : <%=mr.getParameter("title") %></h2>
<h2>파일(filename) : <%=mr.getParameter("filename") %></h2>
<h2>원본파일명 : <%=mr.getOriginalFileName("filename") %></h2>
<h2>저장파일명 : <%=mr.getFilesystemName("filename") %></h2>
<h2>파일타입 : <%=mr.getContentType("filename") %></h2>
<%
File file = mr.getFile("filename");
out.println("<h2>" + file.getName() + "</h2>");
out.println("<h2>" + file.length() + "</h2>");
%>
<hr>
<h2>파일 다운로드</h2>
<a href="download.jsp?path=upload&filename=<%=mr.getFilesystemName("filename") %>">다운로드할 파일(<%=mr.getOriginalFileName("filename") %>)</a>
</body>
</html>
download.jsp
<%@page import="java.io.File"%>
<%@page import="java.io.BufferedOutputStream"%>
<%@page import="java.io.BufferedInputStream"%>
<%@page import="java.io.FileInputStream"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 전달받은 데이터 사용해서 파일 다운로드 처리 --%>
<%
//한글처리
request.setCharacterEncoding("UTF-8");
//전달받은 파라미터 값 확인(추출)
String path = request.getParameter("path"); // 저장된 폴더(디렉토리)명
String filename = request.getParameter("filename"); // 물리적으로 저장된 파일명
System.out.println("> path : " + path);
System.out.println("> filename : " + filename);
//실제 파일이 저장된 경로 확인
String realPath = this.getServletContext().getRealPath(path);
System.out.println("> realPath : " + realPath);
//다운로드 받을 수 있도록 클라이언트 응답 문서타입 변경
response.setContentType("application/x-msdownload");
//클라이언트 헤더정보를 첨부파일이 있는 것을 변경
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
//-------- 실제 파일 읽고 / 쓰기 작업 -----------
FileInputStream fis = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
File file = new File(realPath + "/" + filename);
if (!file.isFile()) return;
//파일 읽고 / 쓰기 처리
try {
// 파일 읽기 객체 생성
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
// 파일 쓰기 객체 생성
bos = new BufferedOutputStream(response.getOutputStream());
// 파일 읽고 쓰기
int readValue = bis.read();
while (readValue != -1) {
bos.write(readValue);
readValue = bis.read();
}
// JSP 출력스트림과 서블릿 출력스트림이
// 겹쳐서 발생하는 오류 해결
out.clear();
out = pageContext.pushBody();
} catch(Exception e) {
e.printStackTrace();
} finally {
bos.close();
bis.close();
}
%>
'코딩 > Servlet, JSP, MyBatis' 카테고리의 다른 글
Day73_230411_ JSP, MyBatis 게시판 (0) | 2023.04.11 |
---|---|
Day72_230410_ JSP, MyBatis 게시판 페이징처리 (0) | 2023.04.10 |
Day70_230406_ JSP, MyBatis 방명록, Shop (0) | 2023.04.06 |
Day69_230405_ JSP, MyBatis 방명록 (0) | 2023.04.05 |
Day68_230404_JSP, MyBatis 방명록 (0) | 2023.04.04 |