2022. 9. 30. 01:11ㆍ3층 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파트를 좀 더 이쁘게 설명가능하다면 피드백 적극 부탁드립다
'3층 1구역 - 개발의 장 > JSP' 카테고리의 다른 글
JSP - 간단한 게시판 구현하기(7) - 게시물 수정 (2022-09-29) (0) | 2022.09.30 |
---|---|
JSP - 간단한 게시판 구현하기(6) - 게시물 작성하기 및 첨부파일 (2022-09-29) (1) | 2022.09.30 |
JSP - 간단한 게시판 구현하기(4) - 게시판 목록 (2022-09-29) (0) | 2022.09.30 |
JSP - 간단한 게시판 구현하기(외전2) - BoardDAO,DTO (2022-09-29) (0) | 2022.09.29 |
JSP - 간단한 게시판 구현하기(3) - 회원정보 열람 및 수정,삭제 (2022-09-29) (1) | 2022.09.29 |