목표: 테이블 2종류를 이용해 답변형 게시판 형태의 프로젝트를 만든다
CREATE TABLE media (
mediano NUMBER NOT NULL PRIMARY KEY, -- 미디어 번호
title VARCHAR2(255) NOT NULL, -- 제목
poster VARCHAR2(255) DEFAULT 'poster.jpg' NOT NULL, -- 포스터 이미지
filename VARCHAR2(255) NOT NULL,
filesize NUMBER DEFAULT 0 NOT NULL,
mview CHAR(1) DEFAULT 'Y' NOT NULL, -- 출력모드
rdate DATE NOT NULL, -- 등록일
mediagroupno NUMBER NULL -- 부모테이블 PK
);
-- 시퀀스 생성
create sequence media_seq;
목록
select * from media
where mview='y' and mediagroupno=?;
order by mediano desc;
package kr.co.mymelon.media;
import org.springframework.web.multipart.MultipartFile;
public class MediaDTO {
private int mediano;
private String title;
private String poster;
private String filename;
private long filesize;
private String mview;
private String rdate;
private int mediagroupno;
// 기본 생성자,getter,setter,tostring -> lombok.jar 활용가능
//@getter @setter.....
public MediaDTO() {
}
/////////////////
//첨부된 파일을 저장하기 위해(createForm.jsp)
//입력폼에서의 변수명이 다르다
// 1. 스프링에서 파일 객체 멤버 변수 선언
private MultipartFile posterMF;
private MultipartFile filenameMF;
//2.GETTER SETTER 작성
public MultipartFile getPosterMF() {
return posterMF;
}
public void setPosterMF(MultipartFile posterMF) {
this.posterMF = posterMF;
}
public MultipartFile getFilenameMF() {
return filenameMF;
}
public void setFilenameMF(MultipartFile filenameMF) {
this.filenameMF = filenameMF;
}
/////////////////////////////////////////////////////////
public int getMediano() {
return mediano;
}
public void setMediano(int mediano) {
this.mediano = mediano;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPoster() {
return poster;
}
public void setPoster(String poster) {
this.poster = poster;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public long getFilesize() {
return filesize;
}
public void setFilesize(long filesize) {
this.filesize = filesize;
}
public String getMview() {
return mview;
}
public void setMview(String mview) {
this.mview = mview;
}
public String getRdate() {
return rdate;
}
public void setRdate(String rdate) {
this.rdate = rdate;
}
public int getMediagroupno() {
return mediagroupno;
}
public void setMediagroupno(int mediagroupno) {
this.mediagroupno = mediagroupno;
}
@Override
public String toString() {
return "MediaDTO [mediano=" + mediano + ", title=" + title + ", poster=" + poster + ", filename=" + filename
+ ", filesize=" + filesize + ", mview=" + mview + ", rdate=" + rdate + ", mediagroupno=" + mediagroupno
+ "]";
}
}
package kr.co.mymelon.media;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
@Repository
public class MediaDAO {
@Autowired
private JdbcTemplate jt;
private StringBuilder sql=null;
public MediaDAO() {
System.out.println("mediaDAO객체 생성됨");
}
public List<MediaDTO> list(int mediagroupno){
List<MediaDTO> list=null;
try {
sql = new StringBuilder();
sql.append(" select mediano,title,rdate,poster,filename,filesize,meview,mediagroupno ");
sql.append(" from media ");
sql.append(" where mview='y' and mediagroupno= " + mediagroupno);
sql.append(" order by mediano desc ");
RowMapper<MediaDTO> rowMapper=new RowMapper<MediaDTO>() {
@Override
public MediaDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
MediaDTO dto = new MediaDTO();
dto.setMediano(rs.getInt("mediano"));
dto.setTitle(rs.getString("title"));
dto.setRdate(rs.getString("rdate"));
dto.setPoster(rs.getString("poster"));
dto.setFilename(rs.getString("filename"));
dto.setFilesize(rs.getLong("filesize"));
dto.setMview(rs.getString("mview"));
dto.setMediagroupno(rs.getInt("mediagroupno"));
return dto;
}
};
list = jt.query(sql.toString(), rowMapper);
} catch (Exception e) {
System.out.println("목록 실패" + e);
}
return list;
}
public int create(MediaDTO dto) {
int cnt=0;
try {
sql=new StringBuilder();
sql.append(" insert into media(mediano,title,poster,filename,filesize,mediagroupno,rdate) ");
sql.append(" values(media_seq.nextval,?,?,?,?,?,sysdate) ");
cnt=jt.update(sql.toString(),dto.getTitle(),dto.getPoster(),dto.getFilename(),dto.getFilesize(),dto.getMediagroupno());
} catch (Exception e) {
System.out.println("음원등록 실패"+e);
}
return cnt;
}
package kr.co.mymelon.media;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
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 org.springframework.web.servlet.ModelAndView;
import net.utility.UploadSaveManager;
@Controller
public class MediaController {
@Autowired
private MediaDAO dao;
public MediaController() {
System.out.println("medaicontroller 객체 생성됨");
}
//부모 글번호를 항상 가지고 다녀야 한다
@RequestMapping("/media/list.do")
public ModelAndView list(int mediagroupno) {
ModelAndView mav=new ModelAndView();
mav.setViewName("media/list");
mav.addObject("list", dao.list(mediagroupno));
mav.addObject("mediagroupno",mediagroupno);
return mav;
}
@RequestMapping(value= "/media/create.do", method = RequestMethod.GET)
public ModelAndView createForm(int mediagroupno) {
ModelAndView mav=new ModelAndView();
mav.setViewName("media/createForm");
mav.addObject("mediagroupno", mediagroupno);
return mav;
}
@RequestMapping(value= "/media/create.do",method = RequestMethod.POST)
public ModelAndView createProc(MediaDTO dto, HttpServletRequest req) {
//string title,multipartfile posterMF,multipartfile filenameMF)
ModelAndView mav=new ModelAndView();
mav.setViewName("media/msgView");
//////////////////////////////////////////////////////
// 첨부된 파일 처리
// 실제파일:storage 폴더에 저장
// 저장된 파일 관련 정보는 media테이블에 저장
// 파일 저장 폴더의 실제 물리적인 경로 가져오기
ServletContext application=req.getServletContext();
String basePath=application.getRealPath("/storage");
MultipartFile posterMF=dto.getPosterMF();//파일 가져오기
//storage 폴더에 저장하고 , 리네임된 파일명 반환
String poster=UploadSaveManager.saveFileSpring30(posterMF, basePath);
dto.setPoster(poster);//리네임된 파일명을 dto객체 담기
MultipartFile filenameMF=dto.getFilenameMF();
String filename=UploadSaveManager.saveFileSpring30(filenameMF, basePath);
dto.setFilename(filename);
dto.setFilesize(filenameMF.getSize());
/////////////////
int cnt=dao.create(dto);
if (cnt==0) {
String msg1 = "<p>음원 등록 실패</p>";
String img = "<img src='../images/pepe1.png' width='300px'>";
String link1 = "<input type='button' value='다시시도'>";
String link2 = "<input type='button' value='그룹목록'>";
mav.addObject("msg1",msg1);
mav.addObject("img", img);
mav.addObject("link1", link1);
mav.addObject("link2", link2);
}else {
String msg1 = "<p>음원 등록 성공</p>";
String img = "<img src='../images/pepe2.png' width='300px'>";
String link2 = "<input type='button' value='그룹목록'>";
mav.addObject("msg1",msg1);
mav.addObject("img", img);
mav.addObject("link2", link2);
}
return mav;
}//create
}
이름을 클릭하면 페이지 이동하도록 설정
페이지를 이동할때마다 부모 테이블의 속성인 mediagroupno를 항상 가지고 다니도록 한다.
<td><a href="../media/list.do?mediagroupno=${dto.mediagroupno}">${dto.title}</a></td>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>list</title>
<style>
* {
font-family: gulim;
font-size: 25px;
}
</style>
<link href="../css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="title">음원 목록</div>
<div class="content">
<input type="button" value="음원등록" onclick="location.href='create.do?mediagroupno=${requestScope.mediagroupno}'">
<input type="button" value="HOME" onclick="location.href='/home.do'">
<!-- 절대경로 -->
</div>
<table>
<tr>
<th>번호</th>
<th>제목</th>
<th>등록일</th>
<th>음원파일명</th>
<th>수정/삭제</th>
</tr>
<c:forEach var="dto" items="${list}">
<tr>
<td>${dto.mediano}</td>
<td>${dto.title}</td>
<td>${dto.rdate}</td>
<td>
${dto.filename} <br>
${dto.filesize}<br>
</td>
<td>
<input type="button" value="수정">
<input type="button" value="삭제">
</td>
</tr>
</c:forEach>
</table>
</body>
</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>createForm</title>
<style>
* {
font-family: gulim;
font-size: 25px;
}
</style>
<link href="../css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="title">음원 등록</div>
<form name="frm" method="post" action="create.do" enctype="multipart/form-data">
<input type="hidden" name="mediagroupno" value="${mediagroupno}">
<table class='table'>
<tr>
<th>제목</th>
<td><input type='text' name='title' size='50'></td>
</tr>
<tr>
<th>포스터</th>
<td><input type='file' name='posterMF' size='50'></td>
</tr>
<tr>
<th>미디어 파일</th>
<td><input type='file' name='filenameMF' size='50'></td>
</tr>
</table>
<div class="bottom">
<input type="submit" value="음원등록"> <input type="button"
value="음원목록"
onclick="location.href='list.do?mediagroupno=${mediagroupno}'">
<input type="button" value="HOME" onclick="location.href='/home.do'">
</div>
</form>
</body>
</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>msgView</title>
<style>
* {
font-family: gulim;
font-size: 25px;
}
</style>
<link href="../css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="title">알림</div>
<div class="content">
<dl>
<dd>${msg1 !=null ? img:""} ${msg1}</dd>
</dl>
<p>
${link1} ${link2}
</p>
</div>
</body>
</html>
