## 64. JSP를 이용하여 MVC 모델1 구조로 변경하기
- MVC 모델1 특징 이해
- JSP 구동 원리 이해 및 사용법
- EL 사용법
이전과 같은 방식을 이용해 java -> jsp 파일로 변경하기
ㄴ webapp > board > list.jsp 파일 복사
=>
ㄴ 복사한 파일을 같은 위치에 detail 이라는 이름으로 붙여넣기
=>
detail.jsp
<%@ page
language="java"
pageEncoding="UTF-8"
contentType="text/html;charset=UTF-8"%> <%-- directive element --%>
<%@ page import="java.io.IOException"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%@ page import="java.util.List"%>
<%@ page import="bitcamp.report.dao.BoardDao"%>
<%@ page import="bitcamp.report.vo.AttachedFile"%>
<%@ page import="bitcamp.report.vo.Board"%>
<%@ page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%
BoardDao boardDao = (BoardDao) this.getServletContext().getAttribute("boardDao");
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) this.getServletContext().getAttribute("sqlSessionFactory");
int category = Integer.parseInt(request.getParameter("category"));
int no = Integer.parseInt(request.getParameter("no"));
Board board = boardDao.findBy(category, no);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>게시글</title>
</head>
<body>
<jsp:include page="../header.jsp"/>
<h1>게시글</h1>
<%
if (board == null) {
%>
<p>해당 번호의 게시글이 없습니다!</p>
<%
} else {
%>
<form action='/board/update' method='post' enctype='multipart/form-data'>
<input type='hidden' name='category' value='<%=board.getCategory()%>'>
<table border='1'>
<tr><th style='width:120px;'>번호</th>
<td style='width:300px;'><input type='text' name='no' value='<%=board.getNo()%>' readonly='readonly'></td></tr>
<tr><th>제목</th>
<td><input type='text' name='title' value='<%=board.getTitle()%>'></td></tr>
<tr><th>내용</th>
<td><textarea name='content' style='height:200px; width:400px;'><%=board.getContent()%></textarea></td></tr>
<tr><th>작성자</th> <td><%=board.getWriter().getName()%></td></tr>
<tr><th>조회수</th> <td><%=board.getViewCount()%></td></tr>
<tr><th>등록일</th> <td><%=String.format("%tY-%1$tm-%1$td", board.getCreatedDate())%></td></tr>
<tr><th>첨부파일</th><td>
<%
for (AttachedFile file : board.getAttachedFiles()) {
%>
<a href='https://kr.object.ncloudstorage.com/bitcamp-nc7-bucket-25/board/<%=file.getFilePath()%>'><%=file.getFilePath()%></a>
[<a href='/board/file/delete?category=<%=category%>&no=<%=file.getNo()%>'>삭제</a>]
<br>
<%
}
%>
<input type='file' name='files' multiple>
</td></tr>
</table>
<div>
<button>변경</button>
<button type='reset'>초기화</button>
<a href='/board/delete?category=<%=board.getCategory()%>&no=<%=board.getNo()%>'>삭제</a>
<a href='/board/list?category=<%=board.getCategory()%>'>목록</a>
</div>
</form>
<%
try {
board.setViewCount(board.getViewCount() + 1);
boardDao.updateCount(board);
sqlSessionFactory.openSession(false).commit();
} catch (Exception e) {
sqlSessionFactory.openSession(false).rollback();
}
}
%>
<jsp:include page="../footer.jsp"/>
</body>
</html>
=>
ㄴ BoardDetailServlet.java 파일 삭제
=>
list.jsp
ㄴ /board/detail -> /board/detail.jsp 로 변경
=>
ㄴ [게시글] 선택
=>
ㄴ 제목 링크 선택
=>
detail.jsp
=>
detail_jsp.java
ㄴ 빈 줄이 "\n" 으로 출력이 됨
=>
detail.jsp
ㄴ trimDirectiveWhitespaces 를 true 로 설정하기
=>
=>
detail_jsp.java
ㄴ 쓸 데 없는 빈 줄이 출력되지 않음
=>
detail.jsp
=>
detail_jsp.java
ㄴ 컴파일 시 해당 코드가 자동으로 생성됨을 확인
detail.jsp
ㄴ /board/update -> /board/update.jsp 로 변경
ㄴ /board/file/delete -> /board/fileDelete.jsp 로 변경
ㄴ /board/delete -> /board/delete.jsp 로 변경
ㄴ /board/list -> /board/list.jsp 로 변경
webapp > board > form.jsp
ㄴ /board/add -> /board/add.jsp 로 변경
ㄴ detail.jsp 파일 복사
=>
ㄴ 같은 위치에 add 라는 이름으로 붙여넣기
=>
add.jsp
ㄴ import 해주기
ㄴ /Users/사용자명/server/apache-tomcat-9.0.78/webapps/examples/WEB-INF/web.xml 파일 열어보기
=>
/Users/사용자명/server/apache-tomcat-9.0.78/webapps/examples/WEB-INF/web.xml
ㄴ 해당 코드 복사
=>
webapp > WEB-INF > web.xml
ㄴ 복사한 코드 붙여넣기
=>
webapp > WEB-INF > web.xml
ㄴ metadata-complete="false" -> "true" 로 변경해주기
=>
webapp > WEB-INF > web.xml
ㄴ 해당 설정 추가
=>
add.jsp
<%@ page
language="java"
pageEncoding="UTF-8"
contentType="text/html;charset=UTF-8"
trimDirectiveWhitespaces="true"%>
<%@ page import="java.io.IOException"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="bitcamp.report.dao.BoardDao"%>
<%@ page import="bitcamp.report.vo.AttachedFile"%>
<%@ page import="bitcamp.report.vo.Board"%>
<%@ page import="bitcamp.report.vo.Member"%>
<%@ page import="bitcamp.util.NcpObjectStorageService"%>
<%@ page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%
Member loginUser = (Member) request.getSession().getAttribute("loginUser");
if (loginUser == null) {
response.sendRedirect("/auth/form.html");
return;
}
BoardDao boardDao = (BoardDao) this.getServletContext().getAttribute("boardDao");
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) this.getServletContext().getAttribute("sqlSessionFactory");
NcpObjectStorageService ncpObjectStorageService = (NcpObjectStorageService) this.getServletContext().getAttribute("ncpObjectStorageService");
try {
// 각각의 파트에서 값을 꺼낸다.
Board board = new Board();
board.setWriter(loginUser);
board.setTitle(request.getParameter("title"));
board.setContent(request.getParameter("content"));
board.setCategory(Integer.parseInt(request.getParameter("category")));
String uploadDir = request.getServletContext().getRealPath("/upload/board/");
System.out.println(uploadDir);
ArrayList<AttachedFile> attachedFiles = new ArrayList<>();
for (Part part : request.getParts()) {
// System.out.println(part.getName());
if (part.getName().equals("files") && part.getSize() > 0) {
String uploadFileUrl = ncpObjectStorageService
.uploadFile("bitcamp-nc7-bucket-25", "board/", part);
AttachedFile attachedFile = new AttachedFile();
attachedFile.setFilePath(uploadFileUrl);
attachedFiles.add(attachedFile);
}
}
board.setAttachedFiles(attachedFiles);
boardDao.insert(board);
if (attachedFiles.size() > 0) {
int count = boardDao.insertFiles(board);
System.out.println(count);
}
sqlSessionFactory.openSession(false).commit();
response.sendRedirect("list?category=" + request.getParameter("category"));
} catch (Exception e) {
sqlSessionFactory.openSession(false).rollback();
// ErrorServlet 으로 포워딩 하기 전에 ErrorServlet이 사용할 데이터를
// ServletRequest 보관소에 저장한다.
request.setAttribute("error", e);
request.setAttribute("message", "게시글 등록 오류!");
request.setAttribute("refresh", "2;url=list?category=" + request.getParameter("category"));
request.getRequestDispatcher("/error").forward(request, response);
}
%>
=>
ㄴ App 실행
=>
=>
ㄴ [게시글] 선택
=>
ㄴ [새 글] 선택
=>
ㄴ [등록] 선택
=>
=>
webapp > board > web.xml
ㄴ <servlet-mapping> 태그 추가
=>
ㄴ [Stop and Return] 선택하여 App Restart
=>
ㄴ [등록] 선택
=>
=>
ㄴ 서버를 재시작 했으므로 로그인 다시 해야 함
=>
=>
=>
add.jsp
ㄴ list -> list.jsp 로 변경해주기
=>
ㄴ [등록] 선택
=>
ㄴ 등록한 게시글 제목 링크 선택
=>
ㄴ 상세보기 확인 시 정상적으로 등록됨을 확인
주의!! 윈도우는 /tmp 폴더가 없으므로 webapp/WEB-INF/web.xml 파일 설정에서 폴더를 지정해주면 안 됨
=>
webapp/WEB-INF/web.xml
=>
webapp/WEB-INF/web.xml
ㄴ <location>/tmp</location> 제거
=>
=>
ㄴ 참고하여 에러 페이지를 만들어보자
=>
ㄴ header.jsp 파일 복사
=>
ㄴ 복사한 파일을 같은 위치에 error 라는 이름으로 붙여넣기
=>
error.jsp
<%@ page
language="java"
pageEncoding="UTF-8"
contentType="text/html;charset=UTF-8"%>
<%@ page import ="bitcamp.report.vo.Member"%>
<%
if (request.getAttribute("refresh") != null) {
response.setHeader("Refresh", (String)request.getAttribute("refresh"));
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>게시글</title>
</head>
<body>
<jsp:include page="header.jsp"/>
<h1>실행 오류!</h1>
<%
if (request.getAttribute("message") != null) {
out.println(String.format("<p>%s</p>\n", request.getAttribute("message")));
}
%>
<jsp:include page="footer.jsp"/>
</body>
</html>
add.jsp
ㄴ try~catch 문 없애기
=>
add.jsp
ㄴ 필요 없는 코드 제거
=>
add.jsp
ㄴ errorPage 설정 추가해주기
=>
ㄴ 제목에 255자 넘게 입력하여 일부러 에러 발생 시키키
=>
error.jsp
ㄴ isErrorPage 설정을 true 로 설정
=>
=>
error_jsp.java
ㄴ 컴파일 시 error_jsp 파일에 해당 코드가 자동 생성됨
error.jsp
=>
ㄴ 해당 표현식 이용하기
=>
=>
ㄴ 에러가 위와 같이 출력됨을 확인
=>
add.jsp
ㄴ 오류가 발생했을 때 refresh 할 URL 지정하기
=>
ㄴ 에러 페이지 2초간 출력 후 게시글 목록을 돌아감
ㄴ add.jsp 파일을 복사
=>
ㄴ 복사한 파일을 같은 위치에 update 라는 이름으로 붙여넣기
=>
update.jsp
<%@ page
language="java"
pageEncoding="UTF-8"
contentType="text/html;charset=UTF-8"
trimDirectiveWhitespaces="true"
errorPage="/error.jsp"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="bitcamp.report.dao.BoardDao"%>
<%@ page import="bitcamp.report.vo.AttachedFile"%>
<%@ page import="bitcamp.report.vo.Board"%>
<%@ page import="bitcamp.report.vo.Member"%>
<%@ page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%@ page import="bitcamp.util.NcpObjectStorageService"%>
<%
Member loginUser = (Member) request.getSession().getAttribute("loginUser");
if (loginUser == null) {
response.sendRedirect("/auth/form.html");
return;
}
BoardDao boardDao = (BoardDao) this.getServletContext().getAttribute("boardDao");
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) this.getServletContext().getAttribute("sqlSessionFactory");
NcpObjectStorageService ncpObjectStorageService = (NcpObjectStorageService) this.getServletContext().getAttribute("ncpObjectStorageService");
try {
Board board = new Board();
board.setWriter(loginUser);
board.setNo(Integer.parseInt(request.getParameter("no")));
board.setTitle(request.getParameter("title"));
board.setContent(request.getParameter("content"));
board.setCategory(Integer.parseInt(request.getParameter("category")));
ArrayList<AttachedFile> attachedFiles = new ArrayList<>();
for (Part part : request.getParts()) {
if (part.getName().equals("files") && part.getSize() > 0) {
String uploadFileUrl = ncpObjectStorageService.uploadFile(
"bitcamp-nc7-bucket-25", "board/", part);
AttachedFile attachedFile = new AttachedFile();
attachedFile.setFilePath(uploadFileUrl);
attachedFiles.add(attachedFile);
}
}
board.setAttachedFiles(attachedFiles);
if (boardDao.update(board) == 0) {
throw new Exception("게시글이 없거나 변경 권한이 없습니다.");
} else {
if (attachedFiles.size() > 0) {
int count = boardDao.insertFiles(board);
System.out.println(count);
}
sqlSessionFactory.openSession(false).commit();
response.sendRedirect("list?category=" + request.getParameter("category"));
}
} catch (Exception e) {
sqlSessionFactory.openSession(false).rollback();
request.setAttribute("error", e);
request.setAttribute("message", e.getMessage());
request.setAttribute("refresh", "2;url=list?category=" + request.getParameter("category"));
request.getRequestDispatcher("/error").forward(request, response);
}
%>
=>
update.jsp
ㄴ try~catch 문 제거
=>
update.jsp
ㄴ 에러 발생 시 리프레시 할 경로 설정
=>
update.jsp
ㄴ list -> list.jsp 로 변경 해주기
=>
webapp > WEB-INF > web.xml
ㄴ 해당 코드 복사
=>
webapp > WEB-INF > web.xml
ㄴ 바로 아래쪽에 복사한 코드 붙여넣은 후 add -> update 변경해주기
=>
App 재실행
=>
=>
[게시글] 선택
=>
=>
ㄴ 게시글 내용 변경 후 [변경] 선택
=>
=>
ㄴ 정상적으로 변경됨을 확인
ㄴ BoardUpdateServlet.java 파일 삭제
ㄴ update.jsp 파일 복사하기
=>
ㄴ 복사한 파일을 같은 위치에 delete 라는 이름으로 붙여넣기
=>
ㄴ BoardAddServlet.java, BoardDeleteServlet.java, ErrorServlet.java, FooterServlet.java, HeaderServlet.java 파일 삭제
=>
delete.jsp
<%@ page
language="java"
pageEncoding="UTF-8"
contentType="text/html;charset=UTF-8"
trimDirectiveWhitespaces="true"
errorPage="/error.jsp"%>
<%@ page import="bitcamp.report.dao.BoardDao"%>
<%@ page import="bitcamp.report.vo.AttachedFile"%>
<%@ page import="bitcamp.report.vo.Board"%>
<%@ page import="bitcamp.report.vo.Member"%>
<%@ page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%@ page import="bitcamp.util.NcpObjectStorageService"%>
<%
Member loginUser = (Member) request.getSession().getAttribute("loginUser");
if (loginUser == null) {
response.sendRedirect("/auth/form.html");
return;
}
int category = Integer.parseInt(request.getParameter("category"));
Board b = new Board();
b.setNo(Integer.parseInt(request.getParameter("no")));
b.setWriter(loginUser);
b.setCategory(category);
BoardDao boardDao = (BoardDao) this.getServletContext().getAttribute("boardDao");
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) this.getServletContext().getAttribute("sqlSessionFactory");
try {
if (boardDao.delete(b) == 0) {
throw new Exception("해당 번호의 게시글이 없거나 삭제 권한이 없습니다.");
} else {
sqlSessionFactory.openSession(false).commit();
response.sendRedirect("list?category=" + request.getParameter("category"));
}
} catch (Exception e) {
sqlSessionFactory.openSession(false).rollback();
request.setAttribute("error", e);
request.setAttribute("message", e.getMessage());
request.setAttribute("refresh", "2;url=list?category=" + request.getParameter("category"));
request.getRequestDispatcher("/error").forward(request, response);
}
%>
=>
delete.jsp
ㄴ try~catch 문 제거
=>
delete.jsp
<%@ page
language="java"
pageEncoding="UTF-8"
contentType="text/html;charset=UTF-8"
trimDirectiveWhitespaces="true"
errorPage="/error.jsp"%>
<%@ page import="bitcamp.report.dao.BoardDao"%>
<%@ page import="bitcamp.report.vo.AttachedFile"%>
<%@ page import="bitcamp.report.vo.Board"%>
<%@ page import="bitcamp.report.vo.Member"%>
<%@ page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%@ page import="bitcamp.util.NcpObjectStorageService"%>
<%
Member loginUser = (Member) request.getSession().getAttribute("loginUser");
if (loginUser == null) {
response.sendRedirect("/auth/form.html");
return;
}
int category = Integer.parseInt(request.getParameter("category"));
Board b = new Board();
b.setNo(Integer.parseInt(request.getParameter("no")));
b.setWriter(loginUser);
b.setCategory(category);
BoardDao boardDao = (BoardDao) this.getServletContext().getAttribute("boardDao");
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) this.getServletContext().getAttribute("sqlSessionFactory");
if (boardDao.delete(b) == 0) {
throw new Exception("해당 번호의 게시글이 없거나 삭제 권한이 없습니다.");
} else {
sqlSessionFactory.openSession(false).commit();
response.sendRedirect("list?category=" + request.getParameter("category"));
}
%>
=>
delete.jsp
ㄴ 에러 발생 시 리프레시 할 경로 추가해주기
=>
delete.jsp
ㄴ list -> list.jsp 로 변경하기
=>
App 재실행
=>
ㄴ [로그인]
=>
ㄴ 로그인 페이지가 노출되지 않고있음
=>
ㄴ 로그인에 필요한 auth 라는 이름의 폴더 추가
=>
ㄴ webapp > board > form.jsp 파일 복사
=>
ㄴ 복사한 파일을 auth 폴더에 같은 이름으로 붙여넣기
=>
ㄴ LoginFormServlet.java 파일 삭제하기
=>
webapp > auth > form.jsp
<%@ page
language="java"
pageEncoding="UTF-8"
contentType="text/html;charset=UTF-8"%>
<%
String phone = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("phone")) {
phone = cookie.getValue();
break;
}
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>비트캠프</title>
</head>
<body>
<jsp:include page="../header.jsp"/>
<h1>로그인</h1>
<form action='/auth/login.jsp' method='post'>
<table border='1'>
<tr>
<th>전화번호</th> <td><input type='tel' name='phone' value='<%=phone%>'></td>
</tr>
<tr>
<th>암호</th> <td><input type='password' name='password'></td>
</tr>
</table>
<button>로그인</button>
<input type='checkbox' name='savePhone'> 전화번호 저장
</form>
<jsp:include page="../footer.jsp"/>
</body>
</html>
header.jsp
ㄴ /auth/form -> /auth/form.jsp 로 변경
ㄴ webapp/board/add.jsp 파일 복사하기
=>
ㄴ 복사한 파일을 login 이라는 이름으로 붙여넣기
=>
ㄴ LoginServlet.java 파일 삭제
=>
webapp > auth > login.jsp
<%@ page
language="java"
pageEncoding="UTF-8"
contentType="text/html;charset=UTF-8"
trimDirectiveWhitespaces="true"
errorPage="/error.jsp"%>
<%@ page import="bitcamp.report.dao.MemberDao"%>
<%@ page import="bitcamp.report.vo.Member"%>
<%
request.setAttribute("refresh", "2;url=/auth/form.jsp");
Member m = new Member();
m.setPhone(request.getParameter("phone"));
m.setPassword(request.getParameter("password"));
if (request.getParameter("savePhone") != null) {
Cookie cookie = new Cookie("phone", m.getPhone());
response.addCookie(cookie);
} else {
Cookie cookie = new Cookie("phone", "no");
cookie.setMaxAge(0);
response.addCookie(cookie);
}
MemberDao memberDao = (MemberDao) this.getServletContext().getAttribute("memberDao");
Member loginUser = memberDao.findByPhoneAndPassword(m);
if (loginUser == null) {
throw new Exception("message", "회원 정보가 일치하지 않습니다.");
return;
}
request.getSession().setAttribute("loginUser", loginUser);
response.sendRedirect("/");
%>
ㄴ webapp/auth/login.jsp 파일 복사하기
=>
ㄴ 복사한 파일을 같은 위치에 logout 이라는 이름으로 붙여넣기
=>
webapp > auth > logout.jsp
<%@ page
language="java"
pageEncoding="UTF-8"
contentType="text/html;charset=UTF-8"
trimDirectiveWhitespaces="true"
errorPage="/error.jsp"%>
<%
request.getSession().invalidate();
response.sendRedirect("/");
%>
=>
webapp > auth > logout.jsp
ㄴ request.getSession() 은 session 으로 적어줘도 됨
=>
=>
App 재실행
=>
ㄴ [로그인] 선택
=>
=>
ㄴ [로그아웃] 선택
=>
=>
header.jsp
ㄴ /auth/logout -> /auth/logout.jsp
=>
ㄴ [로그아웃] 선택
=>
ㄴ 정상적으로 로그아웃 됨을 확인
ㄴ 글 상세보기에서 [삭제] 선택
=>
ㄴ 해당 에러 페이지 2초 동안 노출 후 글 목록으로 이동
=>
ㄴ webapp/board/delete.jsp 파일 복사
=>
ㄴ 복사한 파일을 같은 위치에 fileDelete 라는 이름으로 붙여넣기
=>
fileDelete.jsp
ㄴ 에러 발생 시 리프레시 할 경로 설정
=>
fileDelete.jsp
ㄴ /board/detail -> /board/detail.jsp 로 변경
=>
fileDelete.jsp
<%@ page
language="java"
pageEncoding="UTF-8"
contentType="text/html;charset=UTF-8"
trimDirectiveWhitespaces="true"
errorPage="/error.jsp"%>
<%@ page import="bitcamp.report.dao.BoardDao"%>
<%@ page import="bitcamp.report.vo.AttachedFile"%>
<%@ page import="bitcamp.report.vo.Board"%>
<%@ page import="bitcamp.report.vo.Member"%>
<%@ page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%
request.setAttribute("refresh", "2;url=detail.jsp?category="
+ request.getParameter("category")
+ "&no=" + request.getParameter("no"));
Member loginUser = (Member) request.getSession().getAttribute("loginUser");
if (loginUser == null) {
response.sendRedirect("/auth/form.html");
return;
}
int category = Integer.parseInt(request.getParameter("category"));
int fileNo = Integer.parseInt(request.getParameter("no"));
BoardDao boardDao = (BoardDao) this.getServletContext().getAttribute("boardDao");
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) this.getServletContext().getAttribute("sqlSessionFactory");
// 첨부파일 번호로 첨부파일 데이터를 가져온다.
AttachedFile attachedFile = boardDao.findFileBy(fileNo);
// System.out.println(attachedFile);
// 첨부파일 데이터에 있는 게시글 번호로 게시글 데이터를 가져온다.
Board board = boardDao.findBy(category, attachedFile.getBoardNo());
// System.out.println(board);
// 게시글 데이터의 작성자와 로그인 한 작성자가 일치하는지 검사한다.
if (board.getWriter().getNo() != loginUser.getNo()) {
throw new ServletException("게시글 변경 권한이 없습니다!");
}
// 일치하면 첨부파일을 삭제한다.
try {
if (boardDao.deleteFile(fileNo) == 0) {
throw new Exception("해당 번호의 첨부파일이 없거나 삭제 권한이 없습니다.");
} else {
response.sendRedirect("/board/detail.jsp?category=" + category + "&no=" + board.getNo());
}
sqlSessionFactory.openSession(false).commit();
} catch (Exception e) {
sqlSessionFactory.openSession(false).rollback();
throw new RuntimeException(e);
}
%>
=>
App 재실행
=>
ㄴ 로그인 선택
=>
ㄴ [로그인] 선택
=>
게시글 선택
=>
ㄴ 첨부파일 > [삭제] 선택
=>
ㄴ 파일이 정상적으로 삭제됨을 확인
BoardDao.java
ㄴ deleteFiles 인터페이스 추가
ㄴ 파라미터 값은 boardNo 를 받도록 함
=>
MySQLBoardDao.java
ㄴ BoardDao 인터페이스에 따라 해당 메서드 구현하기
=>
BoardDao.xml
ㄴ deleteFiles 메서드에서는 board_no 를 통해 파일을 삭제하도록 함
=>
delete.jsp
ㄴ 게시물 삭제 시 해당 게시물의 첨부파일을 모두 삭제하도록 해줌
=>
App 재시작
=>
ㄴ 로그인 하기
=>
ㄴ 첨부파일 삭제하지 않고 게시글 [삭제] 선택
=>
ㄴ 28번 글 정상적으로 삭제됨을 확인
=>
ㄴ 남의 글을 삭제하려고 할 경우 해당 오류 발생 후 목록으로 이동됨
=>
ㄴ 해당 에러 페이지는 2초동안 유지되고 목록으로 이동됨
fileDelete.jsp
=>
ㄴ 직원2가 직원1의 첨부파일을 삭제하려고할 때 아래와 같이 오류 노출되도록 함
=>
fileDelete.java
<%@ page
language="java"
pageEncoding="UTF-8"
contentType="text/html;charset=UTF-8"
trimDirectiveWhitespaces="true"
errorPage="/error.jsp"%>
<%@ page import="bitcamp.report.dao.BoardDao"%>
<%@ page import="bitcamp.report.vo.AttachedFile"%>
<%@ page import="bitcamp.report.vo.Board"%>
<%@ page import="bitcamp.report.vo.Member"%>
<%@ page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%
Member loginUser = (Member) request.getSession().getAttribute("loginUser");
if (loginUser == null) {
response.sendRedirect("/auth/form.html");
return;
}
int category = Integer.parseInt(request.getParameter("category"));
int fileNo = Integer.parseInt(request.getParameter("no"));
BoardDao boardDao = (BoardDao) this.getServletContext().getAttribute("boardDao");
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) this.getServletContext().getAttribute("sqlSessionFactory");
AttachedFile attachedFile = boardDao.findFileBy(fileNo);
Board board = boardDao.findBy(category, attachedFile.getBoardNo());
request.setAttribute("refresh", "2;url=detail.jsp?category=" + category
+ "&no=" + board.getNo());
if (board.getWriter().getNo() != loginUser.getNo()) {
throw new ServletException("게시글 변경 권한이 없습니다!");
}
if (boardDao.deleteFile(fileNo) == 0) {
throw new Exception("해당 번호의 첨부파일이 없거나 삭제 권한이 없습니다.");
} else {
response.sendRedirect("/board/detail.jsp?category=" + category + "&no=" + board.getNo());
}
sqlSessionFactory.openSession(false).commit();
%>
ㄴ try~ catch 문 제거
error.jsp
ㄴ 해당 코드 추가
ㄴ BoardFileDeleteServlet 삭제