JSP_basic. 게시판 글 보기를 구현해보자.
게시판 글 보기를 구현해보기 위해 먼저 생각해보아야할 것
구현하고자하는 기능이 무엇인지부터 거꾸로 집고 넘어갑시다.
게시판 목록의 제목을 누르면 게시글 페이지로 이동하고
글 내용을 확인할 수 있게 해야합니다.
첫 번째로 게시글을 읽을 수 있는 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/[email protected]/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을 통해 스크립트릿 없이 페이지를 구성했습니다.
이제 제목을 누르면 게시글을 읽을 수 있게 되었습니다.
쉽지 않네요. 더 잘해보려면 많이 노력해야겠습니다.
일단은 여기까지 입니다.
Author And Source
이 문제에 관하여(JSP_basic. 게시판 글 보기를 구현해보자.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@nugoory20/JSPbasic.-게시판-글-보기를-구현해보자저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)