본문 바로가기
학원

쇼핑몰1 (메뉴구성,dao/vo,관리자메뉴-상품등록,notice)

by 쿠룽지 2023. 12. 13.
728x90
반응형

 

기존 프로젝트에 추가해서 생성

 

 

table.sql

--상품
create table zitem(
 item_num number not null,
 name varchar2(30) not null,
 price number(8) not null,
 quantity number(5) not null,
 photo1 varchar2(60) not null,
 photo2 varchar2(60) not null,
 detail clob not null,
 reg_date date default sysdate not null,
 modify_date date,
 status number(1) not null, --표시여부(판매가능여부)
 constraint zitem_pk primary key (item_num)
);
create sequence zitem_seq;

--카트(장바구니)
create table zcart(
 cart_num number not null,
 item_num number not null,
 order_quantity number(5) not null,
 reg_date date default sysdate not null,
 mem_num number not null,
 constraint zcart_pk primary key (cart_num),
 constraint zcart_item_fk1 foreign key (item_num) references zitem (item_num),
 constraint zcart_item_fk2 foreign key (mem_num) references zmember (mem_num)
);
create sequence zcart_seq;

--주문
create table zorder(
 order_num number not null,
 item_name varchar2(600) not null, -- 대표 상품명
 order_total number(9) not null,
 payment number(1) not null, -- 결제 방식
 status number(1) default 1 not null, -- 배송 상태
 receive_name varchar2(30) not null,
 receive_post varchar2(5) not null,
 receive_address1 varchar2(90) not null,
 receive_address2 varchar2(90) not null,
 receive_phone varchar2(15) not null,
 notice varchar2(4000),
 reg_date date default sysdate not null,
 modify_date date,
 mem_num number not null,
 constraint zorder_pk primary key (order_num),
 constraint zorder_fk1 foreign key (mem_num) references zmember (mem_num)
);
create sequence zorder_seq;

--상품을 여러개 만들거라서 detail 테이블 따로 만듦
create table zorder_detail(
 detail_num number not null,
 item_num number not null,
 item_name varchar2(30) not null,
 item_price number(8) not null,
 item_total number(8) not null,
 order_quantity number(7) not null,
 order_num number not null,
 constraint zorder_detail_pk primary key (detail_num),
 constraint zorder_detail_fk1 foreign key (order_num) references zorder (order_num)
);
create sequence zorder_detail_seq;

 

 

 


 

 

 

메뉴 구성

common

header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- header 시작 -->
<div id="main_logo">
	<h1 class="align-center"><a href="${pageContext.request.contextPath}/main/main.do">회원제 게시판</a></h1>
</div>
<div id="main_nav">
	<ul>
    	<li>
        	<a href="${pageContext.request.contextPath}/board/list.do">게시판</a>
        </li>
		<li>
        	<a href="${pageContext.request.contextPath}/item/itemList.do">상품목록</a>
        </li>
        
        <%-- 관리자로만 로그인해야 보여지는 header 시작 --%>
        <c:if test="${!empty user_num && user_auth==9}">
        	<li>
            	<a href="${pageContext.request.contextPath}/member/adminList.do">회원관리</a>
        	</li>
            <li>
            	<a href="${pageContext.request.contextPath}/item/adminList.do">상품관리</a>
        	</li>
        </c:if>
        <%-- 관리자로만 로그인해야 보여지는 header 끝 --%>
        
        <c:if test="${!empty user_num}">
        	<li><a href="${pageContext.request.contextPath}/cart/list.do">장바구니</a></li>
            <li><a href="${pageContext.request.contextPath}/member/myPage.do">MY페이지</a></li>
        </c:if>
        
        <c:if test="${!empty user_num && !empty user_photo}">
        	<li class="menu-profile"><img src="${pageContext.request.contextPath}/upload/${user_photo}" width="25" height="25" class="my-photo"></li>
        </c:if>
        <c:if test="${!empty user_num && empty user_photo}"> <%-- 사진이 없을 때 기본 프로필 --%>
        	<li class="menu-profile"><img src="${pageContext.request.contextPath}/images/face.png" width="25" height="25" class="my-photo"></li>
        </c:if>
        
        <%-- 로그인 되어있을 때 --%>
        <c:if test="${!empty user_num}"> 
			<li class="menu-logout">
				[<span>${user_id}</span>]
				<a href="${pageContext.request.contextPath}/member/logout.do">로그아웃</a>
			</li>
		</c:if>
        
        <c:if test="${empty user_num}">
			<li><a href="${pageContext.request.contextPath}/member/registerUserForm.do">회원가입</a></li>
			<li><a href="${pageContext.request.contextPath}/member/loginForm.do">로그인</a></li>
		</c:if>
    </ul>
</div>
<!-- header 끝 -->

 

 

 


 

 

src/main/java

kr.item.vo

ItemVO

 

package kr.item.vo;

import java.sql.Date;

public class ItemVO {
	private int item_num;		//상품 번호
	private String name;		//상품명
	private int price;		//가격
	private int quantity; 		//수량
	private String photo1;		//상품사진1
	private String photo2;		//상품사진2
	private String detail;		//내용
	private Date reg_date;		//등록일
	private Date modify_date;	//수정일
	private int status;		//1미표시,2표시 (상품 판매 가능 여부)
	
	public int getItem_num() {
		return item_num;
	}
	public void setItem_num(int item_num) {
		this.item_num = item_num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public int getQuantity() {
		return quantity;
	}
	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}
	public String getPhoto1() {
		return photo1;
	}
	public void setPhoto1(String photo1) {
		this.photo1 = photo1;
	}
	public String getPhoto2() {
		return photo2;
	}
	public void setPhoto2(String photo2) {
		this.photo2 = photo2;
	}
	public String getDetail() {
		return detail;
	}
	public void setDetail(String detail) {
		this.detail = detail;
	}
	public Date getReg_date() {
		return reg_date;
	}
	public void setReg_date(Date reg_date) {
		this.reg_date = reg_date;
	}
	public Date getModify_date() {
		return modify_date;
	}
	public void setModify_date(Date modify_date) {
		this.modify_date = modify_date;
	}
	public int getStatus() {
		return status;
	}
	public void setStatus(int status) {
		this.status = status;
	}
}

 

 

 

 

 

kr.item.dao

ItemDAO

package kr.item.dao;

public class ItemDAO {
	//싱글턴 패턴
	private static ItemDAO instance = new ItemDAO();
	
	public static ItemDAO getInstance() {
		return instance;
	}
	
	private ItemDAO() {}
	
	
	//관리자 - 상품 등록
	//관리자 - 상품 수정
	//관리자 - 상품 삭제
	//관리자/사용자 - 전체 상품 개수/검색 상품 개수
	//관리자/사용자 - 전체 상품 목록/검색 상품 목록
	//관리자/사용자 - 상품 상세
	
}

 

 

 


 

 

 

모델클래스 - 관리자 메뉴 접속

kr.item.action

AdminListAction

 

package kr.item.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import kr.controller.Action;

public class AdminListAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpSession session = request.getSession();
		Integer user_num = (Integer)session.getAttribute("user_num");
		
		if(user_num == null) { //로그인이 되지 않은 경우
			return "redirect:/member/loginForm.do";
		}
		
		Integer user_auth = (Integer)session.getAttribute("user_auth");
		if(user_auth != 9) { //관리자로 로그인하지 않은 경우
			return "/WEB-INF/views/common/notice.jsp";
		}
		
		//JSP 경로 반환
		return "/WEB-INF/views/item/admin_list.jsp";
	}

}

 

 

 


 

 

관리자 상품관리 메뉴 - 등록

views

item(folder)

admin_list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 관리</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css">
</head>
<body>
<div class="page-main">
	<jsp:include page="/WEB-INF/views/common/header.jsp"/>
	<div class="content_main">
		<h2>상품 관리</h2>
		<div class="list-space align-right">
			<input type="button" value="상품등록" onclick="location.href='adminWriteForm.do'">
		</div>
	</div>
</div>
</body>
</html>

 

 

 


 

 

 

쇼핑몰은 상품이랑 주문 합쳐서 properties 생성

 

 

web.xml에 shop.properties 추가

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>ch08-mvcPage</display-name>
  <!-- 서블릿 주소 매핑 시작 -->
  <servlet>
  	<servlet-name>DispatcherServlet</servlet-name>
  	<servlet-class>kr.controller.DispatcherServlet</servlet-class>
  	<init-param>
  		<param-name>propertiesPath</param-name>
  		<param-value>/WEB-INF/member.properties,/WEB-INF/board.properties,/WEB-INF/shop.properties</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>DispatcherServlet</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <!-- 서블릿 주소 매핑 끝 -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
</web-app>

 

<param-value>/WEB-INF/member.properties,/WEB-INF/board.properties,/WEB-INF/shop.properties</param-value>

추가

 

 

 

 

shop.properties

#상품관리 관리자
/item/adminList.do=kr.item.action.AdminListAction

 

 

 

 

restart >

AdminListAction이 동작하면서 admin_list.jsp 가 보임


 

 

 

상품 등록하기

kr.item.action

AdminWriteFormAction

 

 

package kr.item.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import kr.controller.Action;

public class AdminWriteFormAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpSession session = request.getSession();
		Integer user_num = (Integer)session.getAttribute("user_num");
		if(user_num == null) {//로그인이 되지 않은 경우
			return "redirect:/member/loginForm.do";
		}
		
		Integer user_auth = (Integer)session.getAttribute("user_auth");
		if(user_auth != 9) {//관리자로 로그인하지 않은 경우
			return "/WEB-INF/views/common/notice.jsp";
		}
		
		return "/WEB-INF/views/item/admin_writeForm.jsp";
	}

}

 

 

 


 

 

상품 등록 폼

views

item

admin_writeForm.jsp

(radio(상품표시여부), 빈 항목 필수 입력 넣음)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 등록</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
$(function(){
	$('#write_form').submit(function(){
		if($('input[type=radio]:checked').length < 1){//배열 형태로 인식
			alert('상품표시여부를 지정하세요!');
			return false;
		}
		
		let items = document.querySelectorAll('.input-check');
		for(let i=0; i<items.length; i++){
			if(items[i].value.trim()==''){
				let label = document.querySelector('label[for="'+items[i].id+'"]')
				alert(label.textContent + ' 항목은 필수 입력');
				items[i].value = '';
				items[i].focus();
				return false;
			}
		}
	});
});
</script>
</head>
<body>
<div class="page-main">
	<jsp:include page="/WEB-INF/views/common/header.jsp"/>
	<div class="content-main">
		<h2>상품 등록</h2>
		<form action="adminWrite.do" method="post" enctype="multipart/form-data" id="write_form">
			<ul>
				<li>
					<label>상품표시여부</label>
					<input type="radio" name="status" value="1" id="status1">미표시
					<input type="radio" name="status" value="2" id="status2">표시                       
				</li>
				<li>	
					<label for="name">상품명</label>
					<input type="text" name="name" id="name" class="input-check" maxlength="10">
				</li>
				<li>	
					<label for="price">가격</label>
					<input type="number" name="price" id="price" class="input-check" min="1" max="99999999">
				</li>
				<li>	
					<label for="quantity">수량</label>
					<input type="number" name="quantity" id="quantity" class="input-check" min="0" max="99999">
				</li>
				<li>	
					<label for="photo1">상품사진1</label>
					<input type="file" name="photo1" id="photo1" class="input-check" accept="image/gif,image/png,image/jpeg">
				</li>
				<li>	
					<label for="photo2">상품사진2</label>
					<input type="file" name="photo2" id="photo2" class="input-check" accept="image/gif,image/png,image/jpeg">
				</li>
				<li>
					<label for="detail">상품설명</label>
					<textarea name="detail" id="detail" class="input-check" cols="30" rows="5"></textarea>
				</li>
			</ul>       
		    <div class="align-center">
		    	<input type="submit" value="등록">
		    	<input type="button" value="목록" onclick="location.href='adminList.do'">
		    </div>
		</form>
	</div>
</div>
</body>
</html>

 

 

 


 

 

 

shop.properties

#상품관리 관리자
/item/adminList.do=kr.item.action.AdminListAction
/item/adminWriteForm.do=kr.item.action.AdminWriteFormAction

 

 


 

 

 

상품등록 dao

ItemDAO

 

package kr.item.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import kr.item.vo.ItemVO;
import kr.util.DBUtil;

public class ItemDAO {
	//싱글턴 패턴
	private static ItemDAO instance = new ItemDAO();
	
	public static ItemDAO getInstance() {
		return instance;
	}
	
	private ItemDAO() {}
    
	//관리자 - 상품 등록
    public void insertItem(ItemVO item)throws Exception{
    	Connection conn = null;
        PreparedStatement pstmt = null;
        String sql = null;
        
        try{
        	conn = DBUtil.getConnection();
            sql = "INSERT INTO zitem (item_num,name,price,quantity,photo1,photo2,
            							detail,status) VALUES (
                                        zitem_seq.nextval,?,?,?,?,?,?,?)"
                                        
			pstmt = conn.preparedStatement(sql);
            pstmt.setString(1, item.getName());
			pstmt.setInt(2, item.getPrice());
			pstmt.setInt(3, item.getQuantity());
			pstmt.setString(4, item.getPhoto1());
			pstmt.setString(5, item.getPhoto2());
			pstmt.setString(6, item.getDetail());
			pstmt.setInt(7, item.getStatus());
            
            pstmt.executeUpdate();            
        }catch(Exception e){
        	throw new Exception(e);
        }finally{
        	DBUtil.executeClose(null, pstmt, conn);
        }
    }

 

관리자만 상품을 등록하기 때문에 회원번호가 없어도 됨

 

 


 

 

모델클래스

kr.item.action

AdminWriteAction

 

package kr.item.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.oreilly.servlet.MultipartRequest;

import kr.controller.Action;
import kr.item.dao.ItemDAO;
import kr.item.vo.ItemVO;
import kr.util.FileUtil;

public class AdminWriteAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpSession session = request.getSession();
		Integer user_num = (Integer)session.getAttribute("user_num");
		if(user_num == null) {//로그인이 되지 않은 경우
			return "redirect:/member/loginForm.do";
		}
		
		Integer user_auth = (Integer)session.getAttribute("user_auth");
		if(user_auth != 9) {//관리자로 로그인하지 않은 경우
			return "/WEB-INF/views/common/notice.jsp";
		}
		
		//관리자로 로그인한 경우
		MultipartRequest multi = FileUtil.createFile(request);
		//자바빈(VO) 생성
		ItemVO item = new ItemVO();
		item.setName(multi.getParameter("name"));
		item.setPrice(Integer.parseInt(multi.getParameter("price")));
		item.setQuantity(Integer.parseInt(multi.getParameter("quantity")));
		item.setPhoto1(multi.getFilesystemName("photo1"));
		item.setPhoto2(multi.getFilesystemName("photo2"));
		item.setDetail(multi.getParameter("detail"));
		item.setStatus(Integer.parseInt(multi.getParameter("status")));
		
		ItemDAO dao = ItemDAO.getInstance();
		dao.insertItem(item);
		
		//Refresh 정보를 응답 헤더에 추가
		response.addHeader("Refresh", "2;url=adminList.do");
		request.setAttribute("accessMsg", "성공적으로 등록되었습니다.");
		request.setAttribute("accessUrl", "adminList.do");
		
		return "/WEB-INF/views/common/notice.jsp";
	}

}

 

 

Refresh 화면 전환 방식 (script, button, redirect 이외 새로운 방법)
-> client로 전송하면 버튼을 누르지 않아도 화면 이동

 

 

 


 

 

 

위 모델클래스에서 notice로 refresh 정보를 보냈기 때문에 (accessMsg/Url)

기존 notice도 수정

 

common

notice.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>안내</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css">
</head>
<body>
<div class="page-main">
	<jsp:include page="/WEB-INF/views/common/header.jsp"/>
	<div class="result-display">
		<div class="align-center">
			<c:if test="${!empty accessMsg}">
				${accessMsg}
			</c:if>
			<c:if test="${empty accessMsg}">
				잘못된 접속입니다.
			</c:if>
			<p>
			<c:if test="${!empty accessUrl}">
				<input type="button" value="이동" onclick="location.href='${accessUrl}'"> <%-- 지정된 주소로 이동 --%>
			</c:if>
			<c:if test="${empty accessUrl}">
				<input type="button" value="홈으로" onclick="location.href='${pageContext.request.contextPath}/main/main.do'">
			</c:if>
		</div>
	</div>
</div>
</body>
</html>

 

 

 

 


 

 

shop.properties

#상품관리 관리자
/item/adminList.do=kr.item.action.AdminListAction
/item/adminWriteForm.do=kr.item.action.AdminWriteFormAction
/item/adminWrite.do=kr.item.action.AdminWriteAction

 

 

 

restart> AdminWriteAction 동작> admin_writeForm.jsp 에서 상품등록 시 adminList.do로 이동

 


 

 

 

 

 

 

 

728x90
반응형