09009

[Spring] 예제1 - 게시글 상세보기 본문

Back-End/Spring
[Spring] 예제1 - 게시글 상세보기
09009

게시글 리스트에서 게시글 제목을 클릭하면 상세보기 기능을 이용할 수 있도록 수정

 views/board/mainPage.jsp

(중복 코드 생략)

<table border="1">
	<tr>
		<td>글번호</td>
		<td>제목</td>
		<td>조회수</td>
		<td>작성자</td>
		<td>작성일</td>
	</tr>
	
	<c:forEach items="${list}" var="map"> 
		<tr>
			<td>${map.boardDto.id}</td>
			<td><a href="./readContentPage?id=${map.boardDto.id}">${map.boardDto.title}</a></td>
			<td>${map.boardDto.read_count}</td>
			<td>${map.memberDto.nickname}</td>
			<td>${map.boardDto.reg_date}</td>
		</tr>
	
	 </c:forEach>
	
</table>

 

게시글 상세보기 시 각 페이지의 모양은 모두 똑같지만 데이터는 달라야 한다.

예를 들어 4번 게시글의 제목을 클릭하면 4번 게시글의 데이터가 화면에 출력되어야 한다.

4번 게시글 제목을 클릭할 시 화면

 

게시글 상세보기 구현

BoardController.java

	@RequestMapping("readContentPage")
	public String readContentPage(int id) {
		//  사실 int는 null 값이 선언되지 못하므로 null이면 터진다.
		
		return "board/readContentPage";
	}

BoardSqlMapper.java

게시글 번호를 가져오는 메서드 (selectById) 추가

package com.ja.finalproject.board.mapper;

import java.util.List;

import com.ja.finalproject.dto.BoardDto;

public interface BoardSqlMapper {
	
	public BoardDto selectById(int id);
	
	public void insert(BoardDto boardDto);
	public List<BoardDto> selectAll();
	
}

BoardSqlMapper.xml

	<select id="selectById" resultType="com.ja.finalproject.dto.BoardDto">
		SELECT *
		FROM fp_board
		WHERE id = #{id}
	</select>

 BoardServiceImpl.java

여러 개가 아닌 하나의 게시글을 조회하는 작업이 필요하므로 리턴타입은 list가 아닌 map으로 선언한다.

		// List일 필요없고 조회할 개시글은 한 개이므로 hashmap
		public Map<String, Object> getBoard(int id) {
			
			Map<String, Object>  map = new HashMap<>();
			
			BoardDto boardDto = boardSqlMapper.selectById(id);
			MemberDto memberDto =  memberSqlMapper.selectById(boardDto.getMember_id());
			
			map.put("boardDto", boardDto);
			map.put("memberDto", memberDto);
			
			return map;
		}

model: 출력해야할 데이터를 담는 공간이라고 생각하면 된다.

redirect하는 경우에는 model을 사용할 이유가 없다. forwarding이 아니기 때문에

 

BoardController.java

메서드 수정

	@RequestMapping("readContentPage")
	public String readContentPage(Model model, int id) {
		//  사실 int는 null 값이 선언되지 못하므로 null이면 터진다.
		
		Map<String, Object> map = boardService.getBoard(id);
	
		model.addAttribute("data", map);
		
		return "board/readContentPage";
	}

 

 

게시글 상세보기 페이지 만들기

views/board/readContentPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>게시글 상세 보기</h1>

제목 : ${data.boardDto.title} <br>
작성자 : ${data.memberDto.nickname} <br>
작성일 : ${data.boardDto.reg_date} <br>
조회수 : ${data.boardDto.read_count} <br>
내용 : <br>
${data.boardDto.content} 

<br><br>
<a href="./mainPage">목록으로</a>

</body>
</html>

 

게시글 수정 및 삭제 버튼 생성

 views/board/readContentPage.jsp

로그인에 성공하고 본인이 이 게시글의 작성자일 경우 게시글 상세보기 시 수정, 삭제 버튼이 있어야 한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>
<h1>게시글 상세 보기</h1>

제목 : ${data.boardDto.title} <br>
작성자 : ${data.memberDto.nickname} <br>
작성일 : ${data.boardDto.reg_date} <br>
조회수 : ${data.boardDto.read_count} <br>
내용 : <br>
${data.boardDto.content} 

<br><br>
<a href="./mainPage">목록으로</a>

<c:if test="${!empty sessionUser && sessionUser.id == data.memberDto.id}">
	<a href="./updatePage?id=${data.boardDto.id}">수정</a>
	<a href="./deleteProcess?id=${data.boardDto.id}">삭제</a>
</c:if>

</body>
</html>

 

게시글 상세보기 페이지 다른 방식

 BoardController.java

	@RequestMapping("{id}")
	public String readContentPageForPathVariable(Model model, @PathVariable("id") int id) {
		//  사실 int는 null 값이 선언되지 못하므로 null이면 터진다.
		
		Map<String, Object> map = boardService.getBoard(id);
	
		model.addAttribute("data", map);
		
		return "board/readContentPage";
	}