2021. 3. 4. 16:55ㆍWeb_Back-end/Spring
2021/03/04 - [Web_Back-end/Spring] - [Spring] STS / lombok 사용
2021/03/04 - [Web_Back-end/Spring] - [Spring] STS / file upload 파일 올리기 _ 1. select
[Spring] STS / file upload 파일 올리기 _ 1. select
프로젝트 생성 상품 테이블 goods 를 사용해서 연습해보기 mybatis 설정 - DB와 연동하기 위해 oracle 설정 db.properties driver=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@localhost:1521:orcl..
jjiny-bbany.tistory.com
2021/03/04 - [Web_Back-end/Spring] - [Spring] STS / file upload 파일 올리기 _ 2. delete
[Spring] STS / file upload 파일 올리기 _ 2. delete
2021/03/04 - [Web_Back-end/Spring] - [Spring] STS / lombok 사용 2021/03/04 - [Web_Back-end/Spring] - [Spring] STS / file upload 파일 올리기 _ 1. select [Spring] STS / file upload 파일 올리기 _ 1. se..
jjiny-bbany.tistory.com
1번, 2번 게시물에 이어서, goods테이블의 상품을 수정(update)하는 코드를 작성해본다
controller에 method 2가지를 작성한다
- get방식 : 상품상세보기에서, 수정버튼을 누르면 수정 form을 가진 jsp 뷰로 이동
- post방식 : form에 담긴 정보를 post방식으로 전송하여 update를 진행
GoodsController.java
get
@RequestMapping(value="/updateGoods.do", method=RequestMethod.GET)
public ModelAndView updateForm(int no) {
ModelAndView mav = new ModelAndView();
// 수정할 상품을 상태유지해야하기 때문에 insert(void)와는 달리
// ModelAndView객체를 반환해야한다
mav.addObject("g", dao.selectGoods(no));
return mav;
}
@RequestMapping(value="/updateGoods.do", method=RequestMethod.PATCH)
public ModelAndView updateSubmit() {
ModelAndView mav = new ModelAndView();
return mav;
}
view 페이지 작성 _ get 방식처리
updateGoods.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>상품수정</h2>
<hr>
<form action="updateGoods.do" method="post" enctype="multipart/form-data">
상품번호 : ${g.no }<br>
<input type="hidden" name="no" value="${g.no }">
상품이름 : <input type="text" name="name" value="${g.name }"><br>
상품수량 : <input type="text" name="qty" value="${g.qty }"><br>
상품가격 : <input type="text" name="price" value="${g.price }"><br>
<!-- 사진 수정: 원래사진명을 전송한다 -->
<input type="hidden" name="fname" value="${g.fname }">
<img src="img/${g.fname }" width="30" height="30"><br>
상품사진 : <input type="file" name="uploadFile"><br>
<hr>
<input type="submit" value="수정">
<input type="reset" value="취소">
</form>
</body>
</html>
controller에 method 2가지를 작성한다
- get방식 : 상품상세보기에서, 수정버튼을 누르면 수정 form을 가진 jsp 뷰로 이동
- post방식 : form에 담긴 정보를 post방식으로 전송하여 update를 진행
GoodsController.java
post
@RequestMapping(value="/updateGoods.do", method=RequestMethod.POST)
public ModelAndView updateSubmit(GoodsVo g, HttpServletRequest request) {
ModelAndView mav = new ModelAndView();
String path = request.getRealPath("/img");
// 만약 파일을 원래사진과 다르게 수정했다면
// 원래 사진의 파일명을 미리 알아야한다 _ dao 실행되면 사라지기 때문
String oldFname = g.getFname();
// uploadFile의 정보를 가져온다 - form 태그에서 수정한 파일
MultipartFile uploadFile = g.getUploadFile();
// upload한 file이름, file 내용을 알아온다
String fname = uploadFile.getOriginalFilename();
//------------------------------------------------
if(fname != null && !fname.equals("")) {// uploadFile 이 있다면
try {
// file내용 _ 예외처리
byte[] data = uploadFile.getBytes();
FileOutputStream fos = new FileOutputStream(path + "/" + fname);
// file에 data를 작성
fos.write(data);
fos.close();
// vo에 file이름을 싣는다
// 매개변수로 받아온 vo에는 원래 파일명이 담겨서 온다
// form 태그에서 hidden으로 보냈음
// 파일이 수정되었다면 파일명도 수정해야하므로 아래와 같이 작성한다
g.setFname(fname); // 이 method에서 받아온 upload한 file의 이름
// 즉, 수정된 파일명으로 vo에 변경set해준것
} catch (IOException e) {
System.out.println("예외발생 : " + e.getMessage());
}
}
int re = dao.updateGoods(g);
if(re == 1) {// 수정에 성공한다면
// 원래 상품 사진 파일은 삭제한다
// ! 조건 ! : 파일도 수정을 했다면 원래파일을 삭제해야한다
if(fname != null && !fname.equals("")) {// 상품수정성공 + 파일수정
File file = new File(path + "/" + oldFname);
file.delete();
}
mav.setViewName("redirect:/listGoods.do");
}else {
mav.addObject("msg", "상품수정에 실패하였습니다");
mav.setViewName("error");
}
return mav;
}
dao에 method 추가
GoodsDao.java
public int updateGoods(GoodsVo g) {
// TODO Auto-generated method stub
return DBManager.updateGoods(g);
}
DBManager.java 에 method 추가
DBManager.java
public static int updateGoods(GoodsVo g) {
//true = autoCommit
SqlSession session = factory.openSession(true);
int re = session.update("goos.updateGoods", g);
session.close();
return re;
}
mapping 파일에 update 노드 추가
GoodsMapper.xml
<update id="updateGoods">
update goods set name=#{name}, qty=#{qty}, price=#{price}, fname=#{fname} where no=#{no}
</update>
server 가동 후 test
1. 상품사진은 수정하지 않는다
2. 상품사진도 수정한다
문제발생 ! 같은이름의 사진파일로 수정할 경우,
중복처리를 하지 않아 수정한 파일이 이전파일명과 동일해 삭제된다
해결방법
method를 만들어서 중복을 처리해보자
- SistUtil 클래스를 하나 생성한다
SistUtil.java
package com.example.demo;
import java.io.File;
public class SistUtil {
/**
* 원래파일의 파일명, 경로를 매개변수로 받는다
* 원래파일이 존재하는 경로의 모든 값을 조회하고
* 그 안에 수정하는 파일명이 있는지 확인한다
*
* @param fname 원래파일의 파일명
* @param path 원래파일의 경로
* @return
*/
public static String getFileName(String fname, String path) {
String newFname = null;
// directory경로
File dir = new File(path);
// dir의 모든 파일 목록을 가져올 수 있다
String[] file_list = dir.list();
// dir의 모든 파일목록 즉 file_list안에
// 새롭게 수정한 파일명이 존재하는지 확인한다
boolean flag = false;
for(String name: file_list) {
if(name.equals(fname)) {
// file_list의 값중에 fname(인자)가 존재한다면
flag = true;
break;
}
}
// 디렉토리(dir)의 모든 파일명을 일일이 매개변수로 전달받은 파일명과 비교한다
// 같은 파일명이 있으면 flag에 true를 담는다
// 만약 flag가 true이면 다른이름을 정해주고
// 그렇지 않다면 그 이름을 사용하도록 한다
// 1. 일단 매개변수로 받은 이름을 담는다
newFname = fname;
if(flag == true) {
// 파일명 뒤에, 현재시간을 붙여서 새로운 파일명을 만든다
// 단, 확장자를 유의하여 붙인다
String name = newFname.substring(0, newFname.indexOf("."));
String ext = newFname.substring(newFname.indexOf("."));
newFname = name + System.currentTimeMillis() + ext;
}
return newFname;
}
}
이 소스파일은 , insert, update 모두 적용시켜보도록 한다
다시 server가동 후 test
같은 파일명인 파일로 등록하기
- 같은 파일명이 존재하는 파일을 insert할 경우
- insert하는 새로운 파일명에 현재시간이 붙어서 insert된다
같은 파일명인 파일로 수정하기
- 수정하는 파일명이 원래 존재하는 파일명과 같은 경우
- 원래 있던 파일은 삭제되고,
- 수정한 파일명에 현재시간이 붙어서 수정된다
- 꼭 이렇게 작성하지 않고,
- 다른 방법으로 활용해서, 사용할 수 있는 코드
'Web_Back-end > Spring' 카테고리의 다른 글
[Spring] STS / file upload 파일 올리기 _ 2. delete (0) | 2021.03.04 |
---|---|
[Spring] STS / file upload 파일 올리기 _ 1. select (0) | 2021.03.04 |
[Spring] STS / lombok 사용 (0) | 2021.03.04 |
[Spring] 스프링부트 & mybatis 환경에서 DB연결 연습 2 (0) | 2021.03.03 |
[Spring] spring boot 기초_ DB와 연동하기 (0) | 2021.03.03 |