1. 개요
■ 지난 포스팅 : [JSP개발] 게시판 - 방명록 답글 달기
이번에는 방명록 삭제를 구현할 것이다. 추가되는 java와 jsp는 위와 같다.
방명록 삭제 화면은 답글 화면과 마찬가지로 팝업창으로 나타나게 할 것이다. 그리고 삭제 시 비밀번호를 입력하게 할 것인데 여기서 비밀번호가 일치하는지 확인은 Ajax를 이용해 구현할 것이다.
■ JSP
GuestbookForm.jsp : 방명록 화면에는 삭제 클릭 시 삭제 창을 open 하는 코드를 추가한다.
- GuestbookDeleteForm.jsp : 방명록 삭제 창이다. 팝업창으로 나타나며, 비밀번호를 입력하고 삭제 클릭 시 방명록이 삭제된다. 만약 입력한 비밀번호가 잘못되었을 시 경고 창을 띄운다.
■ Java
GuestbookDeleteFormAction.java : 방명록 삭제 화면을 표시하는 Action이다.
GuestbookDeleteAction.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 | <%@ 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"); } </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="#" >[수정]</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 |
■ GuestbookDeleteFormAction.java
삭제 창을 띄워주는 GuestbookDeleteFormAction에서는 글 번호를 가져와 requset에 세팅한다. 그리고 다음 경로에는 삭제 창인 GuestbookDeleteForm.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 | package jsp.guestbook.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jsp.common.action.Action; import jsp.common.action.ActionForward; public class GuestbookDeleteFormAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { ActionForward forward = new ActionForward(); // 글번호를 가져온다. int guestbook_no = Integer.parseInt(request.getParameter("num")); request.setAttribute("guestbook_no", guestbook_no); forward.setRedirect(false); forward.setNextPath("guestbook/GuestbookDeleteForm.jsp"); return forward; } } | cs |
■ GuestbookDeleteForm.jsp
방명록 삭제 화면이다. 삭제 시 글의 비밀번호를 입력하게 한다. 만약 입력된 비밀번호가 틀리다면 경고 창을 띄운다. 비밀번호가 맞는다면 글을 삭제하고 삭제 화면을 닫는다.
삭제 화면에 html 부분을 보자. GuestbookDeleteFormAction에서 넘겨받은 글 번호를 hidden으로 세팅한다.(96줄) 나중에 글을 삭제할 때 필요한 정보이지만 화면에 보여줄 필요가 없기 때문이다.
그리고 삭제 버튼 클릭 시 checkValue( )라는 함수가 실행되도록 한다. 창닫기 버튼을 클릭하면 삭제 화면이 닫히도록 한다.
스크립트를 보기 전에 전체적인 실행 모습을 보자.
먼저 삭제 버튼을 클릭하면 onclick 이벤트가 발생한다. 그러면 checkValue( )가 실행이 된다. checkValue( )에서는 먼저 비밀번호 입력 여부를 확인한다. 비밀번호 미입력시 경고 창을 띄운다. 비밀번호가 입력되었다면 글 번호와 함께 GuestbookDeleteAction으로 전달한다.
전달 후 checkFunc( )가 호출되고, GuestbookDeleteAction(서버 측) 에서 넘겨받은 처리결과에 따라 다음 작업을 진행하게 된다.
스크립트의 첫 부분을 보면 XMLHttpRequest 객체를 생성하는 함수가 있다. getXMLHttpRequest( )에서는 XMLHttpRequest 객체를 생성하는 작업을 하는데, 브라우저에 따라 객체 생성을 달리해준다.
다음으로 checkValue( ) 부분을 보자. 일단 비밀번호가 입력되었는지 확인을 한다. (50~53줄) 비밀번호가 입력되지 않았다면 경고 창을 띄운다.
비밀번호가 입력되었다면 Ajax를 이용하여 서버에 전달을 한다.
58줄에서 getXMLHttpRequest( )를 호출하여 XMLHttpRequest 객체를 생성한다. 그리고 59줄에서 XMLHttpRequest의 상태변화에 따라 호출될 함수를 지정한다. 호출될 함수는 checkValue( )이다.
다음으로 60줄과 62줄을 보자. open( ) 함수에서는 요청 방식, URL, 동기화 방식을 지정한다. 여기에서는 POST 방식을 사용하며 전송할 URL은 GuestbookDeleteAction.ge이다. 다음으로 true로 입력했는데, 이것은 동기화 방식을 비동기로 한다는 것이다.
send( )는 서버에 요청을 전송하는 함수이다. 인자 값으로 null 또는 파라미터 값을 입력받는다. GET 방식으로 전달할 경우 인자 값을 null로 POST 방식으로 전달할 경우 전달할 데이터를 인자로 주면 된다.
위에서는 방명록 글 번호와 비밀번호를 send( )의 인자로 주었다.
XMLHttpRequest의 상태변화에 checkValue( )가 호출이 된다. XMLHttpRequest의 상태 값은 0, 1, 2, 3, 4가 있다. 보통 상태 값 중 4가 사용되는데 이것은 서버로부터 데이터를 전부 받은 상태를 말한다.
상태 값이 4이면 69줄에서 서버로부터 넘어온 데이터를 가져온다. 만약 데이터가 0이면 비밀번호가 잘못된 경우이므로 경고 창을 띄우고, 데이터가 0이 아니라면 글을 삭제한다. 삭제 후 방명록 화면을 새로 고침(76줄) 하고 삭제 창을 닫는다.
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 | <%@ 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; } #deleteReplyForm{ text-align: center; } </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 (!form.guestbook_password.value) { alert("비밀번호를 입력하지 않았습니다."); return false; } else // 비밀번호 입력시 Ajax를 이용해 삭제시도 { var param="num="+num+"&pw="+pw; httpRequest = getXMLHttpRequest(); httpRequest.onreadystatechange = checkFunc; httpRequest.open("POST", "GuestbookDeleteAction.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 (opener != null) { // 방명록(부모창) 새로고침 window.opener.document.location.reload(); opener.delForm = 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="deleteReplyForm"> <form name="delGuestbook" target="parentForm"> <input type="hidden" name="guestbook_no" value="${requestScope.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> </body> </html> | cs |
■ GuestbookDeleteAction.java
삭제 화면에서 넘어온 파라미터 값들을 가져온다. 그리고 방명록 글 번호를 이용하여 DB에서 비밀번호를 가져온다.
DB의 비밀번호와 화면에서 입력된(파라미터로 넘어온) 비밀번호를 비교한다. 같지 않을 경우 화면으로 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 | 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 GuestbookDeleteAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { ActionForward forward = new ActionForward(); // 파라미터 값을 가져온다. 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); // 비밀번호가 틀릴 경우 if(!dbPW.equals(inputPW)) { response.setContentType("text/html;charset=euc-kr"); PrintWriter out = response.getWriter(); out.println("0"); out.close(); return null; } boolean result = dao.deleteGuestbook(guestbook_no); if(result){ forward.setRedirect(true); forward.setNextPath("GuestbookListAction.ge"); } else return null; return forward; } } | cs |
■ GuestbookDAO.java
DAO에는 비밀번호를 가져오는 메서드와 방명록 삭제 메서드를 추가한다.
getPassword( ) 메서드는 방명록 글 번호를 입력받아 해당 글의 비밀번호를 리턴한다.
deleteGuestbook( ) 메서드는 방명록 글 번호를 입력받아 해당 글을 삭제한다.
274 ~ 277줄의 쿼리를 보자. 이 부분은 서브쿼리로 방명록의 START WITH 절에서 방명록 글 번호를 입력받고 그것을 이용해 계층을 이루는 방명록 글번호(guestbook_no)를 모두 찾는다. 이후 이 값들을 DELETE 절에서 삭제를 하게 된다.
쿼리가 정상적으로 실행되면 commit을 진행한다.
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 | 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.board.model.BoardBean; 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 // 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 | # Form Change GuestbookForm.ge=jsp.guestbook.action.GuestbookFormAction GuestbookReplyFormAction.ge=jsp.guestbook.action.GuestbookReplyFormAction GuestbookDeleteFormAction.ge=jsp.guestbook.action.GuestbookDeleteFormAction # 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 | cs |
3. 실행 결과
방명록 화면에서 이름이 답변3인 글을 삭제할 것이다.
[삭제]를 클릭하면 삭제 창이 뜬다. 비밀번호를 아무 값이나 입력하면 비밀번호가 틀리다는 경고 창이 뜬다. 정확한 비밀번호를 입력하면 글이 삭제되고 창이 닫힌다.
답변3이 삭제된 것을 볼 수 있다.
다음으로 삭제test를 삭제할 것이다.
삭제test를 삭제하면 답글인 답변2도 같이 삭제가 된것을 확인할 수 있다.
4. 소스코드 다운로드 (war 파일)
'코딩 > JSP' 카테고리의 다른 글
[JSP개발] 게시판 - 댓글 작성 및 댓글 목록 (19) | 2017.01.02 |
---|---|
[JSP개발] 게시판 - 방명록 수정 (15) | 2017.01.01 |
[JSP개발] 게시판 - 방명록 답글 달기 (0) | 2016.12.28 |
[JSP개발] 게시판 - 방명록 목록 보기 (0) | 2016.12.27 |
[JSP개발] 게시판 - 방명록 등록 (0) | 2016.12.26 |