board폴더(게시판만들기 폴더)를 복사해서 fileboard폴더를 만들어보자.
파일입출력을 위한 것이고 나머지는 다 같다. (복사해서 폴더를 만들 때, 주소를 잘 살펴야한다. 꼬이지 않도록 주의!)
Orcle SQL developer
수정 후에 BoardDao.java로 가서 insert문을 변경시켜주었다. (새로운 칼럼을 추가했더니 column개수가 맞지 않아서 insert가 되질 않아 글쓰기가 되지 않았다)
(수정이 잘 되었는지 확인하는 방법은, 톰캣서버로 실행한 다음 경로가 /fileboard/ 로 잘 찍히는 지 확인한다.)
다운로드 받아서 WEB-INF/libs 폴더에 .jar파일을 추가해준다.
http://commons.apache.org/proper/commons-fileupload/
FileUpload – Home
Commons FileUpload The Commons FileUpload package makes it easy to add robust, high-performance, file upload capability to your servlets and web applications. FileUpload parses HTTP requests which conform to RFC 1867, "Form-based File Upload in HTML". That
commons.apache.org
https://commons.apache.org/proper/commons-io/download_io.cgi
Commons IO – Download Apache Commons IO
Download Apache Commons IO Using a Mirror We recommend you use a mirror to download our release builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours)
commons.apache.org
Commons IO – Download Apache Commons IO
Download Apache Commons IO Using a Mirror We recommend you use a mirror to download our release builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours)
commons.apache.org
파일업로드 글쓰기
write.jsp
파일 추가 부분
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<c:set var="root" value="${pageContext.request.contextPath }" />
<html>
<head>
<meta charset="UTF-8">
<title>파일보드 글작성 페이지</title>
<link rel="stylesheet" href="${root}/css/board/boardStyle.css" />
<script type="text/javascript" >
function boardCheck(obj){
//alert("OK");
}
function replyFunc(root, boardNumber, groupNumber, sequenceNumber, sequenceLevel){
var url = root + "/fileboard/write.do?boardNumber=" + boardNumber +
"&groupNumber=" + groupNumber + "&sequenceNumber=" + sequenceNumber +
"&sequenceLevel=" + sequenceLevel;
location.href = url;
}
function delFunc(root, boardNumber, pageNumber){
var url = root+ "/fileboard/delete.do?boardNumber=" + boardNumber + "&pageNumber=" + pageNumber;
location.href = url;
/*var value = confirm("삭제하시겠습니까?");
if(value == true){
var url = root+ "/board/deleteOk.do?boardNumber=" + boardNumber + "&pageNumber=" + pageNumber;
alert(url);
}else{
alert("취소되었습니다.");
}*/
}
function updFunc(root, boardNumber, pageNumber){
var url = root + "/fileboard/update.do?boardNumber=" + boardNumber + "&pageNumber=" + pageNumber;
location.href = url;
}
</script>
</head>
<body>
<form id="createform" action="${root}/fileboard/writeOk.do" method="post"
onsubmit="return boardCheck(this)" enctype="multipart/form-data">
<div id="title"><a href="${root}/fileboard/list.do">글목록</a></div>
<div class="menu" style="border-bottom-width: 0px;">
<input type="hidden" name="boardNumber" value="${boardNumber}" />
<input type="hidden" name="groupNumber" value="${groupNumber}" />
<input type="hidden" name="sequenceNumber" value="${sequenceNumber}" />
<input type="hidden" name="sequenceLevel" value="${sequenceLevel}" />
<div id="id">작성자</div>
<span>
<input type="text" name="writer" size="12" />
</span>
</div>
<div class="menu" style="border-bottom-width: 0px;">
<div id="id">제목</div>
<span>
<input type="text" name="subject" size="50" />
</span>
</div>
<div class="menu" style="border-bottom-width: 0px;">
<div id="id">이메일</div>
<span>
<input type="email" name="email" size="50" />
</span>
</div>
<div class="content" style="border-bottom-width: 0px;">
<div id="text">내용</div>
<span>
<textarea name="content" rows="12" cols="65"></textarea>
</span>
</div>
<div class="menu" style="border-bottom-width: 0px;">
<div id="id">비밀번호</div>
<span>
<input type="password" name="password" size="30" />
</span>
</div>
<!-- 파일 업로드 -->
<div class="menu" style="border-bottom-width: 0px;">
<div id="id">파일명</div>
<span>
<input type="file" name="file" size="50" />
</span>
</div>
<div class="menu" style="border-bottom-width: 3px; text-align: center;">
<span>
<input type="submit" value="글쓰기" />
<input type="reset" value="다시작성" />
<input type="button" value="목록보기" onclick="location.href='${root}/fileboard/list.do'"/>
</span>
</div>
</form>
</body>
</html>
WriteCommand.java
package com.java.fileboard.command;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.java.command.Command;
public class WriteCommand implements Command {
@Override
public String proRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//부모글(ROOT)
int boardNumber = 0; //ROOT글이면 0
int groupNumber = 1; //그룹번호
int sequenceNumber = 0; //글순서
int sequenceLevel = 0; //글레벨
//답글인경우 부모글의 DB 글번호, 그룹번호, 글순서, 글레벨
if(request.getParameter("boardNumber")!=null) {
boardNumber = Integer.parseInt(request.getParameter("boardNumber"));
groupNumber = Integer.parseInt(request.getParameter("groupNumber"));
sequenceNumber = Integer.parseInt(request.getParameter("sequenceNumber"));
sequenceLevel = Integer.parseInt(request.getParameter("sequenceLevel"));
}
logger.info(logMsg +"boardNumber:" + boardNumber);
logger.info(logMsg +"groupNumber:" + groupNumber);
logger.info(logMsg +"sequenceNumber:" + sequenceNumber);
logger.info(logMsg +"sequenceLevel:" + sequenceLevel);
request.setAttribute("boardNumber", boardNumber);
request.setAttribute("groupNumber", groupNumber);
request.setAttribute("sequenceNumber", sequenceNumber);
request.setAttribute("sequenceLevel", sequenceLevel);
return "/WEB-INF/views/fileboard/write.jsp";
}
}
WriteOkCommand.java
package com.java.fileboard.command;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.java.command.Command;
import com.java.fileboard.model.BoardDao;
import com.java.fileboard.model.BoardDto;
public class WriteOkCommand implements Command {
@Override
public String proRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
DiskFileItemFactory factory = new DiskFileItemFactory(); //파일 보관 객체
ServletFileUpload upload = new ServletFileUpload(factory); //요청 처리 객체
List<FileItem> list = upload.parseRequest(request);
Iterator<FileItem> iter = list.iterator();
BoardDto boardDto = new BoardDto();
HashMap<String, String> dataMap = new HashMap<String, String>();
while(iter.hasNext()) { //11개
FileItem fileItem = iter.next();
if(fileItem.isFormField()) {
String name=fileItem.getFieldName();
String value=fileItem.getString("utf-8");
logger.info(logMsg + name + "\t" + value);
dataMap.put(name, value);
/*
* String name=(fileItem.getFieldName());
* logger.info(logMsg + "text: " + name);
*/
}else {
if(fileItem.getFieldName().equals("file")) {
// 파일명 fileItem.getName() / 파일사이즈 fileItem.getSize(), getInputStream()
if(fileItem.getName()==null||fileItem.getName().equals("")) continue;
upload.setFileSizeMax(1024*1024*10); // byte * kb * mb * gb
String fileName = System.currentTimeMillis() + "_"+fileItem.getName();
//절대 경로
String dir = "C:\\sohyunkim\\mvc\\workspace\\MVCHomePage\\WebContent\\pds";
File file = new File(dir, fileName);
//톰캣 실제 서버 경로
//String dir = request.getServletContext().getRealPath("\\pds\\");
//logger.info(logMsg + dir);
//File dir = new File("C:\\pds\\"); dir.mkdir();
//File file = null;
//if(dir.exists() && dir.isDirectory()) {
// file = new File(dir, fileItem.getName());
//}
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(fileItem.getInputStream(), 1024);
bos = new BufferedOutputStream( new FileOutputStream(file), 1024);
while(true) {
int data = bis.read();
if(data==-1) break;
bos.write(data);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(bis!=null) bis.close();
if(bos!=null) bos.close();
}
boardDto.setFileName(fileName);
boardDto.setFileSize(fileItem.getSize());
boardDto.setPath(file.getAbsolutePath());
}
}
}
boardDto.setDataMap(dataMap);
boardDto.setWriteDate(new Date());
logger.info(logMsg + boardDto.toString());
int check = BoardDao.getInstance().insert(boardDto);
logger.info(logMsg + check);
request.setAttribute("check", check);
return "/WEB-INF/views/fileboard/writeOk.jsp";
}
}
파일업로드 글 읽기
read.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<c:set var="root" value="${pageContext.request.contextPath}" />
<html>
<head>
<meta charset="UTF-8">
<title>파일보드 읽기 페이지</title>
<link rel="stylesheet" href="${root}/css/board/boardStyle.css" />
<script type="text/javascript">
function boardCheck(obj){
//alert("OK");
}
function replyFunc(root, boardNumber, groupNumber, sequenceNumber, sequenceLevel){
var url = root + "/fileboard/write.do?boardNumber=" + boardNumber +
"&groupNumber=" + groupNumber + "&sequenceNumber=" + sequenceNumber +
"&sequenceLevel=" + sequenceLevel;
location.href = url;
}
function delFunc(root, boardNumber, pageNumber){
var url = root+ "/fileboard/delete.do?boardNumber=" + boardNumber + "&pageNumber=" + pageNumber;
location.href = url;
/*var value = confirm("삭제하시겠습니까?");
if(value == true){
var url = root+ "/board/deleteOk.do?boardNumber=" + boardNumber + "&pageNumber=" + pageNumber;
alert(url);
}else{
alert("취소되었습니다.");
}*/
}
function updFunc(root, boardNumber, pageNumber){
var url = root + "/fileboard/update.do?boardNumber=" + boardNumber + "&pageNumber=" + pageNumber;
location.href = url;
}
</script>
</head>
<body>
<div id="createform">
<div class="menu" style="border-bottom-width: 0px;">
<div id="id">글번호</div>
${boardDto.boardNumber}
</div>
<div class="menu" style="border-bottom-width: 0px;">
<div id="id">작성자</div>
${boardDto.writer}
</div>
<div class="menu" style="border-bottom-width: 0px;">
<div id="id">조회수</div>
${boardDto.readCount}
</div>
<div class="menu" style="border-bottom-width: 0px;">
<div id="id">작성일</div>
<fmt:formatDate value="${boardDto.writeDate}" pattern="yyyy-MM-dd HH:mm:ss"/>
</div>
<div class="menu" style="border-bottom-width: 0px;">
<div id="id">제목</div>
${boardDto.subject}
</div>
<div class="content" style="border-bottom-width: 0px;">
<div id="text">내용</div>
${boardDto.content}
</div>
<c:if test="${boardDto.fileSize!=0}">
<div class="menu" style="border-bottom-width: 0px;">
<div id="id">파일명</div>
<a href="${root}/fileboard/download.do?boardNumber=${boardDto.boardNumber}">${boardDto.fileName}</a>
</div>
</c:if>
<div class="menu" style="border-bottom-width: 3px; text-align: center;">
<input type="button" value="글수정" onclick="updFunc('${root}','${boardDto.boardNumber}','${pageNumber}')"/>
<input type="button" value="글삭제" onclick="delFunc('${root}','${boardDto.boardNumber}','${pageNumber}')"/>
<input type="button" value="답글" onclick="replyFunc('${root}','${boardDto.boardNumber}','${boardDto.groupNumber}','${boardDto.sequenceNumber}','${boardDto.sequenceLevel}')"/>
<input type="button" value="글목록" onclick="location.href='${root}/fileboard/list.do?pageNumber=${pageNumber}'"/>
</div>
</div>
</body>
</html>
ReadCommand.java
package com.java.fileboard.command;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.java.fileboard.model.BoardDao;
import com.java.fileboard.model.BoardDto;
import com.java.command.Command;
public class ReadCommand implements Command {
@Override
public String proRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
int boardNumber = Integer.parseInt(request.getParameter("boardNumber"));
int pageNumber = Integer.parseInt(request.getParameter("pageNumber"));
logger.info(logMsg + boardNumber + "," + pageNumber);
BoardDto boardDto = BoardDao.getInstance().read(boardNumber);
logger.info(logMsg + boardDto);
if(boardDto.getFileSize()!=0) {
int index = boardDto.getFileName().indexOf("_")+1;
boardDto.setFileName(boardDto.getFileName().substring(index));
}
request.setAttribute("pageNumber", pageNumber);
request.setAttribute("boardDto", boardDto);
return "/WEB-INF/views/fileboard/read.jsp";
}
}
파일업로드 글 수정
update.jsp
UpdateCommand.java
updateOk.jsp
UpdateOkCommand.java
[수정]
기존 꺼 지우고 새로 올린다.
파일 이름이 없어도 업로드 버튼이 있어야함.
이름 없어도 빈화면으로
파일업로드 글 삭제
delete.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri = "http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<c:set var = "root" value = "${pageContext.request.contextPath}"/>
<html>
<head>
<meta charset="UTF-8">
<title>파일보드 삭제 페이지</title>
</head>
<body>
<div align="center">
<form action="${root}/fileboard/deleteOk.do" method="post">
<input type="hidden" name="boardNumber" value="${boardNumber}"/>
<input type="hidden" name="pageNumber" value="${pageNumber}"/>
<div>비밀번호를 입력해주세요.</div>
<div>
<input type="password" name="password"/>
</div>
<div>
<input type="submit" value="글삭제"/>
<input type="button" value="목록보기" onclick="location.href='${root}/fileboard/list.do?pageNumber=${pageNumber}'"/>
</div>
</form>
</div>
</body>
</html>
DeleteCommand.java
package com.java.fileboard.command;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.java.command.Command;
public class DeleteCommand implements Command {
@Override
public String proRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
int boardNumber = Integer.parseInt(request.getParameter("boardNumber"));
int pageNumber = Integer.parseInt(request.getParameter("pageNumber"));
logger.info(logMsg + boardNumber + "\t" + pageNumber);
request.setAttribute("boardNumber", boardNumber);
request.setAttribute("pageNumber", pageNumber);
return "/WEB-INF/views/fileboard/delete.jsp";
}
}
deleteOk.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri = "http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<c:set var = "root" value = "${pageContext.request.contextPath}"/>
<html>
<head>
<meta charset="UTF-8">
<title>파일보드 삭제 완료페이지</title>
</head>
<body>
<c:if test="${check > 0}">
<script type="text/javascript">
alert("삭제되었습니다.");
location.href="${root}/fileboard/list.do?pageNumber=${pageNumber}";
</script>
</c:if>
<c:if test="${check == 0}">
<script type="text/javascript">
alert("삭제되지 않았습니다.");
location.href="${root}/fileboard/list.do?pageNumber=${pageNumber}";
</script>
</c:if>
</body>
</html>
deleteOkCommand.java
package com.java.fileboard.command;
import java.io.File;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.java.command.Command;
import com.java.fileboard.model.BoardDao;
import com.java.fileboard.model.BoardDto;
public class DeleteOkCommand implements Command {
@Override
public String proRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
int boardNumber = Integer.parseInt(request.getParameter("boardNumber"));
int pageNumber = Integer.parseInt(request.getParameter("pageNumber"));
String password = request.getParameter("password");
logger.info(logMsg + boardNumber + "\t" + pageNumber + "\t" + password);
BoardDto readBoard = BoardDao.getInstance().select(boardNumber);
int check = BoardDao.getInstance().delete(boardNumber, password);
logger.info(logMsg + check);
if(check>0 && readBoard.getPath()!=null) {
// 파일 지우기
File file = new File(readBoard.getPath());
if(file.exists() && file.isFile()) {
file.delete();
}
}
request.setAttribute("check", check);
request.setAttribute("pageNumber", pageNumber);
return "/WEB-INF/views/fileboard/deleteOk.jsp";
}
}
'Coding > JSP' 카테고리의 다른 글
로그메시지/ 플러그인 다운 (0) | 2022.04.08 |
---|---|
[MVC/DB연동] 회원가입 페이지 (아이디 중복체크, 유효성검사, 우편번호 검색 기능) (1) (0) | 2022.04.08 |
[MVC/DB연동] 로그인 페이지 (로그아웃, 회원수정, 회원탈퇴 기능) (2) (0) | 2022.04.08 |
JSTL(JSP Standard Tag Library) 다운로드 / c:set, c:remove (0) | 2022.04.04 |
EL, JSTL (0) | 2022.04.04 |