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;
}
}
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;
}
}
<%@ 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>
<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>
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 {
// DAO 생성
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에 저장
map.put("searchField", searchField);
map.put("searchWord", searchWord);
}
int totalCount = dao.selectCount(map); // 게시물 개수
/* 페이지 처리 start */
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);
/* 페이지 처리 end */
List<MVCBoardDTO> boardLists = dao.selectListPage(map); // 게시물 목록 받기
dao.close(); // DB 연결 닫기
// 뷰에 전달할 매개변수 추가
String pagingImg = BoardPage.pagingStr(totalCount, pageSize,
blockPage, pageNum, "../mvcboard/list.do"); // 바로가기 영역 HTML 문자열
map.put("pagingImg", pagingImg);
map.put("totalCount", totalCount);
map.put("pageSize", pageSize);
map.put("pageNum", pageNum);
// 전달할 데이터를 request 영역에 저장 후 List.jsp로 포워드
req.setAttribute("boardLists", boardLists);
req.setAttribute("map", map);
req.getRequestDispatcher("/14MVCBoard/List.jsp").forward(req, resp);
}
}
<%@ 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>
<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>
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);
}
}
<%@ 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>
// 게시글 데이터를 받아 DB에 추가합니다(파일 업로드 지원).
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;
}
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 {
// 파일 업로드(multipart/form-data 요청) 처리
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;
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 1. 파일 업로드 처리 =============================
// 업로드 디렉터리의 물리적 경로 확인
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;
}
// 2. 파일 업로드 외 처리 =============================
// 폼값을 DTO에 저장
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); // 서버에 저장된 파일 이름
}
// DAO를 통해 DB에 게시 내용 저장
MVCBoardDAO dao = new MVCBoardDAO();
int result = dao.insertWrite(dto);
dao.close();
// 성공 or 실패?
if (result == 1) { // 글쓰기 성공
resp.sendRedirect("../mvcboard/list.do");
}
else { // 글쓰기 실패
resp.sendRedirect("../mvcboard/write.do");
}
}
// 메시지 알림창을 띄운 후 명시한 URL로 이동합니다.
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) {}
}
// 주어진 일련번호에 해당하는 게시물을 DTO에 담아 반환합니다.
public MVCBoardDTO selectView(String idx) {
MVCBoardDTO dto = new MVCBoardDTO(); // DTO 객체 생성
String query = "SELECT * FROM mvcboard WHERE idx=?"; // 쿼리문 템플릿 준비
try {
psmt = con.prepareStatement(query); // 쿼리문 준비
psmt.setString(1, idx); // 인파라미터 설정
rs = psmt.executeQuery(); // 쿼리문 실행
if (rs.next()) { // 결과를 DTO 객체에 저장
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; // 결과 반환
}
<%@ 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>
// 다운로드 횟수를 1 증가시킵니다.
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) {}
}
// 명시한 파일을 찾아 다운로드합니다.
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() );
//out.clear(); // 출력 스트림 초기화
// response 내장 객체로부터 새로운 출력 스트림 생성
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();
}
}
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);
// 해당 게시물의 다운로드 수 1 증가
MVCBoardDAO dao = new MVCBoardDAO();
dao.downCountPlus(idx);
dao.close();
}
}
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);
}
}
<%@ 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>
// 입력한 비밀번호가 지정한 일련번호의 게시물의 비밀번호와 일치하는지 확인합니다.
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;
}
// 지정한 위치의 파일을 삭제합니다.
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();
}
}
@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, "비밀번호 검증에 실패했습니다.");
}
}
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);
}
}
<%@ 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>
// 게시글 데이터를 받아 DB에 저장되어 있던 내용을 갱신합니다(파일 업로드 지원).
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;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 1. 파일 업로드 처리 =============================
// 업로드 디렉터리의 물리적 경로 확인
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;
}
// 2. 파일 업로드 외 처리 =============================
// 수정 내용을 매개변수에서 얻어옴
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");
// 비밀번호는 session에서 가져옴
HttpSession session = req.getSession();
String pass = (String)session.getAttribute("pass");
// DTO에 저장
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에 저장
dto.setOfile(fileName); // 원래 파일 이름
dto.setSfile(newFileName); // 서버에 저장된 파일 이름
// 기존 파일 삭제
FileUtil.deleteFile(req, "/Uploads", prevSfile);
}
else {
// 첨부 파일이 없으면 기존 이름 유지
dto.setOfile(prevOfile);
dto.setSfile(prevSfile);
}
// DB에 수정 내용 반영
MVCBoardDAO dao = new MVCBoardDAO();
int result = dao.updatePost(dto);
dao.close();
// 성공 or 실패?
if (result == 1) { // 수정 성공
session.removeAttribute("pass");
resp.sendRedirect("../mvcboard/view.do?idx=" + idx);
}
else { // 수정 실패
JSFunction.alertLocation(resp, "비밀번호 검증을 다시 진행해주세요.",
"../mvcboard/view.do?idx=" + idx);
}
}
새 프로젝트 만들기
pom.xml에 maven ropository 추가
META-INF > context.xml 파일 생성
구성편집
- 배포 : /
src>main>java>새로만들기>패키지>model2>
JDBC connect pool 설정
src>main>java>새로만들기>패키지>common>
java>model2>MVCBoardDAO.java
java>model2>BoardListController.java
web.xml에 servlet 매핑
src>webapp>새로만들기>경로>board>list.jsp
💡 jQuery 적용
: jQuery cdn > jQuery 3.x > minified 복사 후 JSP파일 title 밑에 붙여넣기