지난 시간에 이어서 이번에는 두 번째 단계인 게시판 수정, 답변 기능을 만들어 보겠다.
수정 기능은 list.jsp 페이지에서 게시물의 제목을 클릭하면 read.jsp 페이지로 이동한다. read.jsp 페이지에 삭제, 수정, 답변의 기능을 수행하는 페이지의 링크가 있고 수정을 클릭하면 update.jsp 페이지로 이동한다. 이동한 update.jsp 페이지에서 수정할 게시물의 내용을 수정하고 비밀번호를 입력한 후에 BoardUpdateServlet.java 서블릿에서 수정한 게시물의 내용을 tblBoard 테이블에 수정을 한다. 물론 비밀번호 값이 틀리면 수정은 되지 않는다.
마지막으로 답변 기능이다. read.jsp 페이지에서 답변을 클릭하면 reply.jsp 페이지로 이동한다. 답변할 게시물의 내용을 입력하고, 저장을 클릭하면 BoardReplyServlet.java 서블릿에서 답변한 게시물을 tblBoard 테이블에 저장한다.
지금까지 두 번째 단계에 대한 흐름의 설명이다. 첫 번째 단계를 잘 이해했다면 두 번째 단계도 쉽게 구현할 수 있을 것이다.
[update.jsp]
<%@ page contentType="text/html; charset=EUC-KR" %>
<%@ page import="BoardPack.BoardBean"%>
<%
int num = Integer.parseInt(request.getParameter("num"));
String nowPage = request.getParameter("nowPage");
// 세션에 저장되어 있는 게시물을 'bean' 이라는 키 값으로 가져옴
BoardBean bean = (BoardBean)session.getAttribute("bean");
// bean에 저장되어 있는 값들을 반환함
String subject = bean.getSubject();
String name = bean.getName();
String content = bean.getContent();
%>
<html>
<head>
<title>JSP Board</title>
<link href="style.css" rel="stylesheet" type="text/css">
<script>
// 수정할 내용을 입력하고 비밀번호 입력 여부를 체크하는 자바스크립트 함수임
function check() {
if (document.updateFrm.pass.value == "") {
alert("수정을 위해 패스워드를 입력하세요.");
document.updateFrm.pass.focus();
return false;
}
document.updateFrm.submit();
}
</script>
</head>
<body bgcolor="#FFFFCC">
<div align="center"><br/><br/>
<table width="600" cellpadding="3">
<tr>
<td bgcolor="#FF9018" height="21" align="center">수정하기</td>
</tr>
</table>
<!-- action 부분 -> 서블릿 BoardUpdateServlet의 매핑으로 설정된 boardUpdate를 호출함 -->
<form name="updateFrm" method="post" action="boardUpdate">
<table width="600" cellpadding="7">
<tr>
<td>
<table>
<tr>
<td width="20%">성 명</td>
<td width="80%">
<input name="name" value="<%=name%>" size="30" maxlength="20">
</td>
</tr>
<tr>
<td>제 목</td>
<td>
<input name="subject" size="50" value="<%=subject%>" maxlength="50">
</td>
<tr>
<td>내 용</td>
<td>
<textarea name="content" rows="10" cols="50"><%=content%></textarea>
</td>
</tr>
<tr>
<td>비밀 번호</td>
<td><input type="password" name="pass" size="15" maxlength="15">
수정 시에는 비밀번호가 필요합니다.</td>
</tr>
<tr>
<td colspan="2" height="5"><hr/></td>
</tr>
<tr>
<td colspan="2">
<input type="button" value="수정완료" onClick="check()">
<input type="reset" value="다시수정">
<input type="button" value="뒤로" onClick="history.go(-1)">
</td>
</tr>
</table>
</td>
</tr>
</table>
<input type="hidden" name="nowPage" value="<%=nowPage %>">
<input type='hidden' name="num" value="<%=num%>">
</form>
</div>
</body>
</html>
int num = Integer.parseInt ~ String nowPage = request.getParameter("nowPage");
: read.jsp에서 넘겨준 현재 페이지 값과 게시번호 값을 request 내부 객체의 getParemeter 메소드로 받아서 String nowPage, num에 각각 반환한다.
<input type="hidden" name="nowPage" value="<%=nowPage %>">
~
<input type='hidden' name="num" value="<%=num%>">
: 현재 페이지 값과 게시번호 값을 자기 수정 처리 서블릿(BoardUpdateServlet.java)로 호출해야 한다. 그래서 폼의 내용들과 같이 넘기기 위해서 현재 페이지 값과 게시번호 값을 hidden 타입으로 지정하였다.
[결과]
[BoardUpdateServlet.java]
package BoardPack;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/BoardPack/boardUpdate")
public class BoardUpdateServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("EUC-KR");
response.setContentType("text/html; charset=EUC-KR");
// 요청 객체(request)에서 세션 객체를 리턴받음
HttpSession session = request.getSession();
// 브라우저에 출력을 위해 출력 객체를 응답 객체에서 리턴받음
PrintWriter out = response.getWriter();
BoardMgr bMgr = new BoardMgr();
// 세션에 저장을 했던 게시물을 세션에서 다시 가져옴
BoardBean bean = (BoardBean) session.getAttribute("bean");
// update.jsp에서 넘긴 값을 nowPage 문자열 변수로 받음
String nowPage = request.getParameter("nowPage");
BoardBean upBean = new BoardBean();
// num 값은 정수 타입이므로 정수로 변환해서 빈즈에 저장함
upBean.setNum(Integer.parseInt(request.getParameter("num")));
upBean.setName(request.getParameter("name"));
upBean.setSubject(request.getParameter("subject"));
upBean.setContent(request.getParameter("content"));
upBean.setPass(request.getParameter("pass"));
upBean.setIp(request.getParameter("ip"));
// update.jsp에서 입력한 비밀번호임
String upPass = upBean.getPass();
// 세션에 저장을 했던 비밀번호임
String inPass = bean.getPass();
// upPass와 inPass의 값이 같다면 수정을 실행하기 위한 if문
if (upPass.equals(inPass)) {
// tblBoard 테이블에 수정이 실행됨
bMgr.updateBoard(upBean);
// 수정 후에 read.jsp로 넘어갈 때 nowPage와 num 값을 가지고 감
String url = "read.jsp?nowPage=" + nowPage + "&num=" + upBean.getNum();
// 매개변수 url로 페이지로 감
response.sendRedirect(url);
} else {
// upPass와 inPass의 값이 다르면 실행하기 위한 else문임
out.println("<script>");
out.println("alert('입력하신 비밀번호가 아닙니다.');");
// update.jsp 페이지로 돌아가는 스크립트 명령어임
out.println("history.back();");
out.println("</script>");
}
}
}
[reply.jsp]
<%@ page contentType="text/html; charset=EUC-KR" %>
<!-- read.jsp에서 세션에 저장한 게시물 객체를 세션에서 다시 옴
이때 반드시 저장한 id 값이 bean으로 선언해야 함 -->
<jsp:useBean id="bean" class="BoardPack.BoardBean" scope="session"/>
<%
String nowPage = request.getParameter("nowPage");
String subject = bean.getSubject();
String content = bean.getContent();
%>
<html>
<head>
<title>JSPBoard</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body bgcolor="#FFFFCC">
<div align="center">
<br><br>
<table width="600" cellpadding="3">
<tr>
<td bgcolor="#CCCC00" height="21" align="center">답변하기</td>
</tr>
</table>
<!-- 서블릿 BoardReplyServlet의 매핑으로 설정된 boardReply를 호출함 -->
<form method="post" action="boardReply" >
<table width="600" cellpadding="7">
<tr>
<td>
<table>
<tr>
<td width="20%">성 명</td>
<td width="80%">
<input name="name" size="30" maxlength="20"></td>
</tr>
<tr>
<td>제 목</td>
<td>
<!-- 답변하고자 하는 게시물의 제목을 보여줌 -->
<input name="subject" size="50" value="답변 : <%=subject%>" maxlength="50"></td>
</tr>
<tr>
<td>내 용</td>
<td>
<!-- 답변하고자 하는 게시물의 내용을 보여줌 -->
<textarea name="content" rows="12" cols="50">
<%=content %>
========답변 글을 쓰세요.=======
</textarea>
</td>
</tr>
<tr>
<td>비밀 번호</td>
<td>
<input type="password" name="pass" size="15" maxlength="15"></td>
</tr>
<tr>
<td colspan="2" height="5"><hr/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="답변등록" >
<input type="reset" value="다시쓰기">
<input type="button" value="뒤로" onClick="history.back()"></td>
</tr>
</table>
</td>
</tr>
</table>
<input type="hidden" name="ip" value="<%=request.getRemoteAddr()%>" >
<input type="hidden" name="nowPage" value="<%=nowPage%>">
<input type="hidden" name="ref" value="<%=bean.getRef()%>">
<input type="hidden" name="pos" value="<%=bean.getPos()%>">
<input type="hidden" name="depth" value="<%=bean.getDepth()%>">
</form>
</div>
</body>
</html>
String nowPage = request.getParameter("nowPage"); ~ String content = bean.getContent();
: read.jsp에서 넘겨준 현재 페이지 값을 request 내부 객체의 getParameter 메소드로 받아서 nowPage에 반환한다. 또한 세션에서 가져온 bean 객체를 통해 원 글의 제목과 내용을 가져와 subject, content에 각각 할당한다.
<input type="submit" value="답변등록" >
: 답변의 내용을 입력하고 [답변하기] 버튼을 클릭하면 위의 form의 action 값으로 설정된 boardReply(BoardReplyServlet.java)로 이동한다.
[결과]
[BoardReplyServlet.java]
package BoardPack;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 서블릿 매핑 이름을 선언함
@WebServlet("/BoardPack/boardReply")
public class BoardReplyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("EUC-KR");
BoardMgr bMgr = new BoardMgr();
BoardBean reBean = new BoardBean();
reBean.setName(request.getParameter("name"));
reBean.setSubject(request.getParameter("subject"));
reBean.setContent(request.getParameter("content"));
reBean.setRef(Integer.parseInt(request.getParameter("ref")));
reBean.setPos(Integer.parseInt(request.getParameter("pos")));
reBean.setDepth(Integer.parseInt(request.getParameter("depth")));
reBean.setPass(request.getParameter("pass"));
reBean.setIp(request.getParameter("ip"));
// 답변하고자 하는 게시물 이전에 있는 게시물의 상대적인 위치 값을 수정함
bMgr.replyUpBoard(reBean.getRef(), reBean.getPos());
// 답변 게시물을 tblBoard 테이블에 저장함
bMgr.replyBoard(reBean);
String nowPage = request.getParameter("nowPage");
// 답변 게시물을 저장하고 list.jsp로 현재의 페이지 값(nowPage)을 가지고 이동함
response.sendRedirect("list.jsp?nowPage="+nowPage);
}
}
bMgr.replyUpBoard(reBean.getRef(), reBean.getPos());
: 게시물의 상대적인 위치 값을 수정하기 위해서 매개변수는 답변하고자 하는 게시물의 ref와 pos 값으로 지정하였다. 만약 다수의 답변 글 중간에 답변을 추가해야 한다면 추가하려는 답변 글보다 아래에 있는 답변 글들의 pos 값을 1씩 증가시켜서 밑으로 밀어낸다. replyBoard()와 replyUpBoard()에 대한 자세한 설명은 다음 포스팅에서 다루도록 하겠다.
response.sendRedirect("list.jsp?nowPage="+nowPage);
: 답변의 상대적인 위치 글 증가와 답변을 처리 후에, nowPage 값을 가지고 list.jsp 페이지로 넘어간다.
이것으로 두 번째 파트를 끝내겠다. 다음 포스팅에서는, 마지막으로 게시판에 필요한 자바와 빈즈에 대해서 다루어 보도록 하겠다.
'JSP&Servlet' 카테고리의 다른 글
import와 useBean의 차이 (0) | 2022.04.18 |
---|---|
계층형 게시판(4) (0) | 2022.04.12 |
계층형 게시판(2) (0) | 2022.04.05 |
계층형 게시판(1) (0) | 2022.04.04 |
회원가입 및 로그인 (0) | 2022.03.30 |