JSP_basic. 게시판 글 보기를 구현해보자.

dwanGim·2022년 4월 19일
0

JSP_basic

목록 보기
13/15

게시판 글 보기를 구현해보기 위해 먼저 생각해보아야할 것

구현하고자하는 기능이 무엇인지부터 거꾸로 집고 넘어갑시다.

게시판 목록의 제목을 누르면 게시글 페이지로 이동하고

글 내용을 확인할 수 있게 해야합니다.

첫 번째로 게시글을 읽을 수 있는 jsp form 파일이 필요합니다.

그리고 그 jsp로 DB 데이터를 보내는 servlet이 필요합니다.

servlet이 필요로 하는 건 DB 데이터를 SQL에서 가져오는 DAO입니다.

DB 데이터 검색은 SQL 테블릿 내의 primary key인 board_num으로 검색을 하게 될 것 입니다. 이를 수행할 getBoardDetail메서드를 작성해야합니다.

그래야 중복 게시글 검색이나 없는 데이터를 찾는 일을 막을 수 있기 때문입니다.

그럼

이 form과 servlet, DAO를 만들기로 마음을 먹었으니

DAO부터 시작해보겠습니다.

DAO 작성하기

package kr.co.ict.domain;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BoardDAO {

	private DataSource ds;
	
	public static BoardDAO dao = new BoardDAO();
	
	private BoardDAO() {
		try {
			Context ct = new InitialContext();
			ds = (DataSource)ct.lookup("java:comp/env/jdbc/mysql");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static BoardDAO getInstance() {
		if(dao == null) {
			dao = new BoardDAO();
		}
		return dao;
	}

먼저 커넥션 풀을 싱글톤 방식으로 작성했습니다.

저희에게 정말 필요한 건 getBoardDetail메서드입니다.

board_num을 이용해 row를 찾고 그 row의 자료를 가져오는 메서드가 필요합니다.

board_num을 요구하는 getBoardDetail()을 아래에 더 작성해보겠습니다.

	
	// boardTbl에서 row를 1개 가져오기(글 번호 존재 시), 안 가져옴(없는 글 번호 입력 시)
	public BoardVO getBoardDetail(int boardNum) {

		Connection con = null;
		ResultSet rs = null;
		PreparedStatement pstmt = null;
		
		BoardVO board = new BoardVO();
		
		try {
			con = ds.getConnection();
			String sql = "SELECT * FROM boardTbl WHERE board_num = ?";
			pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, boardNum);
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
				board.setBoardNum(rs.getInt(1));
				board.setTitle(rs.getString(2));
				board.setContent(rs.getString(3));
				board.setWriter(rs.getString(4));
				board.setbDate(rs.getDate(5));
				board.setmDate(rs.getDate(6));
				board.setHit(rs.getInt(7));
				System.out.println("데이터 확인용 : " + board);
			} else {
				System.out.println("해당 계정이 없습니다.");
			}
			
			
			} catch(Exception e){
				e.printStackTrace();
			} finally {
				try {
					con.close();
					rs.close();
					pstmt.close();
				} catch(Exception e) {
					e.printStackTrace();
				}
			}
			return board;
	} // getBoardDetail END.

int boardNum을 요구하는 getBoardDetail이 완성되었습니다.

SELECT*FROM boardTbl WHERE board_num =?이라는 쿼리문을

SQL DB에 날리고

if문과 ResultSet, set자료명을 통해 BoardVO board에 그 결과값들을 적재했습니다.

그리고 마지막으로 board를 return하는 메서드입니다.

이렇게 DAO가 완성되었습니다.

이제 board를 가지고 실행할 servlet을 작성하겠습니다.

@WebServlet("/boardDetail")

/boardDetail를 주소로 하는 서블릿을 만들겠습니다.

board_num은 get방식으로 받겠습니다.

package kr.co.ict;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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 kr.co.ict.domain.BoardDAO;
import kr.co.ict.domain.BoardVO;

/**
 * Servlet implementation class getBoardDetail
 */
@WebServlet("/boardDetail")
public class getBoardDetail extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public getBoardDetail() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String boardNum = request.getParameter("board_num");
		
		BoardDAO dao = BoardDAO.getInstance();
	
		BoardVO board = dao.getBoardDetail(Integer.parseInt(boardNum));
		
		request.setAttribute("board", board);
		
		RequestDispatcher dp = request.getRequestDispatcher("/board/boardDetail.jsp");
		
		dp.forward(request, response);
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	}

}

서블릿 안에 protected void doGet()을 작성했습니다.

getParameter가 String 자료형을 요구하기 때문에

board_num을 String boardNum으로 받고

BoardDAO dao = BoardDAO.getInstance()로 DAO 생성

BoardVO board = dao.getBoardDetail(Integer.parseInt(boardNum))으로

정수 자료형으로 변환된 boardNum을 가져간 dao.getBoardDetail이

BoardVO board에 대입되도록 했습니다.

이후에 바인딩과 포워딩 절차를 통해

결과 페이지인 /board/boardDetail.jsp로

완성된 board를 보내도록 했습니다.

결과 페이지 /board/boardDetail.jsp 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
	<div class="col-sm-12">
		<table class = "table table-primary table-striped">
			<thead>
				<tr>
					<th>글번호</th>
					<th>제목</th>
					<th>글쓴이</th>
					<th>작성시간</th>
					<th>수정시간</th>
					<th>조회수</th>
				</tr>
			</thead>
			<tbody>
				<tr>
					<td>${board.boardNum}</td>
					<td>${board.title}</td>
					<td>${board.writer}</td>
					<td>${board.bDate}</td>
					<td>${board.mDate}</td>
					<td>${board.hit}</td>
				</tr>
			</tbody>
		</table>
	</div>
	<br/>
	<div class="mb-12">
		<label for="textarea1" class="form-label"> 본 문 </label>
		<textarea class="form-control" name="content" id="textarea1" cols="40" rows="20" disabled readonly>${board.content}</textarea>
		<br/>
	</div>
		<br/>
		<a href="http://localhost:8181/MyFirstWeb/boardList"  class="btn btn-success btn-mb-3">목록으로</a>
		<a href="#"  class="btn btn-danger btn-mb-3">뒤로가기</a>
</div><!-- container end -->
</body>
</html>

<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix="c" %>
주소로 EL을 가져와서

EL을 통해 스크립트릿 없이 페이지를 구성했습니다.

이제 제목을 누르면 게시글을 읽을 수 있게 되었습니다.

쉽지 않네요. 더 잘해보려면 많이 노력해야겠습니다.

일단은 여기까지 입니다.

profile
배울 게 참 많네요.

0개의 댓글