# 파일 업로드 설정
file.upload.directory =/img
<<<<<<< HEAD
spring.servlet.multipart.max-file-size=128KB
spring.servlet.multipart.max-request-size=128KB
=======
spring.servlet.multipart.max-file-size=128KB
spring.servlet.multipart.max-request-size=128KB
>>>>>>> branch 'main' of https://github.com/gurehd1105/final.git
<jsp:include page="/inc/admin_header.jsp" />
<jsp:include page="/inc/admin_navbar.jsp" />
<jsp:include page="/inc/admin_sidebar.jsp" />
package com.example.gym.service;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import com.example.gym.controller.SportsEquipmentController;
import com.example.gym.mapper.SportsEquipmentMapper;
import com.example.gym.vo.SportsEquipment;
import com.example.gym.vo.SportsEquipmentImg;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
@Transactional
public class SportsEquipmentService {
@Autowired private SportsEquipmentMapper sportsEquipmentMapper;
public void insertSportsEquipmentService(HttpSession session,
String path,
String itemName,
int itemPrice,
MultipartFile[] sportsEquipmentImgList) {
//sportsEquipment 추가
SportsEquipment sportsEquipment = new SportsEquipment();
sportsEquipment.setEmployeeNo(1); //employee session 구현 후 수정
sportsEquipment.setItemName(itemName);
sportsEquipment.setItemPrice(itemPrice);
//mapper 호출
int row1 = sportsEquipmentMapper.insertSportsEquipment(sportsEquipment);
//sportsEquipment 정보 추가 실패했을 경우 -> 강제로 예외발생 트랜잭션 처리
if(row1 != 1) {
throw new RuntimeException();
}
//추가 된 sportsEquipment 디버깅
System.err.println(sportsEquipment + " <-- 추가 된 sportsEquipment");
log.info(sportsEquipment + " <-- 추가 된 sportsEquipment");
//sportsEquipmentImg 추가
for (MultipartFile equipmentImg : sportsEquipmentImgList) {
SportsEquipmentImg sportsEquipmentImg = new SportsEquipmentImg();
//portsEquipmentImgFileName
String fileName = UUID.randomUUID().toString();
//확장자
String originName = equipmentImg.getOriginalFilename();
String extensionName = originName.substring(originName.lastIndexOf("."));
sportsEquipmentImg.setSportsEquipmentNo(sportsEquipment.getSportsEquipmentNo());
sportsEquipmentImg.setSportsEquipmentImgSize((int)equipmentImg.getSize());
sportsEquipmentImg.setSportsEquipmentImgType(equipmentImg.getContentType());
sportsEquipmentImg.setSportsEquipmentImgOriginName(originName);
sportsEquipmentImg.setSportsEquipmentImgFileName(fileName+extensionName);
//mapper 호출
int row2 = sportsEquipmentMapper.insertSportsEquipmentImg(sportsEquipmentImg);
//sportsEquipmentImg 추가 실패했을 경우 -> 강제로 예외발생 트랜잭션 처리
if(row2 != 1) {
throw new RuntimeException();
}
File file = new File(path+"/"+fileName+extensionName);
try {
equipmentImg.transferTo(file);
} catch (IllegalStateException e) {
e.printStackTrace();
throw new RuntimeException();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
}
}
package com.example.gym.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import com.example.gym.service.SportsEquipmentService;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class SportsEquipmentController {
@Autowired SportsEquipmentService sportsEquipmentService;
@GetMapping("insertSportsEquipment")
public String insertSportsEquipment(HttpSession session) {
return "sportsEquipment/insertSportsEquipment";
}
@PostMapping("insertSportsEquipment")
public String insertSportsEquipment(HttpSession session,
@RequestParam String itemName,
@RequestParam int itemPrice,
@RequestParam("sportsEquipmentImg") MultipartFile[] sportsEquipmentImgList) {
String path = session.getServletContext().getRealPath("/upload/sportsEquipment");
sportsEquipmentService.insertSportsEquipmentService(session, path, itemName, itemPrice, sportsEquipmentImgList);
return "sportsequipment/sportsEquipmentList";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.gym.mapper.SportsEquipmentMapper">
<insert id="insertSportsEquipment" parameterType="com.example.gym.vo.SportsEquipment">
<selectKey order="AFTER" resultType="int" keyProperty="sportsEquipmentNo">
SELECT last_insert_id();<!-- 제일 마지막에 입력된 키값을 받아옴 -->
</selectKey>
INSERT INTO sports_equipment(
employee_no,
item_name,
item_price,
createdate,
updatedate
)VALUES(
#{employeeNo},
#{itemName},
#{itemPrice},
NOW(),
NOW()
)
</insert>
<insert id="insertSportsEquipmentImg" parameterType="com.example.gym.vo.SportsEquipmentImg">
INSERT INTO sports_equipment_img(
sports_equipment_no,
sports_equipment_img_origin_name,
sports_equipment_img_file_name,
sports_equipment_img_size,
sports_equipment_img_type,
createdate,
updatedate
) VALUES (
#{sportsEquipmentNo},
#{sportsEquipmentImgOriginName},
#{sportsEquipmentImgFileName},
#{sportsEquipmentImgSize},
#{sportsEquipmentImgType},
NOW(),
NOW()
)
</insert>
</mapper>
<%@ 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>Insert title here</title>
</head>
<body>
<form method="post" action="${pageContext.request.contextPath}/insertSportsEquipment" enctype="multipart/form-data">
<div>
이름 : <input type="text" name="itemName">
</div>
<div>
가격 : <input type="number" name="itemPrice">
</div>
<div>
이미지 : <input type="file" name="sportsEquipmentImg" multiple>
</div>
<div>
<button type="submit">입력</button>
</div>
</form>
</body>
</html>
#포트 설정
server.port=80
server.servlet.context-path=/finalP
# view 뷰 설정
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
# db 설정
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://3.35.1.127:3306/final
spring.datasource.username=root
spring.datasource.password=java1234
# multipart 허용
spring.servlet.multipart.enabled=true
# Multipart: 최대 파일 업로드 크기
spring.servlet.multipart.max-file-size=10MB
# Multipart: 동시 최대 요청 크기
spring.servlet.multipart.max-request-size=50MB
# Multipart: 파일 또는 매개 변수 액세스 시점에서 다중 파트 요청을 느리게 해결할지 여부
spring.servlet.multipart.resolve-lazily=false
# log 설정
# 디버깅 레벨
# fatal() > error() > warn() > info() > debug() > trace()
debug=true
logging.level.com.example.gym=debug
logging.level.com.example.gym.mapper=debug
logging.level.com.example.gym.rest=debug
logging.level.com.example.gym.controller=debug
logging.level.com.example.gym.service=debug
layout.admin=/gym/admin/darkpan-1.0.0
layout.user=/gym/user/gymlife-master
package com.example.gym.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SportsEquipment {
private int sportsEquipmentNo;
private int employeeNo;
private String itemName;
private String createdate;
private String updatedate;
private String equipmentActive;
private int itemPrice;
}
package com.example.gym.service;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import com.example.gym.mapper.SportsEquipmentMapper;
import com.example.gym.vo.SportsEquipment;
import com.example.gym.vo.SportsEquipmentImg;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
@Transactional
public class SportsEquipmentService {
@Autowired private SportsEquipmentMapper sportsEquipmentMapper;
public void insertSportsEquipmentService(HttpSession session,
String path,
String itemName,
int itemPrice,
MultipartFile[] sportsEquipmentImgList) {
//sportsEquipment 추가
SportsEquipment sportsEquipment = new SportsEquipment();
sportsEquipment.setEmployeeNo(1); //employee session 구현 후 수정
sportsEquipment.setItemName(itemName);
sportsEquipment.setItemPrice(itemPrice);
//mapper 호출
int row1 = sportsEquipmentMapper.insertSportsEquipment(sportsEquipment);
//sportsEquipment 정보 추가 실패했을 경우 -> 강제로 예외발생 트랜잭션 처리
if(row1 != 1) {
throw new RuntimeException();
}
//추가 된 sportsEquipment 디버깅
System.err.println(sportsEquipment + " <-- 추가 된 sportsEquipment");
log.info(sportsEquipment + " <-- 추가 된 sportsEquipment");
//sportsEquipmentImg 추가
for (MultipartFile equipmentImg : sportsEquipmentImgList) {
SportsEquipmentImg sportsEquipmentImg = new SportsEquipmentImg();
//portsEquipmentImgFileName
String fileName = UUID.randomUUID().toString();
//확장자
String originName = equipmentImg.getOriginalFilename();
String extensionName = originName.substring(originName.lastIndexOf("."));
sportsEquipmentImg.setSportsEquipmentNo(sportsEquipment.getSportsEquipmentNo());
sportsEquipmentImg.setSportsEquipmentImgSize((int)equipmentImg.getSize());
sportsEquipmentImg.setSportsEquipmentImgType(equipmentImg.getContentType());
sportsEquipmentImg.setSportsEquipmentImgOriginName(originName);
sportsEquipmentImg.setSportsEquipmentImgFileName(fileName+extensionName);
//mapper 호출
int row2 = sportsEquipmentMapper.insertSportsEquipmentImg(sportsEquipmentImg);
//sportsEquipmentImg 추가 실패했을 경우 -> 강제로 예외발생 트랜잭션 처리
if(row2 != 1) {
throw new RuntimeException();
}
File file = new File(path+"/"+fileName+extensionName);
try {
equipmentImg.transferTo(file);
} catch (IllegalStateException e) {
e.printStackTrace();
throw new RuntimeException();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
}
public Map<String,Object> selectSportsEquipmentByPageService(HttpSession session,
int currentPage,
String searchWord) {
//디버깅
log.info(searchWord);
log.info("Current page: {}", currentPage);
//페이징
int rowPerPage = 5; //한 페이지에 표시할 equipment 수
int beginRow = (currentPage - 1) * rowPerPage;
//mapper 호출
int sportsEquipmentCnt = sportsEquipmentMapper.selectSportsEquipmentCnt(searchWord);
int lastPage = sportsEquipmentCnt/rowPerPage;
if(sportsEquipmentCnt%rowPerPage != 0) {
lastPage = lastPage + 1;
}
//mapper의 매개변수로 들어갈 paramMap 생성
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("searchWord", searchWord);
paramMap.put("beginRow", beginRow);
paramMap.put("rowPerPage", rowPerPage);
//mapper 호출
List<Map<String,Object>> sportsEquipmentList = sportsEquipmentMapper.selectSportsEquipmentByPage(paramMap);
//controller에 보내줄 resultMap 생성
Map<String,Object> resultMap = new HashMap<>();
resultMap.put("lastPage", lastPage);
resultMap.put("sportsEquipmentList", sportsEquipmentList);
return resultMap;
}
}
package com.example.gym.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import com.example.gym.service.SportsEquipmentService;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class SportsEquipmentController {
@Autowired SportsEquipmentService sportsEquipmentService;
//SportsEquipment 추가 폼
@GetMapping("insertSportsEquipment")
public String insertSportsEquipment(HttpSession session) {
// //session 유효성 검사
// if(session.getAttribute("") == null) {
// return "";
// }
return "sportsEquipment/insertSportsEquipment";
}
//SportsEquipment 추가 액션
@PostMapping("insertSportsEquipment")
public String insertSportsEquipment(HttpSession session,
@RequestParam String itemName,
@RequestParam int itemPrice,
@RequestParam("sportsEquipmentImg") MultipartFile[] sportsEquipmentImgList) {
//파일업로드 경로 설정
String path = session.getServletContext().getRealPath("/upload/sportsEquipment");
//service 호출
sportsEquipmentService.insertSportsEquipmentService(session, path, itemName, itemPrice, sportsEquipmentImgList);
return "sportsEquipment/sportsEquipmentList";
}
@GetMapping("SportsEquipmentList")
public String selectSportsEquipmentList(HttpSession session,
Model model,
@RequestParam(defaultValue = "1") int currentPage,
@RequestParam(defaultValue = "") String searchWord) {
// //session 유효성 검사
// if(session.getAttribute("") == null) {
// return "";
// }
//service 호출
Map<String,Object> map = sportsEquipmentService.selectSportsEquipmentByPageService(session, currentPage, searchWord);
//jsp에서 출력할 model
model.addAttribute("sportsEquipmentList", map.get("sportsEquipmentList"));
model.addAttribute("lastPage", map.get("lastPage"));
return "sportsEquipment/sportsEquipmentList";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.gym.mapper.SportsEquipmentMapper">
<insert id="insertSportsEquipment" parameterType="com.example.gym.vo.SportsEquipment">
<selectKey order="AFTER" resultType="int" keyProperty="sportsEquipmentNo">
SELECT last_insert_id();<!-- 제일 마지막에 입력된 키값을 받아옴 -->
</selectKey>
INSERT INTO sports_equipment(
employee_no,
item_name,
item_price,
createdate,
updatedate
)VALUES(
#{employeeNo},
#{itemName},
#{itemPrice},
NOW(),
NOW()
)
</insert>
<insert id="insertSportsEquipmentImg" parameterType="com.example.gym.vo.SportsEquipmentImg">
INSERT INTO sports_equipment_img(
sports_equipment_no,
sports_equipment_img_origin_name,
sports_equipment_img_file_name,
sports_equipment_img_size,
sports_equipment_img_type,
createdate,
updatedate
) VALUES (
#{sportsEquipmentNo},
#{sportsEquipmentImgOriginName},
#{sportsEquipmentImgFileName},
#{sportsEquipmentImgSize},
#{sportsEquipmentImgType},
NOW(),
NOW()
)
</insert>
<select id="selectSportsEquipmentByPage" parameterType="java.util.Map" resultType="java.util.Map">
SELECT
sports_equipment_no sportsEquipmentNo,
employee_no employeeNo,
item_name itemName,
item_price itemPrice,
updatedate updatedate,
createdate createdate
FROM sports_equipment
<where>
<if test="searchWord != ''">
item_name LIKE CONCAT('%',#{searchWord},'%')
</if>
</where>
LIMIT #{beginRow},#{rowPerPage}
</select>
<select id="selectSportsEquipmentCnt" parameterType="String" resultType="int">
SELECT
COUNT(sports_equipment_no)
FROM sports_equipment
<where>
<if test="searchWord != ''">
item_name LIKE CONCAT('%',#{searchWord},'%')
</if>
</where>
</select>
</mapper>
12-27
쿼리수정 - 본사직원만 추가 가능하도록
- 추가&리스트 페이지 에서는 이미지를 하나만 보이도록 하도록 쿼리 수정
<%@ 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>Insert title here</title>
</head>
<body>
<div>
<h2>sportsEquipment Insert</h2>
</div>
<form method="post" action="${pageContext.request.contextPath}/insertSportsEquipment" enctype="multipart/form-data">
<div>
이름 : <input type="text" name="itemName">
</div>
<div>
가격 : <input type="number" name="itemPrice">
</div>
<div>
이미지 : <input type="file" name="sportsEquipmentImg" multiple>
</div>
<div>
<button type="submit">입력</button>
</div>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="title" value="장비리스트페이지" />
<c:set var="description" value="현재 발주 할 수 있는 장비의 리스트르 확인 할 수 있는 사이트" />
<c:set var="keywords" value="장비,소모품,발주,폐기" />
<c:set var="body">
<div>
<h2>sportsEquipment Insert</h2>
</div>
<form method="post" action="${pageContext.request.contextPath}/insertSportsEquipment" enctype="multipart/form-data">
<div>
이름 : <input type="text" name="itemName">
</div>
<div>
가격 : <input type="number" name="itemPrice">
</div>
<div>
이미지 : <input type="file" name="sportsEquipmentImg" multiple>
</div>
<div>
<button type="submit">입력</button>
</div>
</form>
</c:set>
<c:set var="script">
</c:set>
<%@ include file="/inc/admin_header.jsp"%>
<select id="selectSportsEquipmentByPage" parameterType="java.util.Map" resultType="java.util.Map">
SELECT
se.sports_equipment_no sportsEquipmentNo,
se.item_name itemName,
se.item_price itemPrice,
se.equipment_active equipmentActive,
(SELECT sei.sports_equipment_img_file_name
FROM sports_equipment_img sei
WHERE sei.sports_equipment_no = se.sports_equipment_no
LIMIT 1 <!-- 리스트에서는 img를 하나만 가지고 오기위한 서브쿼리 -->
) sportsEquipmentImgFileName
FROM sports_equipment se
<where>
<if test="searchWord != ''">
AND item_name LIKE CONCAT('%',#{searchWord},'%')
</if>
</where>
LIMIT #{beginRow}, #{rowPerPage}
</select>