기존 프로젝트에 추가해서 생성
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로 이동
'학원' 카테고리의 다른 글
2.13 (ElasticSearch-#Bulk,#Reindex) (0) | 2024.02.13 |
---|---|
2.8 (ElasticSearch, Kibana를 통해서 검색하기) (0) | 2024.02.08 |
학원 백업 (카메라/ 기본 이미지/ 로딩이미지) (0) | 2024.01.15 |
쇼핑몰2 (목록처리(대문페이지 display),상세페이지 ) (0) | 2023.12.13 |
11.17일 (model-1 employee-story/ model-2) (2) | 2023.11.18 |