본문으로 바로가기

[JSP개발] 게시판 - 글 수정

category 코딩/JSP 2016. 12. 23. 17:08








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>
                    &nbsp;&nbsp; ${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_DEV.war




RSS구독 링크추가 트위터 이메일 구독