[SPRING] SpringMVC 홈페이지만들기 5 [ 자료실페이지 ]

🐷Jinie (juniorDeveloper)·2020년 12월 7일
2

JSP/MVC/SPRING

목록 보기
68/81

1. 자료실 form 만들기

<form action="vipForm.do" method="POST" enctype="multipart/form-data">

★ 중요!
method는 POST로
enctype은 multipart/form-data

<tr>
	<td  align=center>사진첨부</td>
	<td><input  type=file  name=uploadfile size=10> </td>
</tr>

input type은 file

2. VO에 file 받을 setter/getter만들기

3. FileUpload 라이브러리 추가

  • pom.xml 에 commons-fileupload 라이브러리를 추가한다.
  • commons-dbcp 아래에 추가했다.
<dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.3.1</version>
</dependency>

4. presentation-layer에 MultipartResolver 설정

  • 파일 업로드 관련 라이브러리는 추가했다면,
    다음은 스프링 설정파일 xml파일에 CommonsMultipartResolver를 bean으로 등록한다.
  • 이때 property로 maxSize를 부여한다. 이때 사이즈에 제한을 안주면 무한대로 가정됨.
    단, 그렇다고 무조건 무한정사이즈를 다 올릴 수 있는게 아니다.
    웹 서버가 받을 수 있는 용량이 한정되어있다.
  • Resolver로 끝나는 클래스들은 대부분 id가 정해져있기 때문에, 정해진 id로 잘 확인해서 등록하자
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<property name="maxUploadSize" value="100000" />
</bean>
  • MultipartFile 객체에는 클라이언트가 업로드한 파일에 대한 모든 정보가 저장된다.
  • 따라서 Multipart 객체만 가지고 있으면 원하는 위치에 해당 파일을 업로드 할 수 있다.

5. 파일업로드 Service 와 DAO

[ MultipartFile 인터페이스가 제공하는 주요 메서드 ]

  • 업로드한 파일명을 문자열로 리턴
    : String getOriginalFilename()
  • 업로드한 파일을 desfFile에 저장
    : void transferTo(File destFile)
  • 업로드한 파일 존재 여부 리턴 (없으면 true 리턴)
    : boolean isEmpty()

6. 데이터베이스 테이블만들기

  • 테이블 만들기
CREATE TABLE member_vip (
     custno NUMBER(6)  NOT  NULL PRIMARY KEY ,
     custname VARCHAR2(20),
     phone VARCHAR2(13),
     address VARCHAR2(60),
     joindate  DATE,
     grade  CHAR(1),
     city  CHAR(2),
     fname NVARCHAR2(50)
);
  • 값 넣기
INSERT  INTO  member_vip 
        VALUES(900001,'김귀빈','010-9999-9999','서울 동대문구 휘경1동','20151202','A','01','space.jpg'); 
  • 값 확인하기
SELECT * 
    FROM member_vip;

7. 파일 업로드 처리

  • 파일중복에 대해서 처리할 것을 생각한다.
    : 다양한 방법론이 있다. 현재시간을 받아서 붙여 저장하는 방법도 있고 난수를 생성해서 붙여주는 방법도 있다. 나는 난수를 생성하고 그중에 앞에서 3글자만 랜덤으로 붙여서 중복을 방지했다.
  • 데이터베이스에 저장할 것을 생각한다.
  • Controller
package com.springbook.view;

import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;

import com.springbook.biz.jungbo.common.MemberVO;
import com.springbook.biz.jungbo.service.JungboService;

@Controller
public class MemberVIPController {
	@Autowired
	JungboService s;
	@RequestMapping(value="/vipForm.do", method=RequestMethod.POST)
	public String file_form(MemberVO vo , HttpServletRequest request) {
		
		String Realpath = request.getSession().getServletContext().getRealPath("/psd/");
		System.out.println(Realpath);
		MultipartFile uploadFile = vo.getUploadFile();	
		
		if(!uploadFile.isEmpty()) {
			try {
				String genId = UUID.randomUUID().toString();
				String originalFileName = uploadFile.getOriginalFilename();
				String onlyFile = originalFileName.substring(0, originalFileName.lastIndexOf("."));
				String extention = FilenameUtils.getExtension(originalFileName);
				String saveFileName = onlyFile + genId.substring(0,3) + "." + extention;
				vo.setFilename(saveFileName);
				uploadFile.transferTo(new File(Realpath+saveFileName));
				
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}else {
			vo.setFilename("empty.jpg");
		}
		s.insertfile(vo);
		return "";
	}
	
}
  • Service
@Override
	public void insertfile(MemberVO vo) {
		dao.insertfile(vo);	
	}
  • DAO
	String insert_file_sql="insert into member_vip (custno, custname, phone, address, joindate, grade, city, fname) values ((select max(custno) from member_vip)+1, ?, ?, ?, ?, ?, ?, ?) ";	

@Override
	public void insertfile(MemberVO vo) {
		Object[] args = {vo.getCustname(), vo.getPhone(),vo.getAddress(), vo.getJoindate(), vo.getGrade(), vo.getCity(), vo.getFilename()};
		jdbcTemplate.update(insert_file_sql, args);
		
	}
  • 파일넣어보고 데이터베이스 저장확인하기

  • 파일 저장된 폴더 Realpath확인 :
    C:\Users\602-07\eclipse-workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\SpringMVC1204\psd\

8. 자료실 목록보기

  • 업로드된 파일을 불러오는 목록보기 페이지를 생성한다.
  • 기존 목록보기와 fname 컬럼이 있고없고가 차이가 있어서
    rs. 을 실행해서 담아둘 객체를 함께써버리면 null error가 발생한다.
  • 따라서, 담아줄 클래스를 DAOImpl에 하나 더 만들었다.
class rowMapper_file implements RowMapper<MemberVO>{

		@Override
		public MemberVO mapRow(ResultSet rs, int rowNum) throws SQLException {
			MemberVO vo =	new MemberVO();
			 vo.setCustno(rs.getInt("custno"));
			 vo.setCustname(rs.getString("custname"));
			 vo.setPhone(rs.getString("phone"));
			 vo.setAddress(rs.getString("address"));
			 vo.setJoindate(rs.getString("joindate"));
			 vo.setGrade(rs.getString("grade"));
			 vo.setCity(rs.getString("city"));
			 vo.setFilename(rs.getString("fname"));
			return vo;
		}	
	}
  • 또 다른 방법으로 flag를 사용할 수도 있는데,
    전역변수 flag를 설정해서 if문에 문자열비교를 통해 rs.fname의 존재 유무를 설정한다.

  • 다른부분은 일반 목록보기와 동일하다.
    다만, 사진을 불러오려면 img src 태그를 사용해야한다.

  • 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" %>
<c:import url="header.jsp" />
<section>
<br><br>
<div align="center"><font size=5> VIP회원목록보기 </font></div> <br>
<div align="center">
<br><br>
<table border=1  width=800  height=250>
<tr><td>회원번호</td><td>회원성명</td> <td>전화번호</td>
<td>주소</td><td>가입일자</td><td>고객등급</td><td>거주지역</td><td>사진</td></tr>
<c:forEach items="${list}" var="m">
<tr>
	<td><a href="delete.do?custno=${m.getCustno()}">${m.getCustno()}</a></td>
	<td><a href="edit.do?custno=${m.getCustno()}">${m.getCustname()}</a></td>
	<td>${m.getPhone()}</td> 
	<td>${m.getAddress()}</td>
	<td>${m.getJoindate()}</td>
	<td>
		<c:if test="${m.getGrade() == 'A'}"> VIP </c:if>
		<c:if test="${m.getGrade() == 'B'}"> 일반 </c:if>
		<c:if test="${m.getGrade() == 'C'}"> 직원 </c:if>				
	</td>
	<td>${m.getCity()}</td>
	<td><img src="./psd/${m.getFilename()}" width="50" height="50"></td>
</tr>
</c:forEach>

</table>
</div>
</section>
<c:import url="footer.jsp" />
  • Controller
@RequestMapping(value="/vip_list.do")
	public String file_list(MemberVO vo, Model model) {
		model.addAttribute("list", s.fileAllmember(vo));
		return "vip_list.jsp";
	}
  • Service
@Override
	public List<MemberVO> fileAllmember(MemberVO vo) {
		return dao.fileAllmember(vo);
	}
  • DAO
String select_file_sql="select * from member_vip order by custno desc ";

@Override
	public List<MemberVO> fileAllmember(MemberVO vo) {
		return jdbcTemplate.query(select_file_sql, new rowMapper_file());
	}

class rowMapper_file implements RowMapper<MemberVO>{

@Override
	public MemberVO mapRow(ResultSet rs, int rowNum) throws SQLException {
		MemberVO vo =	new MemberVO();
		vo.setCustno(rs.getInt("custno"));
		vo.setCustname(rs.getString("custname"));
		vo.setPhone(rs.getString("phone"));
		vo.setAddress(rs.getString("address"));
		vo.setJoindate(rs.getString("joindate"));
		vo.setGrade(rs.getString("grade"));
		vo.setCity(rs.getString("city"));
		vo.setFilename(rs.getString("fname"));
		return vo;
	}		
}
  • 파일이 저장된 목록보기 페이지 확인
profile
ᴘᴇᴛɪᴛs ᴅᴇ́ᴠᴇʟᴏᴘᴘᴇᴜʀ. ᴘʀᴏɢʀᴀᴍᴍᴀᴛɪᴏɴ = ᴘʟᴀɪsɪʀ 💕

0개의 댓글