본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 65일차 (2023-08-24) 자바 프로그래밍_64. JSP를 이용하여 MVC 모델1 구조로 변경하기(계속)_Board_JSP_개인프로젝트 - 마트 관리 시스템

by prometedor 2023. 8. 24.
## 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 삭제