1. 개요
■ 지난 포스팅 : [JSP개발] 게시판 - 글 삭제
글 삭제 구현 다음으로 글 수정을 구현할 것이다. 삭제와 마찬가지로 글 작성자만 수정이 가능하며, 답글은 수정 시 파일을 첨부할 수 없도록 하였다.
■ JSP
BoardUpdateForm.jsp : 글 수정 화면이다. 글 작성자만 수정이 가능하며 답글일 경우 파일 첨부 부분이 보이지 않도록 처리하였다.
■ Java
BoardUpdateFormAction.java : 글 수정 화면 전환을 처리하는 Action이다.
BoardUpdateAction.java : 글 수정을 처리하는 Action이다. 수정 시 새로운 파일 첨부도 여기에서 처리를 한다.
BoardDAO.java : 글 수정 메서드를 추가해 준다.
2. 소스 코드
■ BoardUpdateForm.jsp
글 수정 화면에서 목록 버튼을 누를 경우 글 목록으로 이동된다. 이때 수정할 글이 있던 원래의 페이지로 이동하기 위해 페이지 번호를 전달한다.
수정 시 새로운 파일을 업로드할 수 있게 되어있다. 파일 업로드를 할 경우 <form>태그에 enctype 속성을 사용해야 한다. 수정 버튼을 클릭 시 글 제목, 글 내용뿐만 아니라 수정하는 글의 번호와 기존에 첨부된 파일명을 같이 전송한다.
파일 첨부의 경우 답글이 아닐 경우만 가능하도록 하였다. 답글의 경우 작성 시 파일 첨부가 불가능하므로 수정시에도 파일 첨부를 할 수 없도록 했다. 여기서 board_parent 값이 0이 아닌 경우는 답글이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <title>글 수정</title> <style type="text/css"> #title{ height : 16; font-family :'돋움'; font-size : 12; text-align :center; } </style> <script type="text/javascript"> function changeView() { location.href='BoardListAction.bo?page=${pageNum}'; } </script> </head> <body> <br> <b><font size="6" color="gray">글 수정</font></b> <br> <form method="post" action="BoardUpdateAction.bo?page=${pageNum}" name="boardForm" enctype="multipart/form-data"> <input type="hidden" name="board_num" value="${board.board_num}"/> <input type="hidden" name="existing_file" value="${board.board_file}"/> <table width="700" border="3" bordercolor="lightgray" align="center"> <tr> <td id="title">작성자</td> <td>${board.board_id}</td> </tr> <tr> <td id="title"> 제 목 </td> <td> <input name="board_subject" type="text" size="70" maxlength="100" value="${board.board_subject}"/> </td> </tr> <tr> <td id="title"> 내 용 </td> <td> <textarea name="board_content" cols="72" rows="20"> ${board.board_content} </textarea> </td> </tr> <!-- 답글이 아닐 경우에만 파일 첨부 가능하도록 처리 --> <c:if test="${board.board_parent==0}"> <tr> <td id="title"> 기존 파일 </td> <td> ${board.board_file} </td> </tr> <tr> <td id="title"> 첨부파일 </td> <td> <input type="file" name="board_file"/> </td> </tr> </c:if> <tr align="center" valign="middle"> <td colspan="5"> <input type="reset" value="작성취소" > <input type="submit" value="수정" > <input type="button" value="목록" onclick="changeView()" > </td> </tr> </table> </form> </body> </html> | cs |
■ BoardUpdateFormAction.java
상세 보기에서 수정 버튼을 클릭하면 동작하는 Action이다. 수정 화면으로 화면을 전환하는 작업을 하며 이때 수정할 글의 정보를 request에 담아 수정 화면으로 전달한다.
파라미터에서 페이지 번호와 글 번호를 가져온다. 그리고 글 번호를 이용하여 수정할 글의 상세정보를 가져온다. 그리고 페이지 번호와 글의 상세정보를 request에 세팅한다.
페이지 번호를 같이 세팅하는 것은 수정 후 원래 있던 페이지로 되돌아가기 위해서이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package jsp.board.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jsp.board.model.BoardBean; import jsp.board.model.BoardDAO; import jsp.common.action.Action; import jsp.common.action.ActionForward; public class BoardUpdateFormAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { ActionForward forward = new ActionForward(); // 페이지 번호와 글 번호를 가져온다. String pageNum = request.getParameter("page"); String num = request.getParameter("num"); int boardNum = Integer.parseInt(num); BoardDAO dao = BoardDAO.getInstance(); BoardBean board = dao.getDetail(boardNum); request.setAttribute("board", board); request.setAttribute("pageNum", pageNum); forward.setRedirect(false); // 단순한 조회이므로 forward.setNextPath("BoardUpdateForm.bo"); return forward; } } | cs |
■ BoardUpdateAction.java
수정 화면에서 수정 버튼을 클릭 시 동작하는 Action이다. 여기서는 글 수정 작업을 처리한다.
BoardUpdateAction에서는 수정 시 새로 첨부한 파일의 업로드도 처리해야 한다. 업로드될 파일의 크기와 경로를 만들고 파일 업로드를 처리할 MultipartRequest 객체를 생성한다.
수정 화면에서 넘어온 파라미터에서 값들을 가져온다. 그리고 BoardBean에 글 번호, 글 제목, 글 내용을 세팅한다.
파일 업로드를 처리하는 부분이다. 수정 시 새로 파일을 등록했다면 기존의 파일명 대신 새로운 파일명을 DB에 저장해야 한다. 그렇기에 BoardBean에 새 파일명을 세팅한다. (58줄)
만약 수정 시 파일을 업로드하지 않았다면 기존의 첨부된 파일명을 그대로 사용한다. (56줄)
BoardBean을 DAO로 넘겨 수정된 내용을 저장한다. 수정이 정상적으로 처리되었을 경우 글 목록으로 화면을 전환한다. 이때 원래 페이지로 돌아가기 위해 페이지 번호를 넘겨준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | package jsp.board.action; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.oreilly.servlet.MultipartRequest; import com.oreilly.servlet.multipart.DefaultFileRenamePolicy; import jsp.board.model.BoardBean; import jsp.board.model.BoardDAO; import jsp.common.action.Action; import jsp.common.action.ActionForward; public class BoardUpdateAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { ActionForward forward = new ActionForward(); // 답글 작성 후 원래 페이지로 돌아가기 위해 페이지 번호가 필요하다. String pageNum = request.getParameter("page"); // 업로드 파일 사이즈 int fileSize= 5*1024*1024; // 업로드될 폴더 절대경로 String uploadPath = request.getServletContext().getRealPath("/UploadFolder"); try { MultipartRequest multi = new MultipartRequest (request, uploadPath, fileSize, "euc-kr", new DefaultFileRenamePolicy()); // 파리미터 값을 가져온다. int num = Integer.parseInt(multi.getParameter("board_num")); // 글 번호 String subject = multi.getParameter("board_subject"); // 글 제목 String content = multi.getParameter("board_content"); // 글 내용 String existFile = multi.getParameter("existing_file"); // 기존 첨부 파일 // 파라미터 값을 자바빈에 세팅한다. BoardBean border = new BoardBean(); border.setBoard_num(num); border.setBoard_subject(subject); border.setBoard_content(content); // 글 수정 시 업로드된 파일 가져오기 Enumeration<String> fileNames = multi.getFileNames(); if(fileNames.hasMoreElements()) { String fileName = fileNames.nextElement(); String updateFile = multi.getFilesystemName(fileName); if(updateFile == null) // 수정시 새로운 파일을 첨부 안했다면 기존 파일명을 세팅 border.setBoard_file(existFile); else // 새로운 파일을 첨부했을 경우 border.setBoard_file(updateFile); } BoardDAO dao = BoardDAO.getInstance(); boolean result = dao.updateBoard(border); if(result){ forward.setRedirect(true); // 원래있던 페이지로 돌아가기 위해 페이지번호를 전달한다. forward.setNextPath("BoardListAction.bo?page="+pageNum); } } catch (Exception e) { e.printStackTrace(); System.out.println("글 수정 오류 : " + e.getMessage()); } return forward; } } | cs |
■ BoardDAO.java
DAO에는 글 수정 메서드를 추가한다.
BoardUpdateAction에서 넘어온 BoardBean을 이용해 글을 수정한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /* * 수정 메서드를 기존 DAO에 추가한다. */ // 글 수정 public boolean updateBoard(BoardBean border) { boolean result = false; try{ conn = DBConnection.getConnection(); conn.setAutoCommit(false); // 자동 커밋을 false로 한다. StringBuffer sql = new StringBuffer(); sql.append("UPDATE MEMBER_BOARD SET"); sql.append(" BOARD_SUBJECT=?"); sql.append(" ,BOARD_CONTENT=?"); sql.append(" ,BOARD_FILE=?"); sql.append(" ,BOARD_DATE=SYSDATE "); sql.append("WHERE BOARD_NUM=?"); pstmt = conn.prepareStatement(sql.toString()); pstmt.setString(1, border.getBoard_subject()); pstmt.setString(2, border.getBoard_content()); pstmt.setString(3, border.getBoard_file()); pstmt.setInt(4, border.getBoard_num()); int flag = pstmt.executeUpdate(); if(flag > 0){ result = true; conn.commit(); // 완료시 커밋 } } catch (Exception e) { try { conn.rollback(); // 오류시 롤백 } catch (SQLException sqle) { sqle.printStackTrace(); } throw new RuntimeException(e.getMessage()); } close(); return result; } // end updateBoard | cs |
■ BoardCommand.properties
글 수정과 관련된 명령어를 추가한다.
BoardUpdateFormAction.bo=jsp.board.action.BoardUpdateFormAction
BoardUpdateAction.bo=jsp.board.action.BoardUpdateAction
3. 실행 결과
수정 테스트라는 글을 수정한다.
글의 내용을 수정하고 새로운 파일을 첨부한다.
수정된 글을 확인하면 내용 수정 및 새로운 파일이 첨부된 것을 볼 수 있다.
4. 소스코드 다운로드 (war 파일)
'코딩 > JSP' 카테고리의 다른 글
[JSP개발] 게시판 - 방명록 등록 (0) | 2016.12.26 |
---|---|
[JSP개발] 게시판 - 방명록 화면 (3) | 2016.12.25 |
[JSP개발] 게시판 - 글 삭제 (0) | 2016.12.22 |
[JSP개발] 게시판 - 답글달기(오라클 계층쿼리 적용) (4) | 2016.12.21 |
[JSP개발] 게시판 - 답글달기 (0) | 2016.12.16 |