
// 글 상세
public BoardVO getBoard(int num) throws Exception{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
BoardVO board = null;
try {
conn=DBUtil.getConnection();
sql = "SELECT * FROM svboard WHERE num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();
if(rs.next()) {
board = new BoardVO();
board.setNum(rs.getInt("num"));
board.setTitle(rs.getString("title"));
board.setName(rs.getString("name"));
board.setEmail(rs.getString("email"));
board.setContent(rs.getString("content"));
board.setIp(rs.getString("ip"));
board.setPasswd(rs.getString("passwd"));
board.setReg_date(rs.getDate("reg_date"));
}
} catch (Exception e) {
throw new Exception(e);
} finally {
DBUtil.executeClose(rs, pstmt, conn);
}
return board;
}
package kr.board.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.board.dao.BoardDAO;
import kr.board.vo.BoardVO;
import kr.controller.Action;
public class DetailAction implements Action{
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 전송된 데이터 인코딩 타입 지정
request.setCharacterEncoding("utf-8");
int num = Integer.parseInt(request.getParameter("num"));
BoardVO boardVO = new BoardVO();
BoardDAO dao = BoardDAO.getInstance();
boardVO = dao.getBoard(num);
// 데이터를 request 객체에 저장하여 JSP로 전달
request.setAttribute("boardVO", boardVO);
return "/WEB-INF/views/detail.jsp";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="kr.board.dao.BoardDAO"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 상세 정보</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&display=swap" rel="stylesheet">
</head>
<body>
<div class="page-main">
<h2>글 상세 보기</h2>
<ul id="detail_page">
<li>글 번호 : ${boardVO.num}</li>
<li>제목 : ${boardVO.title}</li>
<li>작성자 : ${boardVO.name}</li>
<li>이메일 : ${boardVO.email}</li>
</ul>
<hr width="100%" size="1" noshade="noshade">
<p>${boardVO.content}</p>
<hr width="100%" size="1" noshade="noshade">
<div class="align-right" id="detail_btn">
작성일 : ${boardVO.reg_date}
<input type="button" value="수정" onclick="location.href='updateForm.do?num=${boardVO.num}'">
<input type="button" value="삭제" onclick="location.href='deleteForm.do?num=${boardVO.num}'">
<input type="button" value="목록" onclick="location.href='list.do'">
</div>
</div>
</body>
</html>

// 글 수정
public void update(BoardVO boardVO) throws Exception{
Connection conn = null;
PreparedStatement pstmt = null;
String sql = null;
try {
conn=DBUtil.getConnection();
sql = "UPDATE svboard SET title=?, name=?, content=?, email=?, ip=? WHERE num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, boardVO.getTitle());
pstmt.setString(2, boardVO.getName());
pstmt.setString(3, boardVO.getContent());
pstmt.setString(4, boardVO.getEmail());
pstmt.setString(5, boardVO.getIp());
pstmt.setInt(6, boardVO.getNum());
pstmt.executeUpdate();
} catch (Exception e) {
throw new Exception(e);
} finally {
DBUtil.executeClose(null, pstmt, conn);
}
}
package kr.board.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.board.dao.BoardDAO;
import kr.board.vo.BoardVO;
import kr.controller.Action;
public class ModifyFormAction implements Action{
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("UTF-8");
int num = Integer.parseInt(request.getParameter("num"));
BoardVO boardVO = new BoardVO();
BoardDAO dao = BoardDAO.getInstance();
boardVO = dao.getBoard(num);
request.setAttribute("boardVO", boardVO);
return "/WEB-INF/views/modifyForm.jsp";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 수정하기</title>
<link rel="stylesheet"
href="${pageContext.request.contextPath}/css/style.css" type="text/css">
<link
href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&display=swap"
rel="stylesheet">
<script type="text/javascript">
window.onload = function() {
const myForm = document.getElementById('modify_form')
myForm.onsubmit = function() {
const items = document
.querySelectorAll('input[type="text"],input[type="password"],input[type="email"],textarea')
for (let i = 0; i < items.length; i++) {
if (items[i].value.trim() == '') {
const label = document.querySelector('label[for="'+ items[i].id + '"]');
alert(label.textContent + ' 항목은 필수 입력하셔야 합니다.');
items[i].value = '';
items[i].focus();
return false;
} // end of if
} // end of for
return true;
};
};
</script>
</head>
<body>
<div class="page-main">
<h2>글 수정</h2>
<form action="modify.do" id="modify_form" method="post">
<input type="hidden" value="${boardVO.num}" name="num">
<ul>
<li>
<label for="title">제목</label>
<input type="text" id="title" name="title" size="30" maxlength="50" value="${boardVO.getTitle()}">
</li>
<li>
<label for="name">작성자</label>
<input type="text" id="name" name="name" size="10" maxlength="10" value="${boardVO.getName()}">
</li>
<li>
<label for="passwd">비밀번호</label>
<input type="password" id="passwd" name="passwd" size="12" maxlength="12">
</li>
<li>
<label for="email">이메일</label>
<input type="email" id="email" name="email" size="20" maxlength="50" value="${boardVO.getEmail()}">
</li>
<li>
<label for="content">내용</label>
<textarea rows="15" cols="55" id="content" name="content">${boardVO.getContent()}</textarea>
</li>
</ul>
<div class="align-center">
<input type="submit" value="글 수정">
<input type="button" value="목록" onclick="location.href='list.do'">
</div>
</form>
</div>
</body>
</html>
package kr.board.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.board.dao.BoardDAO;
import kr.board.vo.BoardVO;
import kr.controller.Action;
public class ModifyAction implements Action{
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
BoardVO boardVO = new BoardVO();
boardVO.setNum(Integer.parseInt(request.getParameter("num")));
boardVO.setTitle(request.getParameter("title"));
boardVO.setName(request.getParameter("name"));
boardVO.setPasswd(request.getParameter("passwd"));
boardVO.setEmail(request.getParameter("email"));
boardVO.setContent(request.getParameter("content"));
boardVO.setIp(request.getRemoteAddr());
BoardDAO dao = BoardDAO.getInstance();
BoardVO db_board = dao.getBoard(boardVO.getNum());
boolean check = false;
if(db_board != null) { // 게시물이 존재할 때 비밀번호 확인
check = db_board.isCheckedPassword(boardVO.getPasswd());
}
if(check) { // 비밀번호가 일치할 때 update 메소드 실행
dao.update(boardVO);
// 상세페이지로 이동하기 위해 글 번호를 저장
request.setAttribute("num", boardVO.getNum());
}
request.setAttribute("check", check);
return "/WEB-INF/views/modify.jsp";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${check }">
<script type="text/javascript">
alert('글 수정을 완료하였습니다.');
location.href ='detail.do?num=${num}';
</script>
</c:if>
<c:if test="${!check }">
<script type="text/javascript">
alert('비밀번호가 불일치합니다.');
history.go(-1);
</script>
</c:if>



// 글 삭제
public void delete(int num) throws Exception{
Connection conn = null;
PreparedStatement pstmt = null;
String sql = null;
try {
conn = DBUtil.getConnection();
sql = "DELETE FROM svboard WHERE num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.executeUpdate();
} catch (Exception e) {
throw new Exception(e);
} finally {
DBUtil.executeClose(null, pstmt, conn);
}
}
package kr.board.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.controller.Action;
public class DeleteFormAction implements Action{
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
int num = Integer.parseInt(request.getParameter("num"));
request.setAttribute("num", num);
return "/WEB-INF/views/deleteForm.jsp";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
int num = Integer.parseInt(request.getParameter("num"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 삭제</title>
<link rel="stylesheet" href="<%= request.getContextPath() %>/css/style.css">
<link
href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&display=swap"
rel="stylesheet">
<script type="text/javascript">
window.onload=function(){
const myForm = document.getElementById('delete_form');
// 이벤트 연결
myForm.onsubmit=function(){
const passwd = document.getElementById('passwd');
if(passwd.value.trim()==''){
alert('비밀번호를 입력하세요');
passwd.value='';
passwd.focus();
return false;
}
}
}
</script>
</head>
<body>
<div class="page-main">
<h2>글 삭제</h2>
<form action="delete.do" method="post" id="delete_form">
<input type="hidden" name="num" value="${num}">
<ul>
<li>
<label for="passwd">비밀번호</label>
<input type="password" name="passwd" id="passwd" size="12" maxlength="12">
</li>
</ul>
<div class="align-center">
<input type="submit" value="삭제">
<input type="button" value="목록" onclick="location.href='list.do'">
</div>
</form>
</div>
</body>
</html>
package kr.board.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.board.dao.BoardDAO;
import kr.board.vo.BoardVO;
import kr.controller.Action;
public class DeleteAction implements Action{
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
BoardVO boardVO = new BoardVO();
boardVO.setNum(Integer.parseInt(request.getParameter("num")));
boardVO.setPasswd(request.getParameter("passwd"));
BoardDAO dao = BoardDAO.getInstance();
BoardVO db_board = dao.getBoard(boardVO.getNum());
boolean check = false;
if(db_board != null) { // 게시물이 존재할 때 비밀번호 확인
check = db_board.isCheckedPassword(boardVO.getPasswd());
}
if(check) { // 비밀번호가 일치할 때 delete 메소드 실행
dao.delete(boardVO.getNum());
}
request.setAttribute("check", check);
return "/WEB-INF/views/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" %>
<c:if test="${check}">
<script type="text/javascript">
alert('글 삭제를 완료하였습니다.');
location.href ='list.do';
</script>
</c:if>
<c:if test="${!check}">
<script type="text/javascript">
alert('비밀번호가 불일치합니다.');
history.go(-1);
</script>
</c:if>
삭제 버튼 클릭시 화면 이동

비밀번호 불일치시 나타나는 ALERT창

비밀번호 일치시 나타나느 ALERT창

삭제 후 list 화면으로 이동

project 우클릭 -> export -> warfile


ch05_mvcNews war file import 해서 가져오기
create table dailynews(
num number primary key,
title varchar2(150) not null,
writer varchar2(30) not null,
passwd varchar2(12) not null,
email varchar2(50) not null,
article clob not null,
filename varchar2(200) not null,
reg_date date default SYSDATE not null
);
create sequence dailynews_seq;
파일은 하나만 업로드 하기 때문에 크기 5메가 한도
<multipart-config>
<max-file-size>5242880</max-file-size>
<max-request-size>5242880</max-request-size>
</multipart-config>
package kr.util;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;
public class FileUtil {
// 업로드 상대 경로
private static final String UPLOAD_PATH = "/upload";
// 파일 생성
public static String createFile(HttpServletRequest request, String param) throws IllegalStateException, ServletException, IOException{
// 업로드 절대 경로
String upload = request.getServletContext().getRealPath(UPLOAD_PATH);
// 파일 정보 얻기
Part part = request.getPart(param);
String filename = part.getSubmittedFileName();
if(filename!=null) {
// 파일 중복 방지를 위해 임의의 값_원래 파일명 형식으로 변경
filename = UUID.randomUUID()+"_"+filename;
part.write(upload+"/"+filename);
}
return filename;
}
// 파일 삭제
public static void removeFile(HttpServletRequest request, String filename) {
if(filename != null) {
// 업로드 절대 경로
String upload = request.getServletContext().getRealPath(UPLOAD_PATH);
File file = new File(upload+"/"+filename);
if(file.exists()) file.delete();
}
}
}