Spring-myMelon(media-list,create)

임재헌·2023년 5월 10일

Spring

목록 보기
8/9

목표: 테이블 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;

DTO 생성

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
				+ "]";
	}
		
}

DAO 메소드

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;
	}

create 메소드

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
}

VIEW 페이지 설정

이름을 클릭하면 페이지 이동하도록 설정
페이지를 이동할때마다 부모 테이블의 속성인 mediagroupno를 항상 가지고 다니도록 한다.

<td><a href="../media/list.do?mediagroupno=${dto.mediagroupno}">${dto.title}</a></td>

list 페이지(media)

<%@ 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>

createForm(media)

<%@ 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>

msgview

<%@ 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>

0개의 댓글