지금까지 게시글리스트와 그 게시글리스트에서 글작성버튼을 눌렀을 시 글작성페이지로 이동하는 것, 그리고 글작성페이지에서 입력한 폼의 값들을 서버로 전송하여 데이터베이스에 저장하는것까지 하였다. 이번에는 게시글 상세보기 기능을 만들려고 한다. 게시글리스트에서 글제목을 눌렀을 시 상세보기!
상세보기 페이지는 다음과 같은 형태로 만들려고 한다.
<td>${posting.title }</td>
기존에 작성했던 boardList.jsp를 보면 게시글 제목부분이 위와 같이 되어있다.
이것을 아래와 같이 수정해준다.
<td><a href="BoardServlet?command=board_view&num=${posting.num }">${posting.title }</a></td>
board_view라는 커맨드와 해당 게시글의 글번호를 파라미터로 가지고 BoardServlet으로 요청이 전달될 것이다.
전달받은 파라미터 num을 사용하여 num과 일치하는 데이터를 가져오는 메서드.
//select by num
public BoardVO selectBoardByNum(String num) {
String sql = "select * from board where num = ?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
BoardVO bVo = null;
try {
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, Integer.parseInt(num));
rs = pstmt.executeQuery();
if(rs.next()) {
bVo = new BoardVO();
bVo.setNum(rs.getInt("num"));
bVo.setName(rs.getString("name"));
bVo.setPass(rs.getString("pass"));
bVo.setTitle(rs.getString("title"));
bVo.setEmail(rs.getString("email"));
bVo.setContent(rs.getString("content"));
bVo.setReadCount(rs.getInt("readcount"));
bVo.setWriteDate(rs.getTimestamp("writedate"));
}
} catch(Exception e) {
e.printStackTrace();
} finally {
DBManager.close(conn, pstmt, rs);
}
return bVo;
}
글번호를 파라미터로 전달받아 request내장객체의 getParameter()메서드를 사용했을때 반환되는 값의 타입은 String이므로 이를 정수타입으로 변환을 꼭 해줘야한다.
DAO클래스에 이어서 다음과 같은 메서드를 작성한다.
//조회수 up!
public void readCountPlus(String num) {
String sql = "update board set readcount = readcount+1 where num = ?";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, Integer.parseInt(num));
pstmt.executeUpdate();
} catch(Exception e) {
e.printStackTrace();
} finally {
DBManager.close(conn, pstmt);
}
}
package com.msriver.action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.msriver.dao.BoardDAO;
import com.msriver.dto.BoardVO;
public class BoardViewAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String num = request.getParameter("num");
String url = "board/boardView.jsp";
BoardDAO bDao = BoardDAO.getInstance();
bDao.readCountPlus(num);
BoardVO bVo = bDao.selectBoardByNum(num);
bVo.setReadCount(bVo.getReadCount()+1);
request.setAttribute("boardone", bVo);
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
}
}
bDao객체를 얻어와서 selectBoardByNum()메서드를 실행하기 전에 먼저 조회수를 데이터베이스에 update하는 readCountPlus()메서드를 실행한다.
ActionFactory에 등록!
if(command.equals("board_list")) {
action = new BoardListAction();
} else if(command.equals("board_write")) {
action = new BoardWriteAction();
} else if(command.equals("board_write_form")) {
action = new BoardWriteFormAction();
} else if(command.equals("board_view")) {
action = new BoardViewAction();
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="css/board.css">
<style>
td {
text-align: left !important;
}
</style>
</head>
<body>
<div id="wrap">
<h2>게시글 상세보기</h2>
<table>
<tr>
<th>제목</th>
<td>${boardone.title }</td>
</tr>
<tr>
<th>작성자</th>
<td>${boardone.name }</td>
</tr>
<tr>
<th>작성시간</th>
<td>${boardone.writeDate }</td>
</tr>
<tr>
<th>조회수</th>
<td>${boardone.readCount }</td>
</tr>
<tr>
<th>내용</th>
<td><pre>${boardone.content }</pre></td>
</tr>
</table>
<input class="btn" type="submit" value="새글 작성" onclick="location.href='BoardServlet?command=board_write_form'">
<input class="btn" type="reset" value="글 수정">
<input class="btn" type="button" value="글 삭제">
<input class="btn" type="button" value="목록으로" onclick="location.href='BoardServlet?command=board_list'">
</div>
</body>
</html>