Spring
pom.xml 추가
<!-- 파일 업로드 (FileUpload) -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
package com.jungbo.k1.psd;
import org.springframework.web.multipart.MultipartFile;
import lombok.Data;
@Data
public class PsdVO {
private String m_idx;
private String m_sno;
private String m_sname;
private String m_filesStr;
private MultipartFile m_files;
private String m_etc;
private int m_cnt;
private String ch1;
private String ch2;
}
package com.jungbo.k1.psd;
import java.util.List;
public interface PsdDao {
void insertPsd(PsdVO vo);
void updatePsd(PsdVO vo);
void deletePsd(PsdVO vo);
void cnt(PsdVO vo);
PsdVO getPsd(PsdVO vo);
List<PsdVO> getPsdList(PsdVO vo);
}
파일명만 다르기 때문에 서비스는 생략 !
package com.jungbo.k1.psd;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PsdServiceImpl implements PsdService{
@Autowired
private PsdDao dao;
@Override
public void insertPsd(PsdVO vo) {
dao.insertPsd(vo);
}
@Override
public void updatePsd(PsdVO vo) {
dao.updatePsd(vo);
}
@Override
public void deletePsd(PsdVO vo) {
dao.deletePsd(vo);
}
@Override
public PsdVO getPsd(PsdVO vo) {
return dao.getPsd(vo);
}
@Override
public List<PsdVO> getPsdList(PsdVO vo) {
return dao.getPsdList(vo);
}
@Override
public void cnt(PsdVO vo) {
dao.cnt(vo);
}
}
package com.jungbo.k1.psd;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class PsdDaoImpl implements PsdDao{
@Autowired
private JdbcTemplate jdbcTemplate;
String INSERT = "insert into memberT2(m_idx, m_sno, m_sname, m_files, m_etc, m_cnt)"
+ "values(idx_memberT2.nextval,?,?,?,?,0)";
String UPDATE1 = "update memberT2 set m_sno=?, m_sname=?, m_files=?, m_etc=? where m_idx=?";
String UPDATE2 = "update memberT2 set m_sno=?, m_sname=?, m_etc=? where m_idx=?";
String DELETE = "delete from memberT2 where m_idx=?";
String SELECT_ONE = "select * from memberT2 where m_idx=?";
String SELECT_SNO = "select * from memberT2 where m_sno like ? order by m_idx desc";
String SELECT_SNAME = "select * from memberT2 where m_sname like ? order by m_idx desc";
String SELECT_ALL = "select * from memberT2 order by m_idx desc";
String CNT = "update memberT2 set m_cnt=m_cnt+1 where m_idx = ? ";
@Override
public void insertPsd(PsdVO vo) {
System.out.println("insertPsd :" + vo);
Object args[] = {vo.getM_sno(), vo.getM_sname(), vo.getM_filesStr(), vo.getM_etc()};
jdbcTemplate.update(INSERT,args);
}
@Override
public void updatePsd(PsdVO vo) {
System.out.println("==========> updatePsd "+ vo.getM_filesStr());
if (vo.getM_filesStr() == "" || vo.getM_filesStr().equals("")) {
System.out.println("==========> updatePsd : 2 ");
Object args[] = {vo.getM_sno(), vo.getM_sname(), vo.getM_etc(),vo.getM_idx()};
jdbcTemplate.update(UPDATE2,args);
}else {
System.out.println("==========> updatePsd : 1 ");
Object args[] = {vo.getM_sno(), vo.getM_sname(), vo.getM_filesStr(), vo.getM_etc(),vo.getM_idx()};
jdbcTemplate.update(UPDATE2,args);
}
}
@Override
public void deletePsd(PsdVO vo) {
Object args[] = {vo.getM_idx()};
jdbcTemplate.update(DELETE, args);
}
@Override
public PsdVO getPsd(PsdVO vo) {
Object args[] = {vo.getM_idx()};
return jdbcTemplate.queryForObject(SELECT_ONE, new PsdRowMapper(), args);
}
@Override
public List<PsdVO> getPsdList(PsdVO vo) {
if(vo.getCh1()==null || vo.getCh2()=="" || vo.getCh2().equals("")) {
return jdbcTemplate.query(SELECT_ALL, new PsdRowMapper());
}else if(vo.getCh1().equals("sno")) {
Object args[] = {"%" + vo.getCh2() +"%"};
return jdbcTemplate.query(SELECT_SNO, new PsdRowMapper(), args);
}else if(vo.getCh1().equals("sname")) {
Object args[] = {"%" + vo.getCh2() +"%"};
return jdbcTemplate.query(SELECT_SNAME, new PsdRowMapper(), args);
}
return null;
}
@Override
public void cnt(PsdVO vo) {
Object args[] = {vo.getM_idx()};
jdbcTemplate.update(CNT, args);
}
}
package com.jungbo.controller;
import java.io.File;
import java.text.SimpleDateFormat;
import javax.annotation.PostConstruct;
import javax.servlet.ServletContext;
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.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import com.jungbo.k1.psd.PsdServiceImpl;
import com.jungbo.k1.psd.PsdVO;
@Controller
public class PsdController {
String path="";
@Autowired // 서블릿 주입하기
private ServletContext servletContext;
@Autowired
PsdServiceImpl service;
// @PostConstruct 어노테이션을 설정해놓는다.
//init 메소드는 WAS가 띄워질때 실행된다.
@PostConstruct
public void init() {
path = servletContext.getRealPath("/psd/files/");
System.out.println("=====> realpath: "+path);
}
@RequestMapping(value="/insertPsd.do")
public String insertPsd(PsdVO vo) throws Exception {
System.out.println("=====> insert확인 ");
MultipartFile uploadFile = vo.getM_files();
//시 분 초 시간 추가
long time = System.currentTimeMillis();
SimpleDateFormat daytime = new SimpleDateFormat("HHmmss");
String timeStr = daytime.format(time);
System.out.println("시간 확인 : " + timeStr);
// 파일이 첨부되는 실제 이름
String fileName = uploadFile.getOriginalFilename();
File f = new File(path+ fileName);
// 중복 확인
if(! uploadFile.isEmpty()) {
if(f.exists()) {
System.out.println("중복된 파일이 있습니다. !!");
// 파일명만 표기하기 방법 1
String fName = FilenameUtils.getBaseName(fileName);
// 파일명만 표기하기 방법 2
// String fName = fileName.substring(0, fileName.lastIndexOf("."));
// 파일 확장자
String Extention = fileName.substring(fileName.lastIndexOf("."));
// 시간 포함된 파일명
fileName = fName + "_" + timeStr + Extention;
System.out.println(fileName);
}
uploadFile.transferTo(new File(path+ fileName));
}else {
System.out.println("파일이 첨부되지 않았습니다. !!");
fileName ="space.png";
}
vo.setM_filesStr(fileName);
service.insertPsd(vo);
return "/getPsdList.do";
}
@RequestMapping(value="/getPsd.do")
public ModelAndView getPsd(PsdVO vo, ModelAndView mav) {
mav.addObject("m", service.getPsd(vo));
mav.setViewName("/psd/getPsd.jsp");
service.cnt(vo);
return mav;
}
@RequestMapping(value="/updatePsd.do")
public String updatePsd(PsdVO vo) throws Exception {
PsdVO delVO = service.getPsd(vo);
String delFile = delVO.getM_filesStr();
MultipartFile uploadFile = vo.getM_files();
long time = System.currentTimeMillis();
SimpleDateFormat daytime = new SimpleDateFormat("HHmmss");
String timeStr = daytime.format(time);
String fileName = uploadFile.getOriginalFilename();
File f = new File(path+fileName);
// 첨부 파일이 공백이 아니면 기존파일을 삭제
if(! uploadFile.isEmpty()) {
File delf = new File(path+delFile);
if(delf.exists()) { // 삭제할 파일이 있으면
if(!delFile.equals("space.png")) { // space.png가 아니면
delf.delete(); // 삭제
}
}
if(f.exists()) {
// 파일명만 표기
String fName = fileName.substring(0, fileName.lastIndexOf("."));
// 파일 확장자
String Extention = fileName.substring(fileName.lastIndexOf("."));
// 시간 포함된 파일명
fileName = fName + "_" + timeStr + Extention;
uploadFile.transferTo(new File(path+ fileName));
}
}else {
fileName ="space.png";
}
vo.setM_filesStr(fileName);
service.updatePsd(vo);
return "getPsdList.do";
}
@RequestMapping(value="/deletePsd.do")
public String deletePsd(PsdVO vo) {
service.deletePsd(vo);
return "getPsdList.do";
}
@RequestMapping(value="/getPsdList.do")
public ModelAndView getPsdList(PsdVO vo, ModelAndView mav) {
mav.addObject("li", service.getPsdList(vo));
mav.setViewName("/psd/getPsdList.jsp");
return mav;
}
}
컨트롤러에 들어온 값이 서비스를 통해 Dao로 이어진다.
이미지라는 file부분이 추가되니 보다 더 복잡해졌다.
아직은 어색하고 먼 사이인듯 어렵게만 느껴진다 ..
경로 설정, 파일에 대한 호출값을 유의해서 불러와야 에러를 줄일수 있다.
수시로 프린트문을 통해 어떤 값이 호출되고 값이 정확하게 들어오는지를 확인하는 것을 습관화 하자.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.lang.*" %>
<%@page import ="com.jungbo.k1.psd.*" %>
<%@page import ="java.util.*" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ include file = "/include/top.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align="center">
<div><font size=5> <b>학생 신상 수정하기</b></font></div>
<hr>
<form action="<%=path %>/updatePsd.do" method="post"
enctype="multipart/form-data">
<input type=hidden name=m_idx value="${m.m_idx}">
<table border=1 width="400" height="250" align=center>
<tr>
<td width=100><b>학번</b></td><td><input type=text name=m_sno value="${m.m_sno}"></td>
<td rowspan=3 align=center><img src="<%=path %>/psd/files/${m.m_filesStr}" width=100 height=100>
</tr>
<tr>
<td>이름</td>
<td><input type=text name=m_sname value="${m.m_sname}"></td>
</tr>
<tr>
<td>파일</td>
<td><input type=file name=m_files value="${m.m_sname}"></td>
</tr>
<tr>
<td>특이사항</td>
<td colspan=2><textarea name=m_etc cols=50 rows=10>${m.m_etc}</textarea></td>
</tr>
<tr>
<td colspan=3 align=center>
<input type=submit value="수정하기">
</td>
</tr>
</table>
</form>
<br>
<hr>
<c:url value="${path}/psd/psd_form.jsp" var="insert"/>
  <a href="${insert}">학생등록</a>
<c:url value="${path}/deletePsd.do" var="delete">
<c:param name="m_idx" value="${m.m_idx }"/>
<c:param name="m_filesStr" value="${m.m_filesStr}"/>
</c:url>
  <a href="${delete}" >학생목록삭제</a>
<c:url value="${path}/getPsdList.do" var="select_all"/>
  <a href="${select_all}">학생목록</a>
</div>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="com.jungbo.k1.psd.*" %>
<%@ page import="java.util.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ include file="/include/top.jsp" %>
<section>
<br>
<div align="center">
<h2>학생 등록 목록</h2>
<table border=1 width="600">
<tr>
<td>순번</td>
<td>학번</td>
<td>이름</td>
<td>파일명</td>
<td>이미지</td>
<td>조회수</td>
</tr>
<c:forEach items="${li}" var="m">
<tr>
<td>${m.m_idx}</td>
<td> ${m.m_sno}</td>
<td><a href="<%=path %>/getPsd.do?m_idx=${m.m_idx}">
${m.m_sname}</a>
</td>
<td>${m.m_filesStr}</td>
<td align=center><img src="<%=path %>/psd/files/${m.m_filesStr}" width=50 height=50></td>
<td>${m.m_cnt}</td>
</tr>
</c:forEach>
</table>
<form action="<%=path %>/getPsdList.do">
<table>
<tr>
<td colspan=5 align="center">
<select name="ch1">
<option value="m_sno">학번</option>
<option value="m_sname">이름</option>
</select>
<input name="ch2" type="text">
<input type="submit" value="검색">
</td>
</tr>
</table>
</form>
</div>
</section>
<%@ include file="/include/footer.jsp" %>
한글 값으로 된 파일명을 받아오기위해 jstl의 c태그를 통해 url변수에 값을 담아 호출했다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file = "/include/top.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align="center">
<br><br><br>
<div><font size=5> <b>학생 신상 등록</b></font></div>
<hr>
<form action="<%=path %>/insertPsd.do" method="post"
enctype = "multipart/form-data">
<table border=1>
<tr>
<td>학번</td>
<td><input type=text name=m_sno></td>
</tr>
<tr>
<td>이름</td>
<td><input type=text name=m_sname></td>
</tr>
<tr>
<td>업로드</td>
<td><input type=file name=m_files></td>
</tr>
<tr>
<td>내용</td>
<td><textarea name=m_etc cols=40 rows=5></textarea></td>
</tr>
<tr>
<td colspan=2 align=center>
<input type=submit value="학생등록">
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
.do로 받는 컨트롤러 사용은 조금 익숙해진 것 같다.
하지만 아직 경로를 받아오는 부분과 오타부분, 정확히 해결되지 않는 오류들이있다.
오류에 대한 로그를 보며 분석하고 같은 에러가 발생했을때 수정할 수 있도록 데이터를 쌓도록 하자.