JSP 쇼핑몰 만들기
14. 모델2 게시판 - 게시글 보기 3
14.1 foward
BoardList.jsp객체 쪽으로 request객체에 담아서 넘겨줘야한다.
//BoardList.jsp객체 쪽으로 request객체에 담아서 넘겨줌
request.setAttribute("list", list);
request.setAttribute("number", number);
request.setAttribute("pageSize", pageSize);
request.setAttribute("count", count);
request.setAttribute("currentPage", currentPage);
RequestDispatcher dis = request.getRequestDispatcher("BoardList.jsp");
dis.forward(request, response);14.2 BoardList.jsp
포워드 받은 데이터로 BoardList.jsp작성
BoardWriteForm.jsp을 컨트롤러를 들려서 가는게 좋긴하겟지만 자바코드가 필요없으니
바로 가게 해주자.
number는 -1씩 줄어들도록 따로 변수를 선언하고 반복문을 돌때마다 -1이 되도록하자.
제목은 들여쓰기를 해야하니 또 c:foreach를 사용해서 넣어주자.
1부터 스텝만큼 띄어쓰기를 해주자.
<div align="center">
<h2>전체 게시글 보기</h2>
<table border="1">
<tr>
<td align="right" colspan="5">
<button type="button" onclick="location.href='BoardWriteForm.jsp'">글쓰기</button>
</td>
</tr>
<tr height="40">
<td align="center" width="50"> 번호 </td>
<td align="center" width="320"> 제목 </td>
<td align="center" width="100"> 작성자 </td>
<td align="center" width="150"> 작성일 </td>
<td align="center" width="80"> 조회수 </td>
</tr>
<c:set var="number" value="${number}"></c:set>
<c:forEach var="bean" items="${list}" >
<tr height="40">
<td align="center" width="50"> ${number} </td>
<td align="left" width="320">
<c:if test="${bean.re_step > 1}">
<c:forEach var="j" begin="1" end="${(bean.re_step-1) * 5}">
</c:forEach>
</c:if>
<a href="BoardInfoControl.do?num=${bean.num }">${bean.subject }</a>
</td>
<td align="center" width="100"> ${bean.writer } </td>
<td align="center" width="150"> ${bean.reg_date } </td>
<td align="center" width="80"> ${bean.readcount } </td>
</tr>
<c:set var="number" value="${number-1}"></c:set>
</c:forEach>
</table>
</div>15. 모델2 게시판 - 게시글 보기 4
카운터링이 필요하니 카운터링을 넣어줘야한다.
이전에 사용한 카운터링을 가져다 사용하면된다.
받아온 값을 정수로 변경하기 위해 fmt태그를 사용할 수 있다.
tablib fmt를 추가해야한다.
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:parseNumber var="result" value="${currentPage / 10}" integerOnly="true"/>
number로 파싱을 하는데 이름은 result이고 파싱할값은 value integerOnly은 숫자로만 만들겠다는것이다.
이것을 다시 set해서 startPage변수에 넣어주면된다.
<p>
<!-- 페이지 카운터링 소스 작성 -->
<c:if test="${count >0}">
<c:set var="pageCount" value="${count / pageSize + (count % pageSize == 0 ? 0 : 1) }"/>
<c:set var="startPage" value="1"/>
<fmt:parseNumber var="result" value="${currentPage / 10}" integerOnly="true"/>
<c:if test="${currentPage % 10 !=0}">
<!-- 결과를 정수형으로 리턴받아야하기에 fmt태그사용 -->
<c:set var="startPage" value="${result * 10 + 1}"/>
</c:if>
<c:if test="${ currentPage % 10 ==0}">
<c:set var="startPage" value="${(result-1) * 10 + 1}"/>
</c:if>
<!-- 화면에 보여질 페이지 처리 숫자를 표현 -->
<c:set var="pageBlock" value="10" />
<c:set var="endPage" value="${startPage + pageBlock -1}" />
<c:if test="${endPage > pageCount}">
<c:set var="endPage" value="${pageCount}"/>
</c:if>
<!-- 이전 링크를 걸지 파악 -->
<c:if test="${startPage > 10}">
<a href="BoardListCon.do?pageNum=${startPage - 10}">[이전]</a>
</c:if>
<!-- 페이징처리 -->
<c:forEach var="i" begin="${startPage}" end="${endPage}">
<a href="BoardListCon.do?pageNum=${i}">[${i}]</a>
</c:forEach>
<!-- 다음 링크를 걸지 파악 -->
<c:if test="${endPage < pageCount}">
<a href="BoardListCon.do?pageNum=${startPage + 10}">[다음]</a>
</c:if>
</c:if>
</p>16. 모델2 게시판 - 게시글 쓰기
글보기 까지 만들었으니 글쓰기를 만들어보자.
글쓰기를 처리하면 BoardWriteProcCon.do 컨트롤러로 가게 해주자.
BoardWriteProcCon.do에서는 bean클래스로 읽어들이고 db와 연결하는 것을 만들어주면된다.
번호는 자동으로 늘어나고 ref는 현재 값을 가져와야하니 불러온다.
16.1 BoardDAO
// 하나의 게시글을 저장하는 메소드 호출
public void insertBoard(BoardBean bean) {
getCon();
int ref = 0;
// 새글이기에 = 부모글이기에
int re_step = 1;
int re_level = 1;
try {
String refsql = "SELECT MAX(REF) FROM BOARD";
pstmt = con.prepareStatement(refsql);
// 쿼리 실행후 결과를 리턴
if (rs.next()) {
ref = rs.getInt(1) + 1; // 가장큰값에 1더하기
}
String sql = "INSERT INTO BOARD(WRITER, EMAIL, SUBJECT, PASSWORD, REG_DATE, REF, RE_STEP, RE_LEVEL, READCOUNT, CONTENT)"
+ " VALUES(?, ?, ?, ?, NOW(), ?, ?, ?, 0, ?)";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, bean.getWriter());
pstmt.setString(2, bean.getEmail());
pstmt.setString(3, bean.getSubject());
pstmt.setString(4, bean.getPassword());
pstmt.setInt(5, ref);
pstmt.setInt(6, re_step);
pstmt.setInt(7, re_level);
pstmt.setString(8, bean.getContent());
pstmt.executeUpdate();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}16.2 BoardWriteProc
한글이 깨지지 않도록 request.setCharacterEncoding("UTF-8"); 꼭해주자!!
@WebServlet("/BoardWriteProcCon.do")
public class BoardWriteProcCon extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
reqPro(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
reqPro(request, response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//빈클래스로 데이터 읽어들임
BoardBean bean = new BoardBean();
bean.setWriter(request.getParameter("writer"));
bean.setSubject(request.getParameter("subject"));
bean.setEmail(request.getParameter("email"));
bean.setPassword(request.getParameter("password"));
bean.setContent(request.getParameter("content"));
BoardDAO2 bdao = new BoardDAO2();
bdao.insertBoard(bean);
RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
dis.forward(request, response);
}
}17. 모델2 게시판 - 게시글판 보기
제목을 누르면 상세 글을 읽어보자.
17.1 BoardDAO
게시글의 번호를 받아와서 보는 것이다.
일단 글을 읽으면 조회수가 올라야하니 조회수에 +1해주는 쿼리를 실행시키고 데이터를 가져와야한다.
//하나의 게시글을 읽어오는 메소드
public BoardBean getOneBoard(int num) {
getCon();
BoardBean bean = null;
try {
String countsql = "UPDATE BOARD SET READCOUNT = READCOUNT + 1 WHERE NUM = ?";
pstmt = con.prepareStatement(countsql);
pstmt.setInt(1, num);
pstmt.executeUpdate();
String sql = "SELECT * FROM BOARD WHERE NUM = ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();
if (rs.next()) {
bean = new BoardBean();
bean.setNum(rs.getInt(1));
bean.setWriter(rs.getString(2));
bean.setEmail(rs.getString(3));
bean.setSubject(rs.getString(4));
bean.setPassword(rs.getString(5));
bean.setReg_date(rs.getDate(6).toString());
bean.setRef(rs.getInt(7));
bean.setRe_step(rs.getInt(8));
bean.setRe_level(rs.getInt(9));
bean.setReadcount(rs.getInt(10));
bean.setContent(rs.getString(11));
}
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}17.2 BoardInfoCon
bean을 담아서 jsp쪽으로 보내주면된다.
@WebServlet("/BoardInfoCon.do")
public class BoardInfoCon extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
reqPro(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
reqPro(request, response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//number값을 리턴
int num = Integer.parseInt(request.getParameter("num"));
BoardDAO2 bdao = new BoardDAO2();
//하나의 게시글 정보 리턴
BoardBean bean = bdao.getOneBoard(num);
request.setAttribute("bean", bean);
//view로 넘겨주기
RequestDispatcher dis = request.getRequestDispatcher("BoardInfo.jsp");
dis.forward(request, response);
}
}17.3 BoardInfo
EL을 통해서 값을 가져오고 각 컨트롤러로 가지게 하자.
<div align="center">
<h2>게시글 보기</h2>
<table border="1">
<tr height="40">
<td align="center" width="120px"> 글번호 </td>
<td align="center" width="180px"> ${bean.num } </td>
<td align="center" width="120px"> 조회수 </td>
<td align="center" width="180px"> ${bean.readcount } </td>
</tr>
<tr height="40">
<td align="center" width="120px"> 작성자 </td>
<td align="center" width="180px"> ${bean.writer } </td>
<td align="center" width="120px"> 작성일 </td>
<td align="center" width="180px"> ${bean.reg_date } </td>
</tr>
<tr height="40">
<td align="center" width="120px"> 이메일 </td>
<td align="center" colspan="3"> ${bean.email } </td>
</tr>
<tr height="40">
<td align="center" width="120px"> 제목 </td>
<td align="center" colspan="3"> ${bean.subject } </td>
</tr>
<tr height="80">
<td align="center" width="120px"> 글내용 </td>
<td align="center" colspan="3"> ${bean.content } </td>
</tr>
<tr height="40">
<td align="center" colspan="4">
<input type="button" value="답글쓰기" onclick="location.href='BoradReWriteCon.do?num=${bean.num }&ref=${bean.ref}&re_step=${bean.re_step}&re_level=${bean.re_step }'"/>
<input type="button" value="수정하기" onclick="location.href='BoardUpdateCon.do?num=${bean.num}'"/>
<input type="button" value="삭제하기" onclick="location.href='BoardDeleteCon.do?num=${bean.num}'"/>
<input type="button" value="목록보기" onclick="location.href='BoardListCon.do.jsp'"/>
</td>
</tr>
</table>
</div>18. 모델2 게시판 - 답글쓰기
18.1 BoradReWriteCon.do
가져온 부모의 정보들로 BoardReWriteForm.jsp를 보여주면된다.
protected void reqPro(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int ref = Integer.parseInt(request.getParameter("ref"));
int re_step = Integer.parseInt(request.getParameter("re_step"));
int re_level = Integer.parseInt(request.getParameter("re_level"));
request.setAttribute("ref", ref);
request.setAttribute("re_step", re_step);
request.setAttribute("re_level", re_level);
RequestDispatcher dis = request.getRequestDispatcher("BoardReWriteForm.jsp");
dis.forward(request, response);
}18.2 BoardReWriteForm.jsp
BoardReWriteProcCon.do로 가지게 form의 데이터를 넘겨준다.
ref값등은 hidden으로 넘겨준다.
<div align="center">
<form action="BoardReWriteProc.do" method="post">
<table border="1">
<tr height="40">
<td align="center" width="150px">작성자</td>
<td width="450px"><input type="text" name="writer" size="60" /></td>
</tr>
<tr height="40">
<td align="center" width="150px">제목</td>
<td width="450px"><input type="text" name="subject" value="[답변]" size="60" /></td>
</tr>
<tr height="40">
<td align="center" width="150px">이메일</td>
<td width="450px"><input type="email" name="email" size="60" /></td>
</tr>
<tr height="40">
<td align="center" width="150px">비밀번호</td>
<td width="450px"><input type="password" name="password" size="60" /></td>
</tr>
<tr height="40">
<td align="center" width="150px">글내용</td>
<td width="450px"><textarea rows="10" cols="50" name="content"></textarea></td>
</tr>
<!-- form에서 사용자로부터 입력받지 않고 데이터를 넘김 -->
<tr height="40">
<td align="center" colspan="2">
<input type="hidden" name="ref" value="${ref}"/>
<input type="hidden" name="re_step" value="${re_step}"/>
<input type="hidden" name="re_level" value="${re_level }"/>
<input type="submit" value="답글쓰기 완료">
<input type="reset" value="취소">
<input type="button" value="전체 글 보기" onclick="location.href='BoardListProc.do'" />
</td>
</tr>
</table>
</form>
</div>18.3 BoardReWriteProcCon.do
protected void reqPro(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
BoardBean bean = new BoardBean();
int ref = Integer.parseInt(request.getParameter("ref"));
int re_step = Integer.parseInt(request.getParameter("re_step"));
int re_level = Integer.parseInt(request.getParameter("re_level"));
bean.setWriter(request.getParameter("writer"));
bean.setSubject(request.getParameter("subject"));
bean.setEmail(request.getParameter("email"));
bean.setPassword(request.getParameter("password"));
bean.setContent(request.getParameter("content"));
bean.setRef(ref);
bean.setRe_step(re_step);
bean.setRe_level(re_level);
BoardDAO2 bdao = new BoardDAO2();
bdao.reInsertBoard(bean);
RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
dis.forward(request, response);
}18.4 BoardDAO2
BoardReWriteProcCon.do에서 만든 bean클래스를 db에 넣어주자.
답글은 부모의 ref와 같게 re_step +1씩늘어나게 re_level은 부모보다 큰애들은 +1해주면된다.
그리고 현재 작성하는 글은 부모보다 +1씩해주면된다.
//답변글을 저장하는 메소드
public void reInsertBoard(BoardBean bean) {
getCon();
int ref = bean.getRef();
// 새글이기에 = 부모글이기에
int re_step = bean.getRe_step();
int re_level = bean.getRe_level();
try {
//핵심코드 restep +1 relevel부모보다 높으면 +1
String levelsql = "UPDATE BOARD SET RE_LEVEL = RE_LEVEL + 1 WHERE REF=? AND RE_LEVEL > ? ";
pstmt = con.prepareStatement(levelsql);
pstmt.setInt(1, ref);
pstmt.setInt(2, re_level);
pstmt.executeUpdate();
String sql = "INSERT INTO BOARD(WRITER, EMAIL, SUBJECT, PASSWORD, REG_DATE, REF, RE_STEP, RE_LEVEL, READCOUNT, CONTENT)"
+ " VALUES(?, ?, ?, ?, NOW(), ?, ?, ?, 0, ?)";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, bean.getWriter());
pstmt.setString(2, bean.getEmail());
pstmt.setString(3, bean.getSubject());
pstmt.setString(4, bean.getPassword());
pstmt.setInt(5, ref);
pstmt.setInt(6, re_step + 1); //기본부모글의 스탭보다 +1
pstmt.setInt(7, re_level + 1); //기존 부모글의 레벨보다 +1
pstmt.setString(8, bean.getContent());
pstmt.executeUpdate();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}19. 모델2 게시판- 게시판 수정 고급
수정버튼을 누르면 BoardUpdateCon.do서블릿으로 가면된다.
19.1 BoardUpdateCon.do
받은 num을 기준으로 수정폼에 데이터를 얻어오면된다.
@WebServlet("/BoardUpdateCon.do")
public class BoardUpdateCon extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
reqPro(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
reqPro(request, response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int num = Integer.parseInt(request.getParameter("num"));
BoardDAO2 bdao = new BoardDAO2();
BoardBean bean = bdao.getOneUpdateBoard(num);
request.setAttribute("bean", bean);
RequestDispatcher dis = request.getRequestDispatcher("BoardUpdateForm.jsp");
dis.forward(request, response);
}
}19.2 하나의 게시글 정보
조회수 증가하지 않도록 이전의 게시글 리턴 메소드를 수정해준다.
//조회수 증가하지 않는 하나의 게시글 리턴 메소드
public BoardBean getOneUpdateBoard(int num) {
getCon();
BoardBean bean = null;
try {
String sql = "SELECT * FROM BOARD WHERE NUM = ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();
if (rs.next()) {
bean = new BoardBean();
bean.setNum(rs.getInt(1));
bean.setWriter(rs.getString(2));
bean.setEmail(rs.getString(3));
bean.setSubject(rs.getString(4));
bean.setPassword(rs.getString(5));
bean.setReg_date(rs.getDate(6).toString());
bean.setRef(rs.getInt(7));
bean.setRe_step(rs.getInt(8));
bean.setRe_level(rs.getInt(9));
bean.setReadcount(rs.getInt(10));
bean.setContent(rs.getString(11));
}
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}19.3 updateform
hidden으로 bean의 password를 넘겨서 db를 안거치고 비밀번호 확인해서 수정하자.
<div align="center">
<h2>게시글 수정</h2>
<form action="BoardUpdateProcCon.do" method="post">
<table border="1">
<tr height="40">
<td align="center" width="120px"> 작성자 </td>
<td align="center" width="180px"> ${bean.writer } </td>
<td align="center" width="120px"> 작성일 </td>
<td align="center" width="180px"> ${bean.reg_date } </td>
</tr>
<tr height="40">
<td align="center" width="120px"> 제목 </td>
<td width="480px" colspan="3"> <input type="text" name="subject" size="60" value=" ${bean.subject } "/> </td>
</tr>
<tr height="40">
<td align="center" width="120px"> 패스워드 </td>
<td width="480px" colspan="3"> <input type="password" name="password" size="60"/> </td>
</tr>
<tr height="40">
<td align="center" width="120px"> 글내용 </td>
<td width="480px" colspan="3"> <textarea rows="10" cols="60" name="content" align="left"/>${bean.content }</textarea></td>
</tr>
<tr height="40">
<td align="center" colspan="4">
<input type="hidden" name="num" value="${bean.num}"/>
<input type="hidden" name="dbpassword" value="${bean.password}"/>
<input type="submit" value="글수정" />
<input type="button" value="전체글보기" onclick="location.href='BoardListCon.do'"/>
</td>
</tr>
</table>
</form>
</div>20. 모델2 게시판 - 수정과 삭제
수정을 하기 위해서 전체 값을 받아올 필요는 없다.
바꿀 제목과 컨텐츠만 받아오고 받아온 비밀번호를 비교해서 일치하면수정 불일치하면 돌아가도록하자.
20.1 updateBoard()
bean을 넣어도되지만 간단하게 subject와 content를 받고 직접 수정하자.
//업데이트하기
public void UpdateBoard(int num, String subject, String content) {
getCon();
try {
String sql = "UPDATE BOARD SET SUBJECT = ?, CONTENT = ? WHERE NUM = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, subject);
pstmt.setString(2, content);
pstmt.setInt(3, num);
pstmt.executeUpdate();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}20.2 BoardUpdateProcCon.do
수정이 완료되었다면 전체게시글보기
비밀번호가 틀리면 이전페이지로 이동하게 해주자.
@WebServlet("/BoardUpdateProcCon.do")
public class BoardUpdateProcCon extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
reqPro(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
reqPro(request, response);
}
protected void reqPro(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
int num = Integer.parseInt(request.getParameter("num"));
String password = request.getParameter("password"); //사용자가 입력한 비밀번호
String dbpassword = request.getParameter("dbpassword"); //db에 저장되있던 비밀번호
String subject = request.getParameter("subject");
String content = request.getParameter("content");
if (password.equals(dbpassword)) {
BoardDAO2 bdao = new BoardDAO2();
bdao.UpdateBoard(num, subject, content);
request.setAttribute("msg", "수정이 완료되었습니다.");
RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
dis.forward(request, response);
} else {
request.setAttribute("msg", "비밀번호가 맞지않습니다.");
RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
dis.forward(request, response);
}
}
}'기초단계 > JSP&Servlet' 카테고리의 다른 글
| 2023.04.08 JSP (0) | 2023.04.10 |
|---|---|
| 2023.04.06 JSP (0) | 2023.04.06 |
| 2023.04.03 JSP (0) | 2023.04.03 |
| 2023.04.02 JSP (0) | 2023.04.02 |
| 2023.04.01 JSP (0) | 2023.04.02 |