14.1 프로젝트 구상
14.1.1 자료실형 게시판의 프로세스
![](https://velog.velcdn.com/images/aljae/post/7c75014b-9548-4eea-8e1f-5c25c6571c69/image.jpeg)
14.2 목록 보기
14.2.1 테이블 생성
![](https://velog.velcdn.com/images/aljae/post/b611224b-9a53-4849-9fc1-b1e053418c92/image.png)
![](https://velog.velcdn.com/images/aljae/post/3a6397e7-778f-4a8d-b98f-31b6e86e541b/image.png)
![](https://velog.velcdn.com/images/aljae/post/ed885ed4-aa32-4abb-9e44-477fabe5715b/image.png)
14.2.2 DTO 및 DAO 클래스 생성
MVCBoardDRO.java
package model2.mvcboard;
public class MVCBoardDTO {
private String idx;
private String name;
private String title;
private String content;
private java.sql.Date postdate;
private String ofile;
private String sfile;
private int downcount;
private String pass;
private int visitcount;
public String getIdx() {
return idx;
}
public void setIdx(String idx) {
this.idx = idx;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public java.sql.Date getPostdate() {
return postdate;
}
public void setPostdate(java.sql.Date postdate) {
this.postdate = postdate;
}
public String getOfile() {
return ofile;
}
public void setOfile(String ofile) {
this.ofile = ofile;
}
public String getSfile() {
return sfile;
}
public void setSfile(String sfile) {
this.sfile = sfile;
}
public int getDowncount() {
return downcount;
}
public void setDowncount(int downcount) {
this.downcount = downcount;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public int getVisitcount() {
return visitcount;
}
public void setVisitcount(int visitcount) {
this.visitcount = visitcount;
}
}
MVCBoardDAO.java
package model2.mvcboard;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import common.DBConnPool;
public class MVCBoardDAO extends DBConnPool {
public MVCBoardDAO() {
super();
}
public int selectCount(Map<String, Object> map) {
int totalCount = 0;
String query = "SELECT COUNT(*) FROM mvcboard";
if (map.get("searchWord") != null) {
query += " WHERE " + map.get("searchField") + " "
+ " LIKE '%" + map.get("searchWord") + "%'";
}
try {
stmt = con.createStatement();
rs = stmt.executeQuery(query);
rs.next();
totalCount = rs.getInt(1);
}
catch (Exception e) {
System.out.println("게시물 카운트 중 예외 발생");
e.printStackTrace();
}
return totalCount;
}
public List<MVCBoardDTO> selectListPage(Map<String,Object> map) {
List<MVCBoardDTO> board = new Vector<MVCBoardDTO>();
String query = " "
+ "SELECT * FROM ( "
+ " SELECT Tb.*, ROWNUM rNum FROM ( "
+ " SELECT * FROM mvcboard ";
if (map.get("searchWord") != null)
{
query += " WHERE " + map.get("searchField")
+ " LIKE '%" + map.get("searchWord") + "%' ";
}
query += " ORDER BY idx DESC "
+ " ) Tb "
+ " ) "
+ " WHERE rNum BETWEEN ? AND ?";
try {
psmt = con.prepareStatement(query);
psmt.setString(1, map.get("start").toString());
psmt.setString(2, map.get("end").toString());
rs = psmt.executeQuery();
while (rs.next()) {
MVCBoardDTO dto = new MVCBoardDTO();
dto.setIdx(rs.getString(1));
dto.setName(rs.getString(2));
dto.setTitle(rs.getString(3));
dto.setContent(rs.getString(4));
dto.setPostdate(rs.getDate(5));
dto.setOfile(rs.getString(6));
dto.setSfile(rs.getString(7));
dto.setDowncount(rs.getInt(8));
dto.setPass(rs.getString(9));
dto.setVisitcount(rs.getInt(10));
board.add(dto);
}
}
catch (Exception e) {
System.out.println("게시물 조회 중 예외 발생");
e.printStackTrace();
}
return board;
}
}
14.2.3 진입 화면 작성
Default.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 첨부형 게시판</title>
</head>
<body>
<h2>파일 첨부형 게시판</h2>
<a href="../mvcboard/list.do">게시판 목록 바로가기</a>
</body>
</html>
![](https://velog.velcdn.com/images/aljae/post/69219391-14b1-4a65-b906-0a0dd79c42ba/image.png)
web.xml
<servlet>
<servlet-name>MVCBoardList</servlet-name>
<servlet-class>model2.mvcboard.ListController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MVCBoardList</servlet-name>
<url-pattern>/mvcboard/list.do</url-pattern>
</servlet-mapping>
14.2.4 컨트롤러(서블릿) 작성
ListController.java
package model2.mvcboard;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import utils.BoardPage;
public class ListController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
MVCBoardDAO dao = new MVCBoardDAO();
Map<String, Object> map = new HashMap<String, Object>();
String searchField = req.getParameter("searchField");
String searchWord = req.getParameter("searchWord");
if (searchWord != null) {
map.put("searchField", searchField);
map.put("searchWord", searchWord);
}
int totalCount = dao.selectCount(map);
ServletContext application = getServletContext();
int pageSize = Integer.parseInt(application.getInitParameter("POSTS_PER_PAGE"));
int blockPage = Integer.parseInt(application.getInitParameter("PAGES_PER_BLOCK"));
int pageNum = 1;
String pageTemp = req.getParameter("pageNum");
if (pageTemp != null && !pageTemp.equals(""))
pageNum = Integer.parseInt(pageTemp);
int start = (pageNum - 1) * pageSize + 1;
int end = pageNum * pageSize;
map.put("start", start);
map.put("end", end);
List<MVCBoardDTO> boardLists = dao.selectListPage(map);
dao.close();
String pagingImg = BoardPage.pagingStr(totalCount, pageSize,
blockPage, pageNum, "../mvcboard/list.do");
map.put("pagingImg", pagingImg);
map.put("totalCount", totalCount);
map.put("pageSize", pageSize);
map.put("pageNum", pageNum);
req.setAttribute("boardLists", boardLists);
req.setAttribute("map", map);
req.getRequestDispatcher("/14MVCBoard/List.jsp").forward(req, resp);
}
}
14.2.5 뷰(JSP) 만들기
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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 첨부형 게시판</title>
<style>a{text-decoration:none;}</style>
</head>
<body>
<h2>파일 첨부형 게시판 - 목록 보기(List)</h2>
<form method="get">
<table border="1" width="90%">
<tr>
<td align="center">
<select name="searchField">
<option value="title">제목</option>
<option value="content">내용</option>
</select>
<input type="text" name="searchWord" />
<input type="submit" value="검색하기" />
</td>
</tr>
</table>
</form>
<table border="1" width="90%">
<tr>
<th width="10%">번호</th>
<th width="*">제목</th>
<th width="15%">작성자</th>
<th width="10%">조회수</th>
<th width="15%">작성일</th>
<th width="8%">첨부</th>
</tr>
<c:choose>
<c:when test="${ empty boardLists }">
<tr>
<td colspan="6" align="center">
등록된 게시물이 없습니다^^*
</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach items="${ boardLists }" var="row" varStatus="loop">
<tr align="center">
<td>
${ map.totalCount - (((map.pageNum-1) * map.pageSize) + loop.index)}
</td>
<td align="left">
<a href="../mvcboard/view.do?idx=${ row.idx }">${ row.title }</a>
</td>
<td>${ row.name }</td>
<td>${ row.visitcount }</td>
<td>${ row.postdate }</td>
<td>
<c:if test="${ not empty row.ofile }">
<a href="../mvcboard/download.do?ofile=${ row.ofile }&sfile=${ row.sfile }&idx=${ row.idx }">[Down]</a>
</c:if>
</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
<table border="1" width="90%">
<tr align="center">
<td>
${ map.pagingImg }
</td>
<td width="100"><button type="button"
onclick="location.href='../mvcboard/write.do';">글쓰기</button></td>
</tr>
</table>
</body>
</html>
![](https://velog.velcdn.com/images/aljae/post/17e3305c-b681-42eb-80ac-80f3df85ef42/image.png)
![](https://velog.velcdn.com/images/aljae/post/746f06ce-16f1-4338-9ceb-b77869569f5f/image.png)
14.3 글쓰기
14.3.1 요청명/서블릿 매핑
web.xml
<servlet>
<servlet-name>MVCBoardWrite</servlet-name>
<servlet-class>model2.mvcboard.WriteController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MVCBoardWrite</servlet-name>
<url-pattern>/mvcboard/write.do</url-pattern>
</servlet-mapping>
<context-param>
<param-name>maxPostSize</param-name>
<param-value>1024000</param-value>
</context-param>
14.3.2 컨트롤러 작성 1 - 작성 폼으로 진입
WriteController.java
package model2.mvcboard;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.oreilly.servlet.MultipartRequest;
import fileupload.FileUtil;
import utils.JSFunction;
public class WriteController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.getRequestDispatcher("/14MVCBoard/Write.jsp").forward(req, resp);
}
}
14.3.3 뷰 작성
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>
<html>
<head>
<meta charset="UTF-8">
<title>파일 첨부형 게시판</title>
<script type="text/javascript">
function validateForm(form) {
if (form.name.value == "") {
alert("작성자를 입력하세요.");
form.name.focus();
return false;
}
if (form.title.value == "") {
alert("제목을 입력하세요.");
form.title.focus();
return false;
}
if (form.content.value == "") {
alert("내용을 입력하세요.");
form.content.focus();
return false;
}
if (form.pass.value == "") {
alert("비밀번호를 입력하세요.");
form.pass.focus();
return false;
}
}
</script>
</head>
<h2>파일 첨부형 게시판 - 글쓰기(Write)</h2>
<form name="writeFrm" method="post" enctype="multipart/form-data"
action="../mvcboard/write.do" onsubmit="return validateForm(this);">
<table border="1" width="90%">
<tr>
<td>작성자</td>
<td>
<input type="text" name="name" style="width:150px;" />
</td>
</tr>
<tr>
<td>제목</td>
<td>
<input type="text" name="title" style="width:90%;" />
</td>
</tr>
<tr>
<td>내용</td>
<td>
<textarea name="content" style="width:90%;height:100px;"></textarea>
</td>
</tr>
<tr>
<td>첨부 파일</td>
<td>
<input type="file" name="ofile" />
</td>
</tr>
<tr>
<td>비밀번호</td>
<td>
<input type="password" name="pass" style="width:100px;" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<button type="submit">작성 완료</button>
<button type="reset">RESET</button>
<button type="button" onclick="location.href='../mvcboard/list.do';">
목록 바로가기
</button>
</td>
</tr>
</table>
</form>
</body>
</html>
14.3.4 모델 작성(DAO에 기능 추가)
MVCBoardDAO.java
public int insertWrite(MVCBoardDTO dto) {
int result = 0;
try {
String query = "INSERT INTO mvcboard ( "
+ " idx, name, title, content, ofile, sfile, pass) "
+ " VALUES ( "
+ " seq_board_num.NEXTVAL,?,?,?,?,?,?)";
psmt = con.prepareStatement(query);
psmt.setString(1, dto.getName());
psmt.setString(2, dto.getTitle());
psmt.setString(3, dto.getContent());
psmt.setString(4, dto.getOfile());
psmt.setString(5, dto.getSfile());
psmt.setString(6, dto.getPass());
result = psmt.executeUpdate();
}
catch (Exception e) {
System.out.println("게시물 입력 중 예외 발생");
e.printStackTrace();
}
return result;
}
14.3.5 컨트롤러 작성 2 - 폼값 처리
FileUtil.java
package fileupload;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.oreilly.servlet.MultipartRequest;
public class FileUtil {
public static MultipartRequest uploadFile(HttpServletRequest req,
String saveDirectory, int maxPostSize) {
try {
return new MultipartRequest(req, saveDirectory, maxPostSize, "UTF-8");
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
WriteController.java
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String saveDirectory = req.getServletContext().getRealPath("/Uploads");
ServletContext application = getServletContext();
int maxPostSize = Integer.parseInt(application.getInitParameter("maxPostSize"));
MultipartRequest mr = FileUtil.uploadFile(req, saveDirectory, maxPostSize);
if (mr == null) {
JSFunction.alertLocation(resp, "첨부 파일이 제한 용량을 초과합니다.",
"../mvcboard/write.do");
return;
}
MVCBoardDTO dto = new MVCBoardDTO();
dto.setName(mr.getParameter("name"));
dto.setTitle(mr.getParameter("title"));
dto.setContent(mr.getParameter("content"));
dto.setPass(mr.getParameter("pass"));
String fileName = mr.getFilesystemName("ofile");
if (fileName != null) {
String now = new SimpleDateFormat("yyyyMMdd_HmsS").format(new Date());
String ext = fileName.substring(fileName.lastIndexOf("."));
String newFileName = now + ext;
File oldFile = new File(saveDirectory + File.separator + fileName);
File newFile = new File(saveDirectory + File.separator + newFileName);
oldFile.renameTo(newFile);
dto.setOfile(fileName);
dto.setSfile(newFileName);
}
MVCBoardDAO dao = new MVCBoardDAO();
int result = dao.insertWrite(dto);
dao.close();
if (result == 1) {
resp.sendRedirect("../mvcboard/list.do");
}
else {
resp.sendRedirect("../mvcboard/write.do");
}
}
JSFunction.java
public static void alertLocation(HttpServletResponse resp, String msg, String url) {
try {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
String script = ""
+ "<script>"
+ " alert('" + msg + "');"
+ " location.href='" + url + "';"
+ "</script>";
writer.print(script);
}
catch (Exception e) {}
}
public static void alertBack(HttpServletResponse resp, String msg) {
try {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
String script = ""
+ "<script>"
+ " alert('" + msg + "');"
+ " history.back();"
+ "</script>";
writer.print(script);
}
catch (Exception e) {}
}
14.3.6 동작 확인
![](https://velog.velcdn.com/images/aljae/post/a16418ec-7efa-460c-beae-7019ce4833ad/image.png)
![](https://velog.velcdn.com/images/aljae/post/fd43116b-acec-4197-99e8-90f14de8f58a/image.png)
![](https://velog.velcdn.com/images/aljae/post/f9167afb-4ddd-4b93-9977-cfbab1e7ff3b/image.png)
14.4 상세 보기
14.4.1 모델 작성
MVCBoardDAO.java
public MVCBoardDTO selectView(String idx) {
MVCBoardDTO dto = new MVCBoardDTO();
String query = "SELECT * FROM mvcboard WHERE idx=?";
try {
psmt = con.prepareStatement(query);
psmt.setString(1, idx);
rs = psmt.executeQuery();
if (rs.next()) {
dto.setIdx(rs.getString(1));
dto.setName(rs.getString(2));
dto.setTitle(rs.getString(3));
dto.setContent(rs.getString(4));
dto.setPostdate(rs.getDate(5));
dto.setOfile(rs.getString(6));
dto.setSfile(rs.getString(7));
dto.setDowncount(rs.getInt(8));
dto.setPass(rs.getString(9));
dto.setVisitcount(rs.getInt(10));
}
}
catch (Exception e) {
System.out.println("게시물 상세보기 중 예외 발생");
e.printStackTrace();
}
return dto;
}
14.4.3 뷰 작성
View.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>
<html>
<head>
<meta charset="UTF-8">
<title>파일 첨부형 게시판</title>
</head>
<body>
<h2>파일 첨부형 게시판 - 상세 보기(View)</h2>
<table border="1" width="90%">
<colgroup>
<col width="15%"/> <col width="35%"/>
<col width="15%"/> <col width="*"/>
</colgroup>
<tr>
<td>번호</td> <td>${ dto.idx }</td>
<td>작성자</td> <td>${ dto.name }</td>
</tr>
<tr>
<td>작성일</td> <td>${ dto.postdate }</td>
<td>조회수</td> <td>${ dto.visitcount }</td>
</tr>
<tr>
<td>제목</td>
<td colspan="3">${ dto.title }</td>
</tr>
<tr>
<td>내용</td>
<td colspan="3" height="100">${ dto.content }</td>
</tr>
<tr>
<td>첨부파일</td>
<td>
<c:if test="${ not empty dto.ofile }">
${ dto.ofile }
<a href="../mvcboard/download.do?ofile=${ dto.ofile }&sfile=${ dto.sfile }&idx=${ dto.idx }">
[다운로드]
</a>
</c:if>
</td>
<td>다운로드수</td>
<td>${ dto.downcount }</td>
</tr>
<tr>
<td colspan="4" align="center">
<button type="button" onclick="location.href='../mvcboard/pass.do?mode=edit&idx=${ param.idx }';">
수정하기
</button>
<button type="button" onclick="location.href='../mvcboard/pass.do?mode=delete&idx=${ param.idx }';">
삭제하기
</button>
<button type="button" onclick="location.href='../mvcboard/list.do';">
목록 바로가기
</button>
</td>
</tr>
</table>
</body>
</html>
14.5 파일 다운로드
14.5.1 모델 작성
MVCBoardDAO.java
public void downCountPlus(String idx) {
String sql = "UPDATE mvcboard SET "
+ " downcount=downcount+1 "
+ " WHERE idx=? ";
try {
psmt = con.prepareStatement(sql);
psmt.setString(1, idx);
psmt.executeUpdate();
}
catch (Exception e) {}
}
14.5.2 컨트롤러 작성
FileUtil.java
public static void download(HttpServletRequest req, HttpServletResponse resp,
String directory, String sfileName, String ofileName) {
String sDirectory = req.getServletContext().getRealPath(directory);
try {
File file = new File(sDirectory, sfileName);
InputStream iStream = new FileInputStream(file);
String client = req.getHeader("User-Agent");
if (client.indexOf("WOW64") == -1) {
ofileName = new String(ofileName.getBytes("UTF-8"), "ISO-8859-1");
}
else {
ofileName = new String(ofileName.getBytes("KSC5601"), "ISO-8859-1");
}
resp.reset();
resp.setContentType("application/octet-stream");
resp.setHeader("Content-Disposition",
"attachment; filename=\"" + ofileName + "\"");
resp.setHeader("Content-Length", "" + file.length() );
OutputStream oStream = resp.getOutputStream();
byte b[] = new byte[(int)file.length()];
int readBuffer = 0;
while ( (readBuffer = iStream.read(b)) > 0 ) {
oStream.write(b, 0, readBuffer);
}
iStream.close();
oStream.close();
}
catch (FileNotFoundException e) {
System.out.println("파일을 찾을 수 없습니다.");
e.printStackTrace();
}
catch (Exception e) {
System.out.println("예외가 발생하였습니다.");
e.printStackTrace();
}
}
DownloadController.java
package model2.mvcboard;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import fileupload.FileUtil;
@WebServlet("/mvcboard/download.do")
public class DownloadController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String ofile = req.getParameter("ofile");
String sfile = req.getParameter("sfile");
String idx = req.getParameter("idx");
FileUtil.download(req, resp, "/Uploads", sfile, ofile);
MVCBoardDAO dao = new MVCBoardDAO();
dao.downCountPlus(idx);
dao.close();
}
}
14.5.3 동작 확인
![](https://velog.velcdn.com/images/aljae/post/5a793982-3f15-4c1c-8300-02c89b55a07f/image.png)
![](https://velog.velcdn.com/images/aljae/post/cec785c0-9176-47f2-b668-e498bcc70d96/image.png)
14.6 삭제하기
14.6.1 요청명/서블릿 매핑
PassController.java
package model2.mvcboard;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import fileupload.FileUtil;
import utils.JSFunction;
@WebServlet("/mvcboard/pass.do")
public class PassController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setAttribute("mode", req.getParameter("mode"));
req.getRequestDispatcher("/14MVCBoard/Pass.jsp").forward(req, resp);
}
}
14.6.2 뷰 작성
Pass.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>
<html>
<head>
<meta charset="UTF-8">
<title>파일 첨부형 게시판</title>
<script type="text/javascript">
function validateForm(form) {
if (form.pass.value == "") {
alert("비밀번호를 입력하세요.");
form.pass.focus();
return false;
}
}
</script>
</head>
<body>
<h2>파일 첨부형 게시판 - 비밀번호 검증(Pass)</h2>
<form name="writeFrm" method="post" action="../mvcboard/pass.do" onsubmit="return validateForm(this);">
<input type="hidden" name="idx" value="${ param.idx }" />
<input type="hidden" name="mode" value="${ param.mode }" />
<table border="1" width="90%">
<tr>
<td>비밀번호</td>
<td>
<input type="password" name="pass" style="width:100px;" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<button type="submit">검증하기</button>
<button type="reset">RESET</button>
<button type="button" onclick="location.href='../mvcboard/list.do';">
목록 바로가기
</button>
</td>
</tr>
</table>
</form>
</body>
</html>
14.6.3 모델 작성
MVCBoardDAO.java
public boolean confirmPassword(String pass, String idx) {
boolean isCorr = true;
try {
String sql = "SELECT COUNT(*) FROM mvcboard WHERE pass=? AND idx=?";
psmt = con.prepareStatement(sql);
psmt.setString(1, pass);
psmt.setString(2, idx);
rs = psmt.executeQuery();
rs.next();
if (rs.getInt(1) == 0) {
isCorr = false;
}
}
catch (Exception e) {
isCorr = false;
e.printStackTrace();
}
return isCorr;
}
public int deletePost(String idx) {
int result = 0;
try {
String query = "DELETE FROM mvcboard WHERE idx=?";
psmt = con.prepareStatement(query);
psmt.setString(1, idx);
result = psmt.executeUpdate();
}
catch (Exception e) {
System.out.println("게시물 삭제 중 예외 발생");
e.printStackTrace();
}
return result;
}
14.6.4 컨트롤러 작성
FileUtil.java
public static void deleteFile(HttpServletRequest req,
String directory, String filename) {
String sDirectory = req.getServletContext().getRealPath(directory);
File file = new File(sDirectory + File.separator + filename);
if (file.exists()) {
file.delete();
}
}
PassController.java
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String idx = req.getParameter("idx");
String mode = req.getParameter("mode");
String pass = req.getParameter("pass");
MVCBoardDAO dao = new MVCBoardDAO();
boolean confirmed = dao.confirmPassword(pass, idx);
dao.close();
if (confirmed) {
if (mode.equals("edit")) {
HttpSession session = req.getSession();
session.setAttribute("pass", pass);
resp.sendRedirect("../mvcboard/edit.do?idx=" + idx);
}
else if (mode.equals("delete")) {
dao = new MVCBoardDAO();
MVCBoardDTO dto = dao.selectView(idx);
int result = dao.deletePost(idx);
dao.close();
if (result == 1) {
String saveFileName = dto.getSfile();
FileUtil.deleteFile(req, "/Uploads", saveFileName);
}
JSFunction.alertLocation(resp, "삭제되었습니다.", "../mvcboard/list.do");
}
}
else {
JSFunction.alertBack(resp, "비밀번호 검증에 실패했습니다.");
}
}
14.6.5 동작확인
![](https://velog.velcdn.com/images/aljae/post/7f180efc-797d-4aa7-9576-76ae2047f773/image.png)
![](https://velog.velcdn.com/images/aljae/post/7ce91b87-26e1-4669-b5c8-349409a375d0/image.png)
![](https://velog.velcdn.com/images/aljae/post/61ebe069-266c-4507-93ca-a00a5d407239/image.png)
![](https://velog.velcdn.com/images/aljae/post/9426949c-7214-43e9-9e26-1a299c3d5eac/image.png)
![](https://velog.velcdn.com/images/aljae/post/f42283e6-1db5-451b-9bb2-4af7f1414133/image.png)
14.7 수정하기
14.7.1 요청명/서블릿 매핑
EditController.java
package model2.mvcboard;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.oreilly.servlet.MultipartRequest;
import fileupload.FileUtil;
import utils.JSFunction;
@WebServlet("/mvcboard/edit.do")
public class EditController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String idx = req.getParameter("idx");
MVCBoardDAO dao = new MVCBoardDAO();
MVCBoardDTO dto = dao.selectView(idx);
req.setAttribute("dto", dto);
req.getRequestDispatcher("/14MVCBoard/Edit.jsp").forward(req, resp);
}
}
14.7.2 뷰 작성
Edit.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>
<html>
<head>
<meta charset="UTF-8">
<title>파일 첨부형 게시판</title>
<script type="text/javascript">
function validateForm(form) {
if (form.name.value == "") {
alert("작성자를 입력하세요.");
form.name.focus();
return false;
}
if (form.title.value == "") {
alert("제목을 입력하세요.");
form.title.focus();
return false;
}
if (form.content.value == "") {
alert("내용을 입력하세요.");
form.content.focus();
return false;
}
}
</script>
</head>
<h2>파일 첨부형 게시판 - 수정하기(Edit)</h2>
<form name="writeFrm" method="post" enctype="multipart/form-data" action="../mvcboard/edit.do" onsubmit="return validateForm(this);">
<input type="hidden" name="idx" value="${ dto.idx }"/>
<input type="hidden" name="prevOfile" value="${ dto.ofile }" />
<input type="hidden" name="prevSfile" value="${ dto.sfile }" />
<table border="1" width="90%">
<tr>
<td>작성자</td>
<td>
<input type="text" name="name" style="width:150px;" value="${ dto.name }" />
</td>
</tr>
<tr>
<td>제목</td>
<td>
<input type="text" name="title" style="width:90%;" value="${ dto.title }" />
</td>
</tr>
<tr>
<td>내용</td>
<td>
<textarea name="content" style="width:90%;height:100px;">${ dto.content }</textarea>
</td>
</tr>
<tr>
<td>첨부 파일</td>
<td>
<input type="file" name="ofile" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<button type="submit">작성 완료</button>
<button type="reset">RESET</button>
<button type="button" onclick="location.href='../mvcboard/list.do';">
목록 바로가기
</button>
</td>
</tr>
</table>
</form>
</body>
</html>
14.7.4 모델 작성
MVCBoardDAO.java
public int updatePost(MVCBoardDTO dto) {
int result = 0;
try {
String query = "UPDATE mvcboard"
+ " SET title=?, name=?, content=?, ofile=?, sfile=? "
+ " WHERE idx=? and pass=?";
psmt = con.prepareStatement(query);
psmt.setString(1, dto.getTitle());
psmt.setString(2, dto.getName());
psmt.setString(3, dto.getContent());
psmt.setString(4, dto.getOfile());
psmt.setString(5, dto.getSfile());
psmt.setString(6, dto.getIdx());
psmt.setString(7, dto.getPass());
result = psmt.executeUpdate();
}
catch (Exception e) {
System.out.println("게시물 수정 중 예외 발생");
e.printStackTrace();
}
return result;
}
14.7.5 컨트롤러 작성
EditController.java
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String saveDirectory = req.getServletContext().getRealPath("/Uploads");
ServletContext application = this.getServletContext();
int maxPostSize = Integer.parseInt(application.getInitParameter("maxPostSize"));
MultipartRequest mr = FileUtil.uploadFile(req, saveDirectory, maxPostSize);
if (mr == null) {
JSFunction.alertBack(resp, "첨부 파일이 제한 용량을 초과합니다.");
return;
}
String idx = mr.getParameter("idx");
String prevOfile = mr.getParameter("prevOfile");
String prevSfile = mr.getParameter("prevSfile");
String name = mr.getParameter("name");
String title = mr.getParameter("title");
String content = mr.getParameter("content");
HttpSession session = req.getSession();
String pass = (String)session.getAttribute("pass");
MVCBoardDTO dto = new MVCBoardDTO();
dto.setIdx(idx);
dto.setName(name);
dto.setTitle(title);
dto.setContent(content);
dto.setPass(pass);
String fileName = mr.getFilesystemName("ofile");
if (fileName != null) {
String now = new SimpleDateFormat("yyyyMMdd_HmsS").format(new Date());
String ext = fileName.substring(fileName.lastIndexOf("."));
String newFileName = now + ext;
File oldFile = new File(saveDirectory + File.separator + fileName);
File newFile = new File(saveDirectory + File.separator + newFileName);
oldFile.renameTo(newFile);
dto.setOfile(fileName);
dto.setSfile(newFileName);
FileUtil.deleteFile(req, "/Uploads", prevSfile);
}
else {
dto.setOfile(prevOfile);
dto.setSfile(prevSfile);
}
MVCBoardDAO dao = new MVCBoardDAO();
int result = dao.updatePost(dto);
dao.close();
if (result == 1) {
session.removeAttribute("pass");
resp.sendRedirect("../mvcboard/view.do?idx=" + idx);
}
else {
JSFunction.alertLocation(resp, "비밀번호 검증을 다시 진행해주세요.",
"../mvcboard/view.do?idx=" + idx);
}
}
14.7.6 동작 확인
![](https://velog.velcdn.com/images/aljae/post/179ee9bd-3de7-4bc7-9714-320d7f6ee734/image.png)
![](https://velog.velcdn.com/images/aljae/post/64b3c342-146d-4479-86ac-b974b996ba3c/image.png)
![](https://velog.velcdn.com/images/aljae/post/3c18a496-282b-45e3-aaeb-218238b723e0/image.png)
![](https://velog.velcdn.com/images/aljae/post/13995175-4f2e-448b-a9c4-d9d8198e963e/image.png)
![](https://velog.velcdn.com/images/aljae/post/639f82ba-8376-43f7-a773-4566f624bdb4/image.png)
정말 잘 읽었습니다, 고맙습니다!