이번에는 카테고리를 관리하는 기능을 만들것이다.
어떤 카테고리가 있는지 보여주는 categoryList와 카테고리 추가 , 삭제 기능을 만들것이다.
일단 카테고리 목록부터 구현할것이다.
categoryList.jsp
<%@page import="java.util.*"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>
<%
/* DB 연결 및 초기화 */
Class.forName("org.mariadb.jdbc.Driver");
Connection conn = null;
conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");
/* [DB]shop.category에서 category와 생성일 가져오는 쿼리 */
String getCategorySql = "SELECT category, emp_id empId, LEFT(create_date,16) createDate FROM category ORDER BY createDate DESC";
PreparedStatement getCategoryStmt = null;
ResultSet getCategoryRs = null;
getCategoryStmt = conn.prepareStatement(getCategorySql);
getCategoryRs = getCategoryStmt.executeQuery();
// 자료 구조 변경(ResultSet --> ArrayList<HashMap>)
ArrayList<HashMap<String, Object>> categoryList = new ArrayList<HashMap<String, Object>>();
while(getCategoryRs.next()) {
HashMap<String, Object> m = new HashMap<String, Object>();
m.put("category", getCategoryRs.getString("category"));
m.put("empId", getCategoryRs.getString("empId"));
m.put("createDate", getCategoryRs.getString("createDate"));
categoryList.add(m);
}
%>
<%
/* session의 정보 가져오기(grade별로 카테고리 삭제 권한 설정하기 위해) */
HashMap<String, Object> getSessionMap = (HashMap<String, Object>)(session.getAttribute("loginEmp"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>카테고리 목록</title>
<link href="/shop/css/w3.css" rel="stylesheet" type="text/css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="row">
<!-- 메인 메뉴 -->
<jsp:include page="/emp/inc/empMenu.jsp"></jsp:include>
<div class="col"></div>
<div class="col-5">
<!-- category 목록 출력 -->
<div class="w3-panel w3-border w3-round-small">
<div class="row" style="margin: 20px auto;">
<div class="col">
<h1>category 목록</h1>
</div>
<div class="col" style="text-align: right;">
<form action="/shop/emp/category/addCategoryForm.jsp">
<button type="submit" class="btn btn-outline-dark">카테고리 추가</button>
</form>
</div>
</div>
<table class="table table-hover" style="margin-bottom: 30px;">
<thead>
<tr>
<th>카테고리</th>
<th>생성한 사람</th>
<th>생성일</th>
<th>삭제</th>
</tr>
</thead>
<%
for(HashMap<String, Object> m : categoryList) {
%>
<tbody>
<tr>
<td><%=m.get("category") %></td>
<td><%=m.get("empId") %></td>
<td><%=m.get("createDate") %></td>
<td>
<form action="/shop/emp/category/deleteCategoryForm.jsp">
<input type="hidden" name="category" value="<%=m.get("category")%>">
<%
if((Integer)(getSessionMap.get("grade")) > 0) {
%>
<button type="submit" class="btn btn-danger btn-sm">삭제</button>
<%
} else {
%>
<button type="submit" class="btn btn-danger btn-sm" disabled="disabled">삭제</button>
<%
}
%>
</form>
</td>
</tr>
</tbody>
<%
}
%>
</table>
</div>
</div>
<div class="col"></div>
</div>
</body>
</html>
카테고리 목록은 카테고리명과 생성한 관리자, 카테고리 생성일만 보여주려고 했다.
그래서 DB에서 카테고리명과, 생성한 관리자, 생성일만 SELECT해서 가져왔다.
그 후 가져온 값들을 ResultSet에서 HashMap으로 바꿨다.
그 다음 페이지에 출력하면 끝이다!
그리고 카테고리 삭제같은 경우는 grade가 0이 아닌 경우에만 삭제를 할 수 있다.
카테고리 추가는 오른쪽 상단에 있다.
다음은 카테고리 추가먼저 하겠다.
addCategoryForm.jsp
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>카테고리 추가</title>
<link href="/shop/css/w3.css" rel="stylesheet" type="text/css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="row">
<!-- 메인 메뉴 -->
<jsp:include page="/emp/inc/empMenu.jsp"></jsp:include>
<div class="col"></div>
<div class="col-3">
<div class="w3-border w3-round" style="margin-top: 20px;">
<div class="w3-container w3-dark-grey" style="padding: 10px;">
<h1>카테고리 추가</h1>
</div>
<div class="w3-card-4" style="padding: 5%;">
<form class="w3-container" action="/shop/emp/category/addCategoryAction.jsp" method="post">
<label style="margin: 20px;">카테고리</label>
<div style="margin: 10px;">
<input class="w3-input" type="text" name="category" placeholder="카테고리를 입력해주세요">
</div>
<div style="text-align: center;">
<button class="w3-button w3-section w3-dark-grey w3-ripple" type="submit" style="width: 80%; margin: 20px;">
카테고리 추가
</button>
</div>
</form>
</div>
</div>
</div>
<div class="col"></div>
</div>
</body>
</html>
카테고리 폼 같은 경우는
그냥 카테고리 이름을 입력하고 추가 버튼을 누르면 끝이다
addCatogoryAction.jsp
<%@page import="java.util.*"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>
<!-- Session 설정 값 : 입력할 때 로그인한 emp의 emp_id값이 필요하기 때문! -->
<%
HashMap<String, Object> loginMember = (HashMap<String, Object>)(session.getAttribute("loginEmp"));
%>
<!-- Model Layer -->
<%
// 요청 값 분석
String category = request.getParameter("category");
// 요청 값이 null일시
if(category == null) {
response.sendRedirect("/shop/emp/category/addCategoryForm.jsp");
}
// 요청값 디버깅
System.out.println("addCategoryForm - category = " + category);
%>
<!-- Controller Layer -->
<%
/* DB 연결 및 초기화 */
Class.forName("org.mariadb.jdbc.Driver");
Connection conn = null;
conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");
/* [DB]shop.category에 category에 추가하는 sql */
String addCategorySql = "INSERT INTO category(category, emp_id) VALUES (?, ?)";
PreparedStatement addCategoryStmt = null;
addCategoryStmt = conn.prepareStatement(addCategorySql);
addCategoryStmt.setString(1, category);
addCategoryStmt.setString(2, (String)(loginMember.get("empId")));
int row = addCategoryStmt.executeUpdate();
if(row == 1) {
// 카테고리 등록 성공
System.out.println("카테고리 등록 성공");
response.sendRedirect("/shop/emp/category/categoryList.jsp");
} else {
// 카테고리 등록 실패
System.out.println("카테고리 등록 실패");
response.sendRedirect("/shop/emp/category/addCategoryForm.jsp");
}
%>
누가 등록했는지 알 수 있게 하기위해 loginEmp 세션 변수를 가져왔다.
폼에서 입력받은 카테고리를 요청값으로 가져왔다.
그 후 그냥 DB에 INSERT 쿼리를 날려주면 카테고리 추가는 끝이다.
다음은 카테고리 삭제이다
deleteCategoryForm.jsp
<%@page import="java.util.HashMap"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>
<!-- Model Layer -->
<%
// 요청 값
String category = request.getParameter("category");
// 요청 값 디버깅
System.out.println("deleteCategoryForm - category = " + category);
%>
<%
/* session의 정보 가져오기(grade별로 카테고리 삭제 권한 설정하기 위해) */
HashMap<String, Object> loginMember = (HashMap<String, Object>)(session.getAttribute("loginEmp"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>카테고리 삭제</title>
<link href="/shop/css/w3.css" rel="stylesheet" type="text/css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="row">
<!-- 메인 메뉴 -->
<jsp:include page="/emp/inc/empMenu.jsp"></jsp:include>
<div class="col"></div>
<div class="col-4">
<div class="w3-border w3-round" style="margin-top: 20px;">
<div class="w3-container w3-dark-grey" style="padding: 10px;">
<h1>카테고리 삭제</h1>
</div>
<div class="w3-card-4" style="padding: 5%;">
<form class="w3-container" action="/shop/emp/category/deleteCategoryAction.jsp" method="post">
<div>
<label>삭제하려는 카테고리는</label>
<input type="text" value="<%=category%>" name="category" readonly="readonly" style="text-align: center;">
<label>입니다.</label>
<br>
<label>
삭제할 경우 해당 카테고리의 <strong>모든 상품들이 삭제됩니다</strong>
<br>정말 삭제하시려면 id 와 pw를 입력해주세요.
</label>
</div>
<div style="margin-top: 20px;">
<label>id</label>
<input class="w3-input" type="text" name="empId" value="<%=loginMember.get("empId")%>" readonly="readonly">
</div>
<div>
<label>pw</label>
<input class="w3-input" type="password" name="empPw">
</div>
<div>
<button class="w3-button w3-section w3-block w3-dark-grey w3-ripple" type="submit">카테고리 삭제</button>
</div>
</form>
</div>
</div>
</div>
<div class="col"></div>
</div>
</body>
</html>
어떤 카테고리를 삭제하는지 알려주기 위해 category값을 요청값으로 받아왔다.
그리고 폼을 만들어 id, pw를 입력받도록 했다.
id는 로그인 하고있는 관리자의 id를 받아오기 위해 loginEmp세션 변수에서 가져왔다.
deleteCategoryAction.jsp
<%@page import="java.io.File"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>
<!-- Model Layer -->
<%
// 요청 값
String category = request.getParameter("category");
String empId = request.getParameter("empId");
String empPw = request.getParameter("empPw");
// 요청 값 디버깅
System.out.println("deleteCategoryAction - category = " + category);
System.out.println("deleteCategoryAction - empId = " + empId);
System.out.println("deleteCategoryAction - empPw = " + empPw);
%>
<%
/* session의 정보 가져오기(grade가 0이 아닐때 삭제 하기 위해) */
HashMap<String, Object> loginMember = (HashMap<String, Object>)(session.getAttribute("loginEmp"));
%>
<%
/* DB 연결 및 초기화 */
Class.forName("org.mariadb.jdbc.Driver");
Connection conn = null;
conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");
/* [DB]shop.emp에서 id와 pw가 일치하는지 확인하고, grade를 가져오는 쿼리 */
String checkEmpInfoSql = "SELECT emp_id empId FROM emp WHERE emp_id = ? AND emp_pw = PASSWORD(?)";
PreparedStatement checkEmpInfoStmt = null;
ResultSet checkEmpInfoRs = null;
checkEmpInfoStmt = conn.prepareStatement(checkEmpInfoSql);
checkEmpInfoStmt.setString(1, empId);
checkEmpInfoStmt.setString(2, empPw);
checkEmpInfoRs = checkEmpInfoStmt.executeQuery();
// id, pw가 일치한다면
if(checkEmpInfoRs.next()) {
// grade가 0이 아니면 삭제
System.out.println("deleteCategoryAction - grade = " + (int)(loginMember.get("grade")));
if((int)(loginMember.get("grade")) > 0) {
String deleteCategorySql = "DELETE FROM category WHERE category = ?";
PreparedStatement deleteCategoryStmt = null;
/* 카테고리와 연관된 상품들의 img 삭제하기 */
// 해당 카테고리의 상품들 가져오는 쿼리
String getGoodsOfCategorySql = "SELECT img_name imgName from goods WHERE category = ?";
PreparedStatement getGoodsOfCategoryStmt = null;
ResultSet getGoodsOfCategoryRs = null;
getGoodsOfCategoryStmt = conn.prepareStatement(getGoodsOfCategorySql);
getGoodsOfCategoryStmt.setString(1, category);
getGoodsOfCategoryRs = getGoodsOfCategoryStmt.executeQuery();
while(getGoodsOfCategoryRs.next()) {
// 삭제 쿼리
String deleteGoodsImgSql = "DELETE FROM goods WHERE img_name = ?";
PreparedStatement deleteGoodsImgStmt = null;
deleteGoodsImgStmt = conn.prepareStatement(deleteGoodsImgSql);
deleteGoodsImgStmt.setString(1, getGoodsOfCategoryRs.getString("imgName"));
String imgPath = request.getServletContext().getRealPath("upload");
System.out.println("deleteGoodsAction - imgPath = " + imgPath);
File deleteFile = new File(imgPath, getGoodsOfCategoryRs.getString("imgName"));
deleteFile.delete();
// getGoodsOfCategoryRs.beforeFirst();
}
deleteCategoryStmt = conn.prepareStatement(deleteCategorySql);
deleteCategoryStmt.setString(1, category);
// 삭제됐는지
int row = deleteCategoryStmt.executeUpdate();
System.out.println("deleteCategoryAction - row = " + row); // 삭제 됐는지 디버깅
response.sendRedirect("/shop/emp/category/categoryList.jsp");
} else {
System.out.println("grade 0 아님 ");
// grade가 0이 아님
response.sendRedirect("/shop/emp/category/deleteCategoryForm.jsp?category=" + category);
}
} else {
// id, pw 불일치
System.out.println("id, pw 불일치 ");
response.sendRedirect("/shop/emp/category/deleteCategoryForm.jsp?category=" + category);
}
%>
category, empId, empPw를 요청값으로 가져왔다.
DB에서 id, pw가 일치하는지 확인하고, 일치한다면 -> grade값을 확인하도록 했다.
grade 또한 0보다 클 경우에만 이제 DELETE쿼리를 날릴 수 있다.
그리고 DELETE쿼리로 카테고리를 삭제하기 전에 카테고리에 해당하는 상품들의 이미지들 또한 모두 지워주는 코드를 구현하면 완료이다!
아래에 카테고리가 삭제된 후 이미지를 첨부했다
'웹 개발 > 쇼핑몰 프로젝트(개인)' 카테고리의 다른 글
쇼핑몰 만들기(9)-고객 페이지(쇼핑몰 메인페이지, 회원가입) (1) | 2024.04.18 |
---|---|
쇼핑몰 만들기(8)-고객 페이지 (1) | 2024.04.18 |
쇼핑몰 만들기(6)-상품 관리(상품 수정, 삭제) (0) | 2024.04.15 |
쇼핑몰 만들기(5)-상품 관리 (1) | 2024.04.15 |
쇼핑몰 만들기(4)-관리자 상세보기, 부트스트랩 적용 (0) | 2024.04.11 |