1. 개요
■ 지난 포스팅 : [JSP개발] 게시판 - 방명록 목록 보기
이번에는 방명록의 답글을 구현할 것이다. 방명록의 답글 작성 화면은 팝업창으로 나타나게 구현할 것이다.
■ JSP
GuestbookForm.jsp : 답글 작성 팝업창을 표시할 코드를 추가해 준다.
GuestbookReplyForm.jsp : 답글 작성 창이다. 팝업창으로 나타나며, 등록을 누르면 답글이 등록되고 창이 닫힌다.
■ Java
GuestbookBean.java : 자바빈에는 답변 글의 Level 값을 담을 변수를 추가한다.
GuestbookDAO.java : 방명록 1개의 정보를 가져오는 메서드를 추가한다.
GuestbookReplyFormAction.java : 방명록 답글 화면을 표시하는 Action이다.
GuestbookReplyAction.java : 방명록 답글을 처리하는 Action이다.
2. 소스 코드
■ GuestbookBean.java
답변 글의 Level 값을 담을 변수와 Gatter/Setter을 추가해준다.
1 2 3 4 5 6 7 8 9 | // 이 부분만 추가해 준다. private int guestbook_level; // 답변글 깊이 public int getGuestbook_level() { return guestbook_level; } public void setGuestbook_level(int guestbook_level) { this.guestbook_level = guestbook_level; | cs |
■ GuestbookForm.jsp
답글을 클릭하면 답글 작성 창이 나타나게 하는 함수이다. 여기서 부모창과 자식창의 이름을 지정해 둔 이유는 답글 작성 후 다시 부모창(방명록 화면)으로 돌아오게 하기 위해서이다. (부모창(방명록) → 자식창(답글 창) → 부모창(방명록) 이런 순서로 동작하게 하기 위해서이다.)
답글 창을 띄울 때 어떤 방명록의 답글인지 나타내기 위해 방명록의 글 번호를 전달한다. 그리고 답글 작성 후 원래 페이지로 돌아오게 하기 위해 현재 페이지 번호도 전달한다.
방명록 작성 시 로그인했을 경우 이름을 입력하는 부분에 로그인한 아이디가 입력되도록 처리한다.
방명록 목록을 표시해 주는 부분에서는 답글의 경우 이름 앞에 공백과 이미지가 표시되도록 한다. 그리고 119줄을 보면 [답변] 클릭 시 답글 창을 띄우는 함수가 실행되도록 이벤트를 주었다. 이때 방명록의 글 번호를 인자로 전달한다.
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 | <%@ 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"); } </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="#" >[삭제]</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 |
■ GuestbookReplyFormAction.java
방명록 답글 화면을 표시하는 Action이다.
먼저 GuestbookForm.jsp에서 넘겨받은 방명록 글 번호와 페이지 번호를 가져온다. 방명록 글 번호는 부모 글의 정보를 가져오기 위해 사용할 것이다.
넘겨받은 글 번호로 DB에서 부모 방명록의 정보를 가져와서 reuqest에 세팅한다. reuqest에 담긴 정보는 답글 작성 화면인 GuestbookReplyForm.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 | 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 GuestbookReplyFormAction 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/GuestbookReplyForm.jsp"); return forward; } } | cs |
■ GuestbookDAO.java
DAO에는 방명록 1개의 정보를 가져오는 메서드를 추가한다. 이 메서드는 GuestbookReplyFormAction에서 사용된다.
그리고 방명록 목록을 가져오는 getGuestbookList( ) 메서드에 위에 표시된 코드를 추가해 준다. Level 값이 필요한 이유는 답글일 경우 글 앞에 공백과 이미지를 추가해 주기 위해서이다.
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 | 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 // 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 |
■ GuestbookReplyForm.jsp
답글 작성 화면이다. 여기에서는 답글 작성 후 등록을 누를 경우 다시 방명록 화면(부모창)으로 돌아가야 하며 작성한 답글이 화면에 바로 출력되어야 한다.
checkValue( )를 보자. 22번 줄은 <form>태그를 가져오는 부분이다. 그리고 24~38번 줄은 답글 작성 화면에서 입력 정보를 체크하는 부분이다.
41번 줄을 보면 target을 부모 창으로 설정해준다. 이때 답글 작성창(자식창)의 <form>태그에도 target을 적어주어야 한다. 42~43번 줄을 보면 method와 이동할 경로를 지정해 둔 부분이다.
46~49번 줄은 전송 후 창이 자동적으로 닫히게 처리하는 부분이다.
<form>태그에 target으로 부모창의 이름을 적어준다. 답글 저장 시 부모 글의 번호와 그룹번호가 필요하므로 hidden으로 가지고 있다가 답글 등록 시 같이 전송을 해준다.
답글 창에서도 방명록과 마찬가지로 로그인을 했을 경우 이름 부분에 로그인한 아이디가 입력되도록 한다.
등록 버튼을 누를 경우 checkValue( ) 함수가 실행되며, 창 닫기 버튼을 누를 경우 창이 바로 닫히도록 처리한다.
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 | <%@ 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; } #writeReplyForm{ text-align :center; } </style> <script type="text/javascript"> function checkValue(){ var form = document.forms[0]; if(!form.guestbook_id.value) { alert("이름을 입력하세요."); return false; } else if(!form.guestbook_password.value) { alert("비밀번호를 입력하세요."); return false; } else if(!form.guestbook_content.value) { alert("내용을 입력하세요."); return false; } else { form.target = opener.name; form.method="post"; form.action="GuestbookReplyAction.ge?page=${pageNum}"; form.submit(); if (opener != null) { opener.rForm = 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="writeReplyForm"> <form name="replyInfo" target="replyForm"> <!-- 부모 방명록의 정보를 같이 전송한다. --> <input type="hidden" name="guestbook_no" value="${guestbook.guestbook_no}"/> <input type="hidden" name="guestbook_group" value="${guestbook.guestbook_group}"/> <table width="550"> <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="70" name="guestbook_content"></textarea> </td> </tr> </table> <br> <input type="button" value="등록" id="replyInsert" onclick="checkValue()"> <input type="button" value="창닫기" onclick="window.close()"> </form> </div> <!-- 답글 등록 부분 끝--> </div> </body> </html> | cs |
■ GuestbookReplyAction.java
GuestbookReplyAction에서는 방명록 답글을 처리하는 작업을 한다.
GuestbookReplyForm.jsp에서 넘겨받은 파라미터 값들을 추출한다.
추출한 파라미터 값을 자바빈에 세팅한다. 이때 글 번호는 시퀀스 값을, parent는 부모 방명록의 글 번호를 세팅한다. 이후 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 | 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 GuestbookReplyAction 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(); // 답글 작성 후 원래 페이지로 돌아가기 위해 페이지 번호가 필요하다. String pageNum = request.getParameter("page"); // 파리미터를 가져온다. int guestbook_no = Integer.parseInt(request.getParameter("guestbook_no")); String guestbook_id = request.getParameter("guestbook_id"); String guestbook_password = request.getParameter("guestbook_password"); String guestbook_content = request.getParameter("guestbook_content"); int guestbook_group = Integer.parseInt(request.getParameter("guestbook_group")); guestbook.setGuestbook_no(dao.getSeq()); guestbook.setGuestbook_id(guestbook_id); guestbook.setGuestbook_password(guestbook_password); guestbook.setGuestbook_content(guestbook_content); guestbook.setGuestbook_group(guestbook_group); guestbook.setGuestbook_parent(guestbook_no); // 부모 방명록의 글번호를 세팅 boolean result = dao.guestbookInsert(guestbook); if(result){ forward.setRedirect(true); forward.setNextPath("GuestbookListAction.ge?page="+pageNum); } return forward; } } | cs |
■ GuestbookCommand.properties
프로퍼티에는 방명록 답글 관련 명령어를 추가한다.
1 2 3 4 5 6 7 8 | # Form Change GuestbookForm.ge=jsp.guestbook.action.GuestbookFormAction GuestbookReplyFormAction.ge=jsp.guestbook.action.GuestbookReplyFormAction # Action GuestbookWriteAction.ge=jsp.guestbook.action.GuestbookWriteAction GuestbookListAction.ge=jsp.guestbook.action.GuestbookListAction GuestbookReplyAction.ge=jsp.guestbook.action.GuestbookReplyAction | cs |
3. 실행 결과
방명록에서 [답변]을 클릭 시 답글 작성 창이 나타난다.
답글을 작성하면 이름 앞에 공백과 이미지가 추가되어 목록에 나타난다.
4. 소스코드 다운로드 (war 파일)
'코딩 > JSP' 카테고리의 다른 글
[JSP개발] 게시판 - 방명록 수정 (15) | 2017.01.01 |
---|---|
[JSP개발] 게시판 - 방명록 삭제 (0) | 2016.12.29 |
[JSP개발] 게시판 - 방명록 목록 보기 (0) | 2016.12.27 |
[JSP개발] 게시판 - 방명록 등록 (0) | 2016.12.26 |
[JSP개발] 게시판 - 방명록 화면 (3) | 2016.12.25 |