JSP - 간단한 게시판 구현하기(5) - 게시물 상세보기 (2022-09-29)

2022. 9. 30. 01:113층 1구역 - 개발의 장/JSP

1. 서론

 

게시판 목록을 이제 확인할 수 있게 되었다.

이제 목록을 볼 수 있으면 다른 사용자들은 얼마나 재밌는 글을 썼는지 상세보기를 할 수 있어야한다.

 

그런 의미에서 이번엔 게시물 상세보기를 만들어보자.!!!!!!!!!!!!!!!!!!

 

DAO, DTO의 코드는 여기!!

2022.09.29 - [3층 - 개발의 장/JSP] - JSP - 간단한 게시판 구현하기(외전2) - BoardDAO,DTO (2022-09-29)

 

JSP - 간단한 게시판 구현하기(외전2) - BoardDAO,DTO (2022-09-29)

1. 서론 게시판 관련해서 DAO와 DTO클래스는 설명할 게 좀 있기에 코드만 올리는게 아니라 부가설명이 들어갈 예정이다. 회원의 정보를 관리하던 DB가 MemberDAO, DTO 클래스를 만들었다면 게시판 관련

sukw9512.tistory.com

 

 

2. 본론

 

content(전체코드)

 

 

<%@page import="session_quiz.BoardDTO"%>
<%@page import="session_quiz.BoardDAO"%>
<%@page import="java.net.URLEncoder"%>
<%@page import="java.io.File"%>
<%@ page language="java"  pageEncoding="utf-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>content</title>
</head>
<body>
	<%@ include file="header.jsp"%>
	<div align="center">
		<h1>글 내용</h1>
		<%
		String n = request.getParameter("num");
		if (n == null || n == "") {
			response.sendRedirect("boardForm.jsp");
			return;
		}

		int num = 0;
		try {
			num = Integer.parseInt(n);
		} catch (Exception e) {
			response.sendRedirect("boardForm.jsp");
			return;
		}

		BoardDAO boardDao = new BoardDAO();
		BoardDTO board = boardDao.selectNum(num);
		int hit = board.getHit();
		hit++;
		boardDao.incrementHit(num, hit);
		boardDao.disconnection();
		%>

		<table border='1'>
			<tr>
				<th width="100">작성자</th>
				<td width="200"><%=board.getId()%></td>
				<th width="100">조회수</th>
				<td width="200"><%=hit%></td>
			</tr>
			<tr>
				<th>작성일</th>
				<td><%=board.getWriteTime() %></td>
				<th>다운로드</th>
				<td>
					<a href="filedown.jsp?fileName=<%=board.getFileName()%>&writeId=<%=board.getId()%>">
						<%=board.getFileName()%>
					</a>
				</td>
			</tr>
			<tr>
				<th>제목</th>
				<td colspan="3"><%=board.getTitle()%></td>
			</tr>
			<tr>
				<th>문서내용</th>
				<td colspan="3"><%=board.getContent()%></td>
			</tr>
			<tr>
				<td colspan="4">
					<button type="button" onclick="location.href='boardForm.jsp'">목록</button>
					<%
					if (board.getId().equals(session.getAttribute("id"))) {
					%>
					<button type="button" onclick="location.href='boardModify.jsp?num=<%=board.getNum()%>'">수정</button>
					<button type="button" onclick="location.href='boardDelete.jsp?num=<%=board.getNum()%>'">삭제</button>
					<%
					 }
					 %>
				</td>
			</tr>
		</table>
	</div>
	<%@ include file="footer.jsp"%>
</body>
</html>

코드 반 들여쓰기 띄어쓰기 반이라서 길어보여도 사실 긴 코드는 아니다.

 

상세설명을 보도록 하자.

 

2-1. 상세설명

 

<%@ include file="header.jsp"%>
	<div align="center">
		<h1>글 내용</h1>
		<%
		
		//문자열 변수 n으러 지정하고 num의 속성값의 파라미터를 가져온다.
		//게시물의 번호
		String n = request.getParameter("num");
		//만약 게시물의 번호가 없거나 공백이면
		if (n == null || n == "") {
			//boardForm.jsp으로 돌아가도록 지정
			response.sendRedirect("boardForm.jsp");
			return;
		}
		//정수형 변수 num을 선언하고 0으로 지정.
		int num = 0;
		try {
			//try-catch문으로 정수형 변수 num에 문자열 변수 n을 정수형으로 변환하여
			num = Integer.parseInt(n);
		} catch (Exception e) {
			//만약 주소창에 정수가 아닌 다른 문자열이 들어갔을 경우
			//예를 들어 게시물 번호가 18번인데 주소창에 18a를 쳤다면
			//예외처리 되어 다시 boardForm.jsp으로 돌아간다.
			response.sendRedirect("boardForm.jsp");
			return;
		}
		//DAO, DTD 연동
		BoardDAO boardDao = new BoardDAO();
		//DTO를 board변수로 선언하고 거기에 DAO의 SelectNum의 메서드를 호출하는데
		//기준은 게시물의 번호인 num 즉, 그 고유번호의 관련된 게시물을 클릭했을 때
		BoardDTO board = boardDao.selectNum(num);
		//정수형 hit변수를 선언하여 거기에 board.getHit()를 대입
		int hit = board.getHit();
		//게시물을 클릭하면 조회수가 1씩 증가하게 되며
		hit++;
		//증가한 값은 DAO클래스의 incrementHit메서드에 반영된다.
		boardDao.incrementHit(num, hit);
		boardDao.disconnection();
		%>

 

 

 

//문자열 변수 n으러 지정하고 num의 속성값의 파라미터를 가져온다.
		//게시물의 번호
		String n = request.getParameter("num");
		//만약 게시물의 번호가 없거나 공백이면
		if (n == null || n == "") {
			//boardForm.jsp으로 돌아가도록 지정
			response.sendRedirect("boardForm.jsp");
			return;
		}
		//정수형 변수 num을 선언하고 0으로 지정.
		int num = 0;
		try {
			//try-catch문으로 정수형 변수 num에 문자열 변수 n을 정수형으로 변환하여
			num = Integer.parseInt(n);
		} catch (Exception e) {
			//만약 주소창에 정수가 아닌 다른 문자열이 들어갔을 경우
			//예를 들어 게시물 번호가 18번인데 주소창에 18a를 쳤다면
			//예외처리 되어 다시 boardForm.jsp으로 돌아간다.
			response.sendRedirect("boardForm.jsp");
			return;
		}

위 코드는 게시물의 목록을 확인할 때 쓰여던 예외처리와 비슷한 맥락이다.

 

DAO에서 두가지 메서드가 호출되었는데

selectNum과 incrementHit 둘은 꽤 천생연분 같은 사이이다.

 

DB문을 복사해 갔으면 비교하면서 볼 수 있겠지만 난 착하니까....

 

selectNum

 

//검색 및 페이징 처리
	public BoardDTO selectNum(int num) {
		String sql = "SELECT * FROM session_quiz_board WHERE num = ?";
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = con.prepareStatement(sql);
			ps.setInt(1, num);
			rs = ps.executeQuery();
			if(rs.next()) {
				BoardDTO board = new BoardDTO();
				board.setNum(rs.getInt("num"));
				board.setId(rs.getString("id"));
				board.setTitle(rs.getString("title"));
				board.setContent(rs.getString("content"));
				board.setWriteTime(rs.getString("writetime"));
				board.setFileName(rs.getString("filename"));
				board.setHit(rs.getInt("hit"));
				return board;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;

 

incrementHit

 

//조회수 증가
	public void incrementHit(int num, int hit) {
		String sql = "UPDATE session_quiz_board SET hit = ? WHERE num=?";
		PreparedStatement ps = null;
		try {
			ps = con.prepareStatement(sql);
			ps.setInt(1, hit);
			ps.setInt(2, num);
			ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

둘의 sql문을 비교했을 때 주시하고 있는 곳은 'num' 이다.

 

즉, 게시물 번호와 관련된 모든 정보를 테이블에서 불러(SELECT * FROM)옴으로서

incrementHit는 게시물 번호가 선택 되었기 때문에 

content의 아래 코드에 의해서


		BoardDAO boardDao = new BoardDAO();
		BoardDTO board = boardDao.selectNum(num);
		int hit = board.getHit();
		hit++;
		boardDao.incrementHit(num, hit);
		boardDao.disconnection();

조회수가 1씩 증가하여 DB에 UPDATE 되는 것이다.

 

그래서 결과를 보면...

일단 필자가 DB에 직접 입력한 데이터를 보자.

모니터가 너무 방대해서 시력검사 하는 거 같을테니 확대해서 보도록 하자.(모니터 큰거 자랑하는 거 맞음.)

 

어쨋든 6번의

작성자는 admin

게시물의 제목은 게시글6

내용은 게시글6 내용

게시글 작성날짜는 2022-09-28

첨부파일은 test.txt이다.

조회수는 일단 0이다.

 

웹에 출력되어 있는 게시글을 클릭했다.

그러면 작성 날짜 이외에 모두 동일한 값을 갖고 있는 것을 알 수 있다.

 

다시 게시글 목록으로 나가서 작성일도 동일하고 조회수도 1이 올랐다.

 

다시 DB에 있는 6번 게시글을 보도록 하자.

6번 게시글의 조회수가 오른것을 확인 할 수 있다.

사실 필자가 실수로 한번 더 눌러서 조회수가 2가 되었다.

 

3. 결론

 

흐름 잘 파악하고 있나 모르겠다.

DB파트는 어떻게 설명해야할지 몰라 일단 아는 말들 있는 거 없는 거 다 꺼내 써봤는데

 

DB파트를 좀 더 이쁘게 설명가능하다면 피드백 적극 부탁드립다