자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 25. 모델1 방식의 회원제 게시판 만들기 - 게시글 상세 보기

개발학생 2024. 1. 1. 11:19
반응형

* ‘게시글 상세 보기’란?

  • 사용자가 선택한 게시물 하나를 조회하여 보여주는 기능(다음 이미지와 같음)

 

  • 게시글의 내용을 보기 위해 목록에서 원하는 게시물의 제목을 클릭하면 됨
    → 게시글의 일련번호(num 컬럼)를 매개변수로 전달하고, 이를 이용해 데이터베이스에서 게시글 내용을 가져옴
    • 게시글의 일련번호(목록 보기 페이지인 List.jsp에 구현해 둠) - 가장 최근에 올린 7번째 게시글 클릭 시 “num=7”부분 확인 가능

  • 게시글 조회 시, 조회수(visitcount 컬럼)를 증가시켜야 함
  • 게시글 상세 보기 처리 프로세스와 담당 모듈(파일)

 

1. DAO 준비

1) 게시물을 조회하기 위한 메소드

  • 앞서 만들었던 BoardDAO.java에 코드 추가
// Java Resources/src/model1/board/BoardDAO.java

...생략...

public class BoardDAO extends JDBConnect {
		...생략...
		
		//지정한 게시물을 찾아 내용 반환
		public BoardDTO selectView(String num) {    //1.
				BoardDTO dto = new BoardDTO();

				//2.쿼리문 준비
				String query = "select B.*, M.name "    //3.
											+ " from member M inner join board B "    //4.
											+ " on M.id=B.id "
											+ " where num=?";
		
				try {
						psmt = con.prepareStatement(query);
						psmt.setString(1,num);    //5.인파라미터를 일련번호로 설정
						rs = psmt.executeQuery();    //6.쿼리 실행

						//결과 처리
						if (rs.next()) {    //7.
								//8.(아래 'dto.'코드 전부)
								dto.setNum(rs.getString(1));
								dto.setTitle(rs.getString(2));
								dto.setContent(rs.getString("content"));
								dto.setPostdate(rs.getDate("postdate"));
								dto.setId(rs.getString("id"));
								dto.setVisitcount(rs.getString(6));
								dto.setName(rs.getString("name"));
						}
				}
				catch (Exception e) {
						System.out.println("게시물 상세보기 중 예외 발생");
						e.printStackTrace();
				}

				return dto;    //9.
		}
}
  1. JSP에서 매개변수로 전달한 일련번호를 받음
  2. 게시물을 가져오기 위한 select 쿼리문 작성
  3. board 테이블의 모든 컬럼과 member 테이블의 name 컬럼을 가져옴(=선택함)
  4. member 테이블과 inner join을 걸어 줌
    → board 테이블에는 작성자의 아이디만 저장되므로, 이름을 출력하기 위해서는 member 테이블과의 조인이 필요
  5. 인파라미터를 일련번호로 설정
  6. 쿼리문 실행
  7. ResultSet 객체로 반환된 행을 next( ) 메소드로 확인
  8. ResultSet 객체로 반환된 행을 DTO 객체에 저장함
  9. 완성한 DTO를 반환함

 

2) 게시물 조회수를 1 증가시키는 메소드

  • 1)과 마찬가지로, BoardDAO.java에 코드 추가
// Java Resources/src/model1/board/BoardDAO.java

... 생략 ...

//지정한 게시물의 조회수 1 증가
public class BoardDAO extends JDBConnect {
		... 생략 ...

		public void update VisitCount(String num) {   //1.조회수를 증가시킬 게시물의 일련번호를 매개변수로 받음 
				//2.update 쿼리문 작성
				String query = "update board set "
										 + " visitcount=visitcount+1 "
										 + " where num=?";

				try {
						psmt = con.prepareStatement(query);
						psmt.setString(1,num);    //3.인파라미터를 일련번호로 설정
						psmt.executeQuery();    //4.쿼리 실행
				}
				catch (Exception e) {
						System.out.println("게시물 조회수 증가 중 예외 발생");
						e.printStackTrace();
				}
		}
}

2. 게시글 상세 보기 페이지

  • 프로젝트에서 WebContent → Board에서 View.jsp 파일 생성
// WebContent/Board/View.jsp

<%@ page import="model1.board.BoardDAO"%>
<%@ page import="model1.board.BoardDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
		pageEncoding="UTF-8"%>

<%
String num = request.getParameter("num");    //1.일련번호 받기

BoardDAO dao = new BoardDAO(application);    //2.DAO 생성
dao.updateVisitCount(num);                //3.조회수 증가
BoardDTO dto = dao.selectView(num);    //4.게시물 가져오기
dao.close();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원제 게시판</title>
<script>
function deletePost() {

}
</script>
</head>
<body>
<jsp:include page="../Common/Link.jsp" />    <!-- 공통 링크 -->
<h2>회원제 게시판 - 상세 보기(View)</h2>
<form name="writeFrm">
		<input type="hidden" name="num" value="<%= num %>" />
		<table border="1" width="90%"
				<!-- 5.(하나의 tr태그로 감싸진 코드까지) -->
				<tr>
						<td>번호</td>
						<td><%= dto.getNum() %></td>
						<td>작성자</td>
						<td><%= dto.getName() %></td>
				</tr>
				<tr>
						<td>작성일</td>
						<td><%= dto.getPostdate() %></td>
						<td>조회수</td>
						<td><%= dto.getVisitcount() %></td>
				</tr>
				<tr>
						<td>제목</td>
						<td colspan="3"><%= dto.gettitle() %></td>
				</tr>
				<tr>
						<td>내용</td>
						<td colspan="3" height="100")>
								<%= dto.getContent().replace("\\r\\n", "<br/>") %></td>    <!-- 6. -->
				</tr>
				<tr>
						<td colspan="4" align="center">
								<!-- 7.(if문 코드 끝까지) -->
								<%
								if (session.getAttribute("UserId") != null
										&& session.getAttribute("UserId").toString().equals(dto.getId())) {
								%>
								<button type="button"
										onclick="location.href='Edit.jsp?num=<%= dto.getNum() %>';"> 수정하기</button>
								<button type="button" onclick="deletePost();">삭제하기</button>
								<%
								}
								%>
								
								<button="button" onclick="location.href='List.jsp';">
										목록 보기
								</button>
						</td>
				</tr>
		</table>
</form>
</body>
</html>
  1. 일련번호 매개변수를 받음
  2. DAO 객체를 생성한 후, 앞 절에서 작성한 두 메소드 호출
  3. 조회수를 1 증가시킴
  4. 게시물 가져오기를 실행
  5. 번호, 작성자, 제목 등 DTO 객체에 저장된 내용 출력
  6. replace( ) 메소드로 엔터키를 <br/> 태그로 변경 → 웹 브라우저상에서 줄바꿈 적용
  7. 수정, 삭제를 위한 버튼 출력 → 작성자 본인에게만 노출하기 위해 다음 두 조건을 만족할 때만 버튼이 보이도록 함
    1) session 영역에 속성값이 있는가(=로그인한 상태인가)
    2) 로그인(세션) 아이디와 DTO 객체에 저장된 아이디가 일치하는가(=작성자 본인인가)

 

List.jsp 파일 실행

(1) 1번 게시물을 3번, 6번 게시물을 2번 들어갔을 때, 조회수 정상적으로 찍힘

 

(2) 2번 게시물에 들어가봐도 상세 보기 페이지가 정상적으로 출력된다

 

 

반응형