mvcPage
WEB-INF
폴더의 shop.properties
하단에 다음의 내용을 추가/item/modifyForm.do=kr.item.action.AdminModifyFormAction
/item/modify.do=kr.item.action.AdminModifyAction
/item/delete.do=kr.item.action.AdminDeleteAction
# 상품 관리/사용자
/item/itemList.do=kr.item.action.ListAction
css
폴더의 layout.css
하단에 다음의 내용을 추가/* 상품 */
.item-space .horizontal-area {
margin: 2px;
padding: 3px;
width: 200px;
height: 220px;
float: left;
overflow: hidden;
text-align: center;
}
.item-space .horizontal-area img {
width: 195px;
height: 175px;
}
.item-space .horizontal-area span {
padding: 5px;
margin: 5px;
}
.item-space .float-clear {
clear: both;
}
label[for="order_quantity"] {
width: 80px;
}
.item-image {
width: 450px;
margin: 0 0 10px 0;
float: left;
}
.item-detail li {
padding: 0 0 5px 0;
}
.item-detail form {
border: none;
}
#item_total_txt {
color: #000;
font-weight: bold;
}
.quantity-width {
width: 40px;
margin-bottom: 3px;
}
.sold-out {
color: red;
}
AdminModifyFormAction
생성package kr.item.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import kr.controller.Action;
import kr.item.dao.ItemDAO;
import kr.item.vo.ItemVO;
public class AdminModifyFormAction 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!=3) { // 관리자로 로그인하지 않은 경우
return "/WEB-INF/views/common/notice.jsp";
}
int item_num = Integer.parseInt(request.getParameter("item_num"));
ItemDAO dao = ItemDAO.getInstance();
ItemVO item = dao.getItem(item_num);
request.setAttribute("item", item);
// JSP 경로 반환
return "/WEB-INF/views/item/admin_modifyForm.jsp";
}
}
AdminModifyAction
생성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 AdminModifyAction 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!=3) { // 관리자로 로그인하지 않은 경우
return "/WEB-INF/views/common/notice.jsp";
}
// 관리자로 로그인한 경우
MultipartRequest multi = FileUtil.createFile(request);
int item_num = Integer.parseInt(multi.getParameter("item_num"));
String photo1 = multi.getFilesystemName("photo1");
String photo2 = multi.getFilesystemName("photo2");
ItemDAO dao = ItemDAO.getInstance();
ItemVO db_item = dao.getItem(item_num);
// 전송된 정보를 자바빈에 저장
ItemVO item = new ItemVO();
item.setItem_num(item_num);
item.setName(multi.getParameter("name"));
item.setPrice(Integer.parseInt(multi.getParameter("price")));
item.setQuantity(Integer.parseInt(multi.getParameter("quantity")));
item.setDetail(multi.getParameter("detail"));
item.setPhoto1(photo1);
item.setPhoto2(photo2);
item.setStatus(Integer.parseInt(multi.getParameter("status")));
// 상품 수정
dao.updateItem(item);
// 전송된 이미지가 있을 경우 예전 이미지 삭제
if(photo1!=null) FileUtil.removeFile(request, db_item.getPhoto1());
if(photo2!=null) FileUtil.removeFile(request, db_item.getPhoto2());
// JSP 경로 반환
return "redirect:/item/list.do";
}
}
AdminDeleteAction
생성package kr.item.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import kr.controller.Action;
import kr.item.dao.ItemDAO;
import kr.item.vo.ItemVO;
import kr.util.FileUtil;
public class AdminDeleteAction 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!=3) { // 관리자로 로그인하지 않은 경우
return "/WEB-INF/views/common/notice.jsp";
}
// 관리자로 로그인한 경우
int item_num = Integer.parseInt(request.getParameter("item_num"));
ItemDAO dao = ItemDAO.getInstance();
ItemVO db_item = dao.getItem(item_num);
// 상품 삭제
dao.deleteItem(item_num);
// 상품 이미지 삭제
FileUtil.removeFile(request, db_item.getPhoto1());
FileUtil.removeFile(request, db_item.getPhoto2());
// JSP 경로 반환
return "redirect:/item/list.do";
}
}
ListAction
생성package kr.item.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.controller.Action;
import kr.item.dao.ItemDAO;
import kr.item.vo.ItemVO;
import kr.util.PagingUtil;
public class ListAction implements Action {
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
String pageNum = request.getParameter("pageNum");
if(pageNum==null) pageNum = "1";
String keyfield = request.getParameter("keyfield");
String keyword = request.getParameter("keyword");
ItemDAO dao = ItemDAO.getInstance();
// status가 표시(2)인 상품만 호출
int count = dao.getItemCount(keyfield, keyword, 1);
// 페이지 처리
PagingUtil page = new PagingUtil(keyfield, keyword, Integer.parseInt(pageNum), count, 24, 10, "itemList.do");
List<ItemVO> list = null;
if(count>0) {
// status가 표시(2)인 상품만 호출
list = dao.getListItem(page.getStartCount(), page.getEndCount(), keyfield, keyword, 1);
}
request.setAttribute("count", count);
request.setAttribute("list", list);
request.setAttribute("pagingHtml", page.getPagingHtml());
// JSP 경로 반환
return "/WEB-INF/views/item/user_list.jsp";
}
}
kr.main.action
패키지의 MainAction
을 다음처럼 수정package kr.main.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.controller.Action;
import kr.item.dao.ItemDAO;
import kr.item.vo.ItemVO;
public class MainAction implements Action {
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 상품 정보 읽기
ItemDAO dao = ItemDAO.getInstance();
// status가 표시(2)인 상품만 호출
List<ItemVO> itemList = dao.getListItem(1, 8, null, null, 1);
request.setAttribute("itemList", itemList);
// JSP 경로 반환
return "/WEB-INF/views/main/main.jsp";
}
}
item
폴더에 새 JSP 파일 admin_modifyForm.jsp
생성<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 수정</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/layout.css">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
$(function() {
$('#modify_form').submit(function() {
let isValid = true; // submit()의 return 값 지정
$('li').each(function() {
let input = $(this).find('input[type!="button"],textarea');
if(!input.val().trim() && input.attr('type')!='file') {
let word = $(this).find('label').text();
let last = word.charCodeAt(word.length-1);
let post = (last - '가'.charCodeAt(0)) % 28 > 0 ? '을' : '를';
alert(word + post + ' 입력하세요!');
input.val('').focus();
isValid = false; // submit()의 return 값 지정
return false; // each() 루프 중단
}
}); // end of each
return isValid;
}); // end of submit
});
</script>
</head>
<body>
<div class="page-main">
<jsp:include page="/WEB-INF/views/common/header.jsp"/>
<h2>상품 수정</h2>
<form action="modify.do" method="post" enctype="multipart/form-data" id="modify_form">
<input type="hidden" name="item_num" value="${item.item_num}">
<ul>
<li>
<label>상품 표시 여부</label>
<input type="radio" name="status" value="1" id="status1" <c:if test="${item.status==1}">checked</c:if>>미표시
<input type="radio" name="status" value="2" id="status2" <c:if test="${item.status==2}">checked</c:if>>표시
</li>
<li>
<label for="name">상품명</label>
<input type="text" name="name" id="name" maxlength="10" value="${item.name}">
</li>
<li>
<label for="price">가격</label>
<input type="number" name="price" id="price" min="0" max="99999999" value="${item.price}">
</li>
<li>
<label for="quantity">수량</label>
<input type="number" name="quantity" id="quantity" min="1" max="99999999" value="${item.quantity}">
</li>
<li>
<label for="photo1">상품 사진1</label>
<input type="file" name="photo1" id="photo1" accept="image/jpeg,image/gif,image/png">
<br><span>
(${item.photo1}) 파일이 등록되어 있습니다.
</span>
</li>
<li>
<label for="photo2">상품 사진2</label>
<input type="file" name="photo2" id="photo2" accept="image/jpeg,image/gif,image/png">
<br><span>
(${item.photo2}) 파일이 등록되어 있습니다.
</span>
</li>
<li>
<label for="detail">상품 설명</label>
<textarea rows="5" cols="30" name="detail" id="detail">${item.detail}</textarea>
</li>
</ul>
<div class="align-center">
<input type="submit" value="수정">
<input type="button" value="삭제" onclick="location.href = 'delete.do?item_num=${item.item_num}';">
<input type="button" value="목록으로" onclick="location.href = 'list.do';">
</div>
</form>
</div>
</body>
</html>
common
폴더의 header.jsp
에 다음의 내용을 추가 <a href="${pageContext.request.contextPath}/item/itemList.do">상품 목록</a>
item
폴더에 새 JSP 파일 user_list.jsp
생성<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 목록</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/layout.css">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
$(function() {
$('#search_form').submit(function() {
if($('#keyword').val().trim()=='') {
alert('검색어를 입력하세요!');
$('#keyword').val('').focus();
return false;
}
}); // end of submit
});
</script>
</head>
<body>
<div class="page-main">
<jsp:include page="/WEB-INF/views/common/header.jsp"/>
<h2>상품 목록</h2>
<form action="itemList.do" method="get" id="search_form">
<ul class="search">
<li>
<select name="keyfield">
<option value="1" <c:if test="${param.keyfield==1}">selected</c:if>>상품명</option>
<option value="2" <c:if test="${param.keyfield==2}">selected</c:if>>내용</option>
</select>
</li>
<li>
<input type="search" size="16" name="keyword" id="keyword">
</li>
<li>
<input type="submit" value="검색">
</li>
</ul>
</form>
<c:if test="${count==0}">
<div class="result-display">
표시할 상품이 없습니다.
</div>
</c:if>
<c:if test="${count>0}">
<div class="item-space">
<c:forEach var="item" items="${list}">
<div class="horizontal-area">
<a href="detail.do?item_num=${item.item_num}">
<img src="${pageContext.request.contextPath}/upload/${item.photo1}">
<span>${item.name}
<br>
<b><fmt:formatNumber value="${item.price}"/>원</b>
</span>
</a>
</div>
</c:forEach>
<div class="float-clear align-center">
${pagingHtml}
</div>
</div>
</c:if>
</div>
</body>
</html>
main
폴더의 main.jsp
를 다음처럼 수정<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/layout.css">
</head>
<body>
<div class="page-main">
<jsp:include page="/WEB-INF/views/common/header.jsp"/>
<div>
<h3>신규 상품</h3>
<div class="item-space">
<c:forEach var="item" items="${itemList}">
<div class="horizontal-area">
<a href="${pageContext.request.contextPath}/item/detail.do?item_num=${item.item_num}">
<img src="${pageContext.request.contextPath}/upload/${item.photo1}">
<span>${item.name}
<br>
<b><fmt:formatNumber value="${item.price}"/>원</b>
</span>
</a>
</div>
</c:forEach>
<div class="float-clear">
<hr width="100%" size="1" noshade>
</div>
</div>
</div>
</div>
</body>
</html>