1. 개요
■ 지난 포스팅 : [JSP개발] 게시판 - 방명록 삭제
방명록의 마지막 작업으로 방명록 수정을 구현할 것이다. 방명록의 경우 게시판과 달리 로그인하지 않은 사람도 작성이 가능하게 되어있다. 그래서 수정의 경우 수정 전 일단 비밀번호를 체크하도록 한다. 비밀번호가 일치하면 방명록 수정이 가능하게 한다.
비밀번호 확인 부분은 지난번 방명록 삭제와 마찬가지로 Ajax를 이용하여 구현할 것이다.
■ JSP
GuestbookForm.jsp : 방명록 화면에는 수정 클릭 시 수정 창을 open 하는 코드를 추가한다.
- GuestbookUpdateForm.jsp : 방명록 수정 창이다. 수정창이 open 되면 비밀번호를 입력하는 화면이 나오고, 올바른 비밀번호 입력 시 수정 화면으로 전환된다.
■ Java
GuestbookUpdateFormAction.java : 수정 화면을 표시하는 Action이다.
GuestbookPwCheckAction.java : 수정 시 비밀번호를 체크하는 Action이다.
GuestbookUpdateAction.java : 방명록 수정을 처리하는 Action이다.
- GuestbookDAO.java : DAO에는 방명록 수정 메서드를 추가한다.
2. 소스 코드
■ GuestbookForm.jsp
[수정] 클릭 시 수정 창이 나타나게 하는 함수이다. 답글 창과 마찬가지로 부모창(방명록) → 자식창(삭제 창) → 부모창(방명록) 이런 순서로 동작하도록 하였다.
[수정] 클릭 시 이벤트와 함수를 추가한다.
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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | <%@ 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"> #wrap { width: 700px; margin: 0 auto 0 auto; } #comment{ text-align :left; } #listGuestForm{ text-align :center; overflow:scroll; overflow-x:hidden; height:220px; } #writeGuestForm, #pageForm{ text-align :center; } </style> <script type="text/javascript"> // 입력값 체크 function checkValue() { if(!document.guestbookInfo.guestbook_id.value){ alert("이름을 입력하세요."); return false; } if(!document.guestbookInfo.guestbook_password.value){ alert("비밀번호를 입력하세요."); return false; } if(!document.guestbookInfo.guestbook_content.value){ alert("내용을 입력하세요."); return false; } } // 답글창 open function openReplyForm(guestbook_no) { // window.name = "부모창 이름"; window.name = "replyForm"; // window.open("open할 window", "자식창 이름", "팝업창 옵션"); window.open("GuestbookReplyFormAction.ge?num="+guestbook_no+"&page=${spage}", "rForm", "width=570, height=350, resizable = no, scrollbars = no"); } // 삭제창 open function openDelForm(guestbook_no) { window.name = "parentForm"; window.open("GuestbookDeleteFormAction.ge?num="+guestbook_no, "delForm", "width=570, height=350, resizable = no, scrollbars = no"); } // 수정창 open function openUpdateForm(guestbook_no) { window.name = "parentForm"; window.open("GuestbookUpdateFormAction.ge?num="+guestbook_no+"&page=${spage}", "updForm", "width=570, height=350, resizable = no, scrollbars = no"); } </script> </head> <body> <br> <b><font size="5" color="gray">방명록</font></b> <hr size="1" width="700"> <br> <div id="wrap"> <!-- 글 등록 부분 시작--> <div id="writeGuestForm"> <form name="guestbookInfo" method="post" action="GuestbookWriteAction.ge" onsubmit="return checkValue()" > <table width="700"> <tr> <td>이름 : </td> <!-- 로그인했을 경우 방명록의 이름 부분의 아이디를 세팅한다 --> <c:if test="${sessionScope.sessionID!=null}"> <td> ${sessionScope.sessionID} <input type="hidden" name="guestbook_id" value="${sessionScope.sessionID}"> </td> </c:if> <c:if test="${sessionScope.sessionID==null}"> <td><input type="text" name="guestbook_id"></td> </c:if> <td>비밀번호 : </td> <td><input type="password" name="guestbook_password"></td> </tr> <tr><td colspan="4"> </td></tr> <tr> <td colspan="4"> <textarea rows="7" cols="80" name="guestbook_content"></textarea> </td> </tr> </table> <br> <input type="submit" value="등록"> </form> </div> <!-- 글 등록 부분 끝--> <!-- 글 목록 부분 시작 --> <div id="listGuestForm"> <form method="post" name=""> <!-- 방명록 내용 부분 --> <div id="comment"> <c:forEach var="guestbook" items="${requestScope.list}"> <hr size="1" width="700"> <c:if test="${guestbook.guestbook_level > 1}"> <c:forEach begin="1" end="${guestbook.guestbook_level}"> <!-- 답변글일경우 글 제목 앞에 공백을 준다. --> </c:forEach> <img src="img/reply_icon.gif"> </c:if> <label>${guestbook.guestbook_id}</label> <label>${guestbook.guestbook_date}</label> <a href="#" onclick="openReplyForm(${guestbook.guestbook_no})">[답변]</a> <a href="#" onclick="openUpdateForm(${guestbook.guestbook_no})">[수정]</a> <a href="#" onclick="openDelForm(${guestbook.guestbook_no})">[삭제]</a><br> ${guestbook.guestbook_content} <br> </c:forEach> <hr size="1" width="700"> </div> <!-- 페이지 부분 --> <div id="pageForm"> <c:if test="${startPage != 1}"> <a href='GuestbookListAction.ge?page=${startPage-1}'>[ 이전 ]</a> </c:if> <c:forEach var="pageNum" begin="${startPage}" end="${endPage}"> <c:if test="${pageNum == spage}"> ${pageNum} </c:if> <c:if test="${pageNum != spage}"> <a href='GuestbookListAction.ge?page=${pageNum}'>${pageNum} </a> </c:if> </c:forEach> <c:if test="${endPage != maxPage }"> <a href='GuestbookListAction.ge?page=${endPage+1 }'>[다음]</a> </c:if> </div> </form> </div> <!-- 글 목록 부분 끝 --> </div> </body> </html> | cs |
■ GuestbookUpdateFormAction.java
여기에서는 수정 창을 띄우기 전 먼저 수정할 글의 정보를 가져오는 작업을 한다. GuestbookForm에서 넘겨받은 방명록 글 번호를 이용하여 DB에서 글의 정보를 가져온다.
방명록 정보와 페이지 번호를 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 37 | package jsp.guestbook.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jsp.common.action.Action; import jsp.common.action.ActionForward; import jsp.guestbook.model.GuestbookBean; import jsp.guestbook.model.GuestbookDAO; public class GuestbookUpdateFormAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { ActionForward forward = new ActionForward(); // 방명록 글번호와 페이지 번호를 가져온다. int guestbook_no = Integer.parseInt(request.getParameter("num")); String pageNum = request.getParameter("page"); // DB에서 해당 방명록의 정보를 가져온다. GuestbookDAO dao = GuestbookDAO.getInstance(); GuestbookBean guestbook = dao.getGuestbook(guestbook_no); // 방명록의 정보와 페이지번호를 request에 세팅한다. request.setAttribute("guestbook", guestbook); request.setAttribute("pageNum", pageNum); forward.setRedirect(false); forward.setNextPath("guestbook/GuestbookUpdateForm.jsp"); return forward; } } | cs |
■ GuestbookUpdateForm.jsp
방명록 수정 화면의 경우 먼저 html 부분을 살펴보자. 크게 2개의 부분으로 나누어져 있는데 첫 번째가 비밀번호를 입력하는 부분이다. 수정 화면이 나타나면 먼저 비밀번호를 입력하게 한다.
그리고 GuestbookUpdateFormAction에서 전달받은 방명록 정보에서 방명록 글 번호를 hidden으로 세팅한다. 글 번호는 비밀번호 확인 시 필요한 정보이지만 화면에 보여줄 필요가 없기에 hidden으로 처리한다.
두 번째 부분은 방명록 수정 부분이다. 이 부분은 처음에는 보여줄 필요가 없으므로 CSS에서 display:none을 적용하여 화면에 보이지 않게 하였다. 비밀번호가 일치하면 수정 화면이 나타난다.
148 ~ 158 줄을 보면 이름을 수정하는 부분인데, 두 가지로 처리하였다. 일단 로그인한 경우(아이디가 있는 사용자의 경우)는 자신의 아이디가 방명록의 이름으로 입력되기 때문에 수정 불가하게 하였다. 그리고 회원가입이 안된 사용자의 경우는 방명록 수정 시 이름도 수정할 수 있게 하였다.
다음으로 스크립트 부분을 보자. 비밀번호 확인시에는 Ajax를 사용하는데 지난 방명록 삭제 포스팅과 똑같이 처리하였다. 먼저 스크립트의 첫 부분은 XMLHttpRequest 객체를 생성하는 함수이다.
객체의 생성은 브라우저에 따라 달리 처리를 한다.
checkValue( )는 비밀번호 입력 후 확인을 누르면 실행되는 부분이다. 먼저 비밀번호가 입력되었는지를 검사하고, 비밀번호가 입력되었다면 Ajax를 이용하여 GuestbookPwCheckAction(서버 측)으로 비밀번호와 방명록 글 번호를 전달한다.
GuestbookPwCheckAction에서는 비밀번호를 확인하여 결과값을 GuestbookUpdateForm으로 전달한다.
XMLHttpRequest의 상태변화에 checkValue( )가 호출이 된다. 지금은 서버에서 정상적으로 데이터를 받았을 경우만 작업을 수행하도록 하였다. GuestbookPwCheckAction에서 0을 받았다면 비밀번호가 일치하지 않는 경우이므로 비밀번호가 틀리다는 경고 창을 띄운다.
그리고 1을 받았다면 비밀번호가 일치하는 것이므로 수정 화면을 띄운다. 비밀번호 입력 부분인 <div id="pwCheckForm">은 display 속성을 none으로 변경하여 화면에서 보이지 않게 한다. 그리고 수정 부분인 <div id="writeUpdateForm">의 display 속성을 block으로 변경하여 화면에 보이도록 한다.
수정 부분에서 수정 버튼을 클릭 시 실행되는 부분이다. 수정 화면에서 이름과 내용을 입력하였는지 검사를 하고, 모두 입력을 했으면 그 값을 서버로 전달한다. 그 후 현재 수정 창을 닫는다.
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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | <%@ 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"> #wrap { width: 550px; text-align :center; margin: 0 auto 0 auto; } #pwCheckForm{ display:block; } #writeUpdateForm{ text-align :center; display:none; } </style> <script type="text/javascript"> var httpRequest = null; // httpRequest 객체 생성 function getXMLHttpRequest(){ var httpRequest = null; if(window.ActiveXObject){ try{ httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try{ httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e2) { httpRequest = null; } } } else if(window.XMLHttpRequest){ httpRequest = new window.XMLHttpRequest(); } return httpRequest; } // 비밀번호 미입력시 경고창 function checkValue(){ var form = document.forms[0]; var num = form.guestbook_no.value; var pw = form.guestbook_password.value; if (!pw) { alert("비밀번호를 입력하지 않았습니다."); return false; } else { var param="num="+num+"&pw="+pw; httpRequest = getXMLHttpRequest(); httpRequest.onreadystatechange = checkFunc; httpRequest.open("POST", "GuestbookPwCheckAction.ge", true); httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); httpRequest.send(param); } } function checkFunc(){ if(httpRequest.readyState == 4){ // 결과값을 가져온다. var resultText = httpRequest.responseText; if(resultText == 0){ alert("비밀번호가 틀립니다."); } else if(resultText == 1){ // 비밀번호 일치시 수정 화면을 보이게 한다. var chkForm = document.getElementById("pwCheckForm"); var uForm = document.getElementById("writeUpdateForm"); chkForm.style.display = 'none'; // 비밀번호 입력화면 - 안보이게 uForm.style.display = 'block'; // 수정화면 - 보이게 } } } // 방명록 수정 function update() { var form = document.forms[1]; var id = form.guestbook_id.value; var content = form.guestbook_content.value; if(!id) { alert("이름을 입력하세요."); return false; } else if(!content) { alert("내용을 입력하세요."); return false; } else { form.target = opener.name; form.method="post"; form.action="GuestbookUpdateAction.ge?page=${pageNum}"; form.submit(); if (opener != null) { opener.updForm = null; self.close(); } } } </script> </head> <body> <div id="wrap"> <br> <b><font size="5" color="gray">수정</font></b> <hr size="1" width="550"> <br> <!-- 수정전 비밀번호 확인 --> <div id="pwCheckForm"> <form name="delGuestbook" target="parentForm"> <input type="hidden" name="guestbook_no" value="${guestbook.guestbook_no}"/> 비밀번호 : <input type="password" name="guestbook_password" maxlength="50"> <br><br><br> <input type="button" value="확인" onclick="checkValue()"> <input type="button" value="창닫기" onclick="window.close()"> </form> </div> <!-- 방명록 수정 부분 시작--> <div id="writeUpdateForm"> <form name="updGuestbook" target="parentForm"> <!-- 방명록의 정보를 같이 전송한다. --> <input type="hidden" name="guestbook_no" value="${guestbook.guestbook_no}"/> <table width="550"> <tr> <!-- 로그인했을 경우 방명록 이름 수정 불가 --> <c:if test="${sessionScope.sessionID == guestbook.guestbook_id}"> <td> 이름 : ${sessionScope.sessionID} <input type="hidden" name="guestbook_id" value="${sessionScope.sessionID}"> </td> </c:if> <c:if test="${sessionScope.sessionID==null}"> <td>이름 : <input type="text" name="guestbook_id" value="${guestbook.guestbook_id}"></td> </c:if> </tr> <tr><td> </td></tr> <tr> <td> <textarea rows="7" cols="70" name="guestbook_content">${guestbook.guestbook_content}</textarea> </td> </tr> </table> <br> <input type="button" value="수정" onclick="update()"> <input type="button" value="창닫기" onclick="window.close()"> </form> </div> <!-- 방명록 수정 부분 끝--> </div> </body> </html> | cs |
■ GuestbookPwCheckAction.java
GuestbookPwCheckAction는 수정 화면에서 넘겨받은 비밀번호와 방명록 글 번호를 이용하여 비밀번호를 검사하는 작업을 한다. 입력받은 글 번호를 DAO에 전달하여 해당 글의 비밀번호를 가져온다.
그리고 입력된 비밀번호와 DB에 저장된 비밀번호를 비교하여 그 결과 값을 전달한다.
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 | package jsp.guestbook.action; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jsp.common.action.Action; import jsp.common.action.ActionForward; import jsp.guestbook.model.GuestbookDAO; public class GuestbookPwCheckAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { // 파라미터 값을 가져온다. String inputPW = request.getParameter("pw"); String g_no = request.getParameter("num"); int guestbook_no = Integer.parseInt(g_no); GuestbookDAO dao = GuestbookDAO.getInstance(); String dbPW = dao.getPassword(guestbook_no); response.setContentType("text/html;charset=euc-kr"); PrintWriter out = response.getWriter(); if(!dbPW.equals(inputPW)) out.println("0"); // 비밀번호가 틀릴 경우 else out.println("1"); // 비밀번호 일치 out.close(); return null; } } | cs |
■ GuestbookUpdateAction.java
GuestbookUpdateAction에서는 방명록 글 번호 및 수정할 정보를 가져온다. 그것을 GustbookBean에 세팅한다.
방명록 정보를 담고 있는 GustbookBean을 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 | package jsp.guestbook.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jsp.common.action.Action; import jsp.common.action.ActionForward; import jsp.guestbook.model.GuestbookBean; import jsp.guestbook.model.GuestbookDAO; public class GuestbookUpdateAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { request.setCharacterEncoding("euc-kr"); ActionForward forward = new ActionForward(); GuestbookDAO dao = GuestbookDAO.getInstance(); GuestbookBean guestbook = new GuestbookBean(); // 파라미터 값을 가져온다. int guestbook_no = Integer.parseInt(request.getParameter("guestbook_no")); String guestbook_id = request.getParameter("guestbook_id"); String guestbook_content = request.getParameter("guestbook_content"); String pageNum = request.getParameter("page"); guestbook.setGuestbook_no(guestbook_no); guestbook.setGuestbook_id(guestbook_id); guestbook.setGuestbook_content(guestbook_content); boolean result = dao.updateGuestbook(guestbook); if(result){ forward.setRedirect(true); forward.setNextPath("GuestbookListAction.ge?page="+pageNum); } else return null; return forward; } } | cs |
■ GuestbookDAO.java
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 | package jsp.guestbook.model; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import jsp.common.util.DBConnection; public class GuestbookDAO { private Connection conn; private PreparedStatement pstmt; private ResultSet rs; private static GuestbookDAO instance; private GuestbookDAO(){} public static GuestbookDAO getInstance(){ if(instance==null) instance=new GuestbookDAO(); return instance; } // 시퀀스를 가져온다. public int getSeq() { int result = 1; try { conn = DBConnection.getConnection(); // 시퀀스 값을 가져온다. (DUAL : 시퀀스 값을 가져오기위한 임시 테이블) StringBuffer sql = new StringBuffer(); sql.append("SELECT guestbook_no_seq.NEXTVAL FROM DUAL"); pstmt = conn.prepareStatement(sql.toString()); rs = pstmt.executeQuery(); // 쿼리 실행 if (rs.next()) result = rs.getInt(1); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } close(); return result; } // end getSeq // 병명록 등록 public boolean guestbookInsert(GuestbookBean guestbook) { boolean result = false; try { conn = DBConnection.getConnection(); // 자동 커밋을 false로 한다. conn.setAutoCommit(false); StringBuffer sql = new StringBuffer(); sql.append("INSERT INTO GUESTBOOK"); sql.append(" (GUESTBOOK_NO, GUESTBOOK_ID, GUESTBOOK_PASSWORD, GUESTBOOK_CONTENT"); sql.append(" , GUESTBOOK_GROUP, GUESTBOOK_PARENT, GUESTBOOK_DATE)"); sql.append(" VALUES(?,?,?,?,?,?,sysdate)"); int no = guestbook.getGuestbook_no(); // 글번호(시퀀스 값) int group = guestbook.getGuestbook_group(); // 그룹번호 int parent = guestbook.getGuestbook_parent(); // 부모글번호 // 부모글일 경우 그룹번호와 글번호 동일 if(parent == 0) group = no; pstmt = conn.prepareStatement(sql.toString()); pstmt.setInt(1, no); pstmt.setString(2, guestbook.getGuestbook_id()); pstmt.setString(3, guestbook.getGuestbook_password()); pstmt.setString(4, guestbook.getGuestbook_content()); pstmt.setInt(5, group); pstmt.setInt(6, parent); int flag = pstmt.executeUpdate(); if(flag > 0){ result = true; conn.commit(); // 완료시 커밋 } } catch (Exception e) { try { conn.rollback(); // 오류시 롤백 } catch (SQLException sqle) { sqle.printStackTrace(); } e.printStackTrace(); throw new RuntimeException(e.getMessage()); } close(); return result; } // end boardInsert(); // 방명록 목록 보기 public ArrayList<GuestbookBean> getGuestbookList(int pageNum) { ArrayList<GuestbookBean> list = new ArrayList<GuestbookBean>(); try { conn = DBConnection.getConnection(); /* * SELECT * FROM * (SELECT ROWNUM AS rnum, * data.* * FROM * (SELECT LEVEL, * guestbook_no, * guestbook_id, * guestbook_password, * guestbook_content, * guestbook_group, * guestbook_parent, * guestbook_date * FROM GUESTBOOK * START WITH guestbook_parent = 0 * CONNECT BY PRIOR guestbook_no = guestbook_parent * ORDER SIBLINGS BY guestbook_group desc) * data) * WHERE rnum>=? and rnum<=? ; */ StringBuffer sql = new StringBuffer(); sql.append("SELECT * FROM"); sql.append(" (SELECT ROWNUM AS rnum, data.* FROM "); sql.append(" (SELECT LEVEL, guestbook_no, guestbook_id,"); sql.append(" guestbook_password, guestbook_content,"); sql.append(" guestbook_group, guestbook_parent, guestbook_date"); sql.append(" FROM GUESTBOOK"); sql.append(" START WITH guestbook_parent = 0"); sql.append(" CONNECT BY PRIOR guestbook_no = guestbook_parent"); sql.append(" ORDER SIBLINGS BY guestbook_group desc)"); sql.append(" data) "); sql.append("WHERE rnum>=? and rnum<=?"); // 방명록 목록은 한 화면에 총 5개가 보이도록 한다. pstmt = conn.prepareStatement(sql.toString()); pstmt.setInt(1, pageNum); pstmt.setInt(2, pageNum+4); rs = pstmt.executeQuery(); while(rs.next()) { GuestbookBean guestbook = new GuestbookBean(); guestbook.setGuestbook_level(rs.getInt("LEVEL")); guestbook.setGuestbook_no(rs.getInt("guestbook_no")); guestbook.setGuestbook_id(rs.getString("guestbook_id")); guestbook.setGuestbook_password(rs.getString("guestbook_password")); guestbook.setGuestbook_content(rs.getString("guestbook_content")); guestbook.setGuestbook_group(rs.getInt("guestbook_group")); guestbook.setGuestbook_parent(rs.getInt("guestbook_parent")); guestbook.setGuestbook_date(rs.getDate("guestbook_date")); list.add(guestbook); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } close(); return list; } // 방명록의 개수를 가져온다. public int getGuestbookCount() { int result = 0; try { conn = DBConnection.getConnection(); StringBuffer sql = new StringBuffer(); sql.append("SELECT COUNT(*) FROM GUESTBOOK"); pstmt = conn.prepareStatement(sql.toString()); rs = pstmt.executeQuery(); if(rs.next()) result = rs.getInt(1); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } close(); return result; } // 방명록 1개의 정보를 가져온다. public GuestbookBean getGuestbook(int g_num) { GuestbookBean guestbook = null; try { conn = DBConnection.getConnection(); StringBuffer sql = new StringBuffer(); sql.append("SELECT * FROM GUESTBOOK where guestbook_no = ?"); pstmt = conn.prepareStatement(sql.toString()); pstmt.setInt(1, g_num); rs = pstmt.executeQuery(); while(rs.next()) { guestbook = new GuestbookBean(); guestbook.setGuestbook_no(rs.getInt("guestbook_no")); guestbook.setGuestbook_id(rs.getString("guestbook_id")); guestbook.setGuestbook_password(rs.getString("guestbook_password")); guestbook.setGuestbook_content(rs.getString("guestbook_content")); guestbook.setGuestbook_group(rs.getInt("guestbook_group")); guestbook.setGuestbook_parent(rs.getInt("guestbook_parent")); guestbook.setGuestbook_date(rs.getDate("guestbook_date")); } } catch (Exception e) { throw new RuntimeException(e.getMessage()); } close(); return guestbook; } // end getGuestbook // 비밀번호를 가져온다. public String getPassword(int guestbook_no) { String password = null; try { conn = DBConnection.getConnection(); StringBuffer sql = new StringBuffer(); sql.append("SELECT guestbook_password FROM GUESTBOOK where guestbook_no = ?"); pstmt = conn.prepareStatement(sql.toString()); pstmt.setInt(1, guestbook_no); rs = pstmt.executeQuery(); if(rs.next()) password = rs.getString("guestbook_password"); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } close(); return password; } // end getPassword // 방명록 삭제 public boolean deleteGuestbook(int guestbook_no) { boolean result = false; try { conn = DBConnection.getConnection(); conn.setAutoCommit(false); // 자동 커밋을 false로 한다. StringBuffer sql = new StringBuffer(); sql.append("DELETE FROM GUESTBOOK"); sql.append(" WHERE guestbook_no IN"); sql.append(" (SELECT guestbook_no"); sql.append(" FROM GUESTBOOK"); sql.append(" START WITH guestbook_no = ?"); sql.append(" CONNECT BY PRIOR guestbook_no = guestbook_parent) "); pstmt = conn.prepareStatement(sql.toString()); pstmt.setInt(1, guestbook_no); 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 deleteGuestbook // 방명록 수정 public boolean updateGuestbook(GuestbookBean guestbook) { boolean result = false; try{ conn = DBConnection.getConnection(); conn.setAutoCommit(false); // 자동 커밋을 false로 한다. StringBuffer sql = new StringBuffer(); sql.append("UPDATE GUESTBOOK SET"); sql.append(" guestbook_id=?"); sql.append(" ,guestbook_content=?"); sql.append(" ,guestbook_date=SYSDATE "); sql.append("WHERE guestbook_no=?"); pstmt = conn.prepareStatement(sql.toString()); pstmt.setString(1, guestbook.getGuestbook_id()); pstmt.setString(2, guestbook.getGuestbook_content()); pstmt.setInt(3, guestbook.getGuestbook_no()); 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 updateGuestbook // DB 자원해제 private void close() { try { if ( pstmt != null ){ pstmt.close(); pstmt=null; } if ( conn != null ){ conn.close(); conn=null; } } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } // end close() } | cs |
■ GuestbookCommand.properties
프로퍼티에는 방명록 수정 관련 명령어를 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Form Change GuestbookForm.ge=jsp.guestbook.action.GuestbookFormAction GuestbookReplyFormAction.ge=jsp.guestbook.action.GuestbookReplyFormAction GuestbookDeleteFormAction.ge=jsp.guestbook.action.GuestbookDeleteFormAction GuestbookUpdateFormAction.ge=jsp.guestbook.action.GuestbookUpdateFormAction # Action GuestbookWriteAction.ge=jsp.guestbook.action.GuestbookWriteAction GuestbookListAction.ge=jsp.guestbook.action.GuestbookListAction GuestbookReplyAction.ge=jsp.guestbook.action.GuestbookReplyAction GuestbookDeleteAction.ge=jsp.guestbook.action.GuestbookDeleteAction GuestbookPwCheckAction.ge=jsp.guestbook.action.GuestbookPwCheckAction GuestbookUpdateAction.ge=jsp.guestbook.action.GuestbookUpdateAction | cs |
3. 실행 결과
방명록5를 수정할 것이다.
수정창이 뜨면 먼저 비밀번호를 입력하는 부분이 나온다.
올바른 비밀번호 입력 시 수정 화면이 나타난다. 이름과 내용을 수정하고 수정 버튼을 누른다.
방명록 화면에서 방명록5가 수정된 것을 확인할 수 있다.
4. 소스코드 다운로드 (war 파일)
'코딩 > JSP' 카테고리의 다른 글
[JSP개발] 게시판 - 댓글 답변 구현 (4) | 2017.01.03 |
---|---|
[JSP개발] 게시판 - 댓글 작성 및 댓글 목록 (19) | 2017.01.02 |
[JSP개발] 게시판 - 방명록 삭제 (0) | 2016.12.29 |
[JSP개발] 게시판 - 방명록 답글 달기 (0) | 2016.12.28 |
[JSP개발] 게시판 - 방명록 목록 보기 (0) | 2016.12.27 |