국비지원 Spring프레임워크/JSP dynamic web project blog
blog 8. 글 상세보기
대엽
2021. 2. 23. 20:35
ㅎㅇ
detail.jsp
${dto} 는 나중에 Controller 에서 setAttribute 해서 주는 key 값입니다.
댓글창은 아직 구현하지 않고 임시로 만들어놓습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="../layout/header.jsp" %>
<div class="container">
<br />
<br />
<h6 class="m-2">
작성자 : <i>${dto.username}</i> 조회수 : <i>${dto.readCount}</i> 글 번호 : <i>${dto.id}</i>
</h6>
<br />
<h3 class="m-2">
<b>${dto.title}</b>
</h3>
<hr />
<div class="form-group">
<div class="m-2">${dto.content}</div>
</div>
<hr />
<!-- 댓글 박스 -->
<div class="row bootstrap snippets">
<div class="col-md-12">
<div class="comment-wrapper">
<div class="panel panel-info">
<div class="panel-heading m-2"><b>Comment</b></div>
<div class="panel-body">
<textarea id="reply__write__form" class="form-control" placeholder="write a comment..." rows="2"></textarea>
<br>
<button onclick="#" class="btn btn-primary pull-right">댓글쓰기</button>
<div class="clearfix"></div>
<hr />
<!-- 댓글 리스트 시작-->
<ul id="reply__list" class="media-list">
<!-- 댓글 아이템 -->
<li id="reply-1" class="media">
<div class="media-body">
<strong class="text-primary">홍길동</strong>
<p>
댓글입니다.
</p>
</div>
<div class="m-2">
<i onclick="#" class="material-icons">delete</i>
</div>
</li>
</ul>
<!-- 댓글 리스트 끝-->
</div>
</div>
</div>
</div>
</div>
<!-- 댓글 박스 끝 -->
</div>
</body>
</html>
header.jsp
? 뭐에 쓰이는지 모르겠네요
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
DetailRespDto.java
글 상세보기 기능의 데이터운반을 도와주는 객체
package com.cos.blog.domain.board.dto;
import lombok.Data;
@Data
public class DetailRespDto {
private int id;
private String title;
private String content;
private int readCount;
private String username;
private int userId;
public String getTitle() {
return title.replaceAll("<", "<").replaceAll(">", ">");
}
}
BoardDao.java
findById(int id)
글 상세보기를 하기 위해서 Board 와 User를 join 한 결과에서 데이터를 가져옵니다.
왜냐하면 글에 대한 정보도 필요하고, 유저(작성자) 에 대한 정보도 필요하기 때문입니다.
updateReadCount(int id)
조회수를 1 증가시켜서 업데이트합니다.
public DetailRespDto findById(int id){
StringBuffer sb = new StringBuffer();
sb.append("select b.id, b.title, b.content, b.readCount, b.userId, u.username ");
sb.append("from board b inner join user u ");
sb.append("on b.userId = u.id ");
sb.append("where b.id = ?");
String sql = sb.toString();
Connection conn = DB.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
// Persistence API
if(rs.next()) { // 커서를 이동하는 함수
DetailRespDto dto = new DetailRespDto();
dto.setId(rs.getInt("b.id"));
dto.setTitle(rs.getString("b.title"));
dto.setContent(rs.getString("b.content"));
dto.setReadCount(rs.getInt("b.readCount"));
dto.setUserId(rs.getInt("b.userId"));
dto.setUsername(rs.getString("u.username"));
return dto;
}
} catch (Exception e) {
e.printStackTrace();
} finally { // 무조건 실행
DB.close(conn, pstmt, rs);
}
return null;
}
public int updateReadCount(int id) { // 회원가입
String sql = "UPDATE board SET readCount = readCount+1 WHERE id = ?";
Connection conn = DB.getConnection();
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
int result = pstmt.executeUpdate();
return result;
} catch (Exception e) {
e.printStackTrace();
} finally { // 무조건 실행
DB.close(conn, pstmt);
}
return -1;
}
BoardService.java
// 하나의 서비스안에 여러가지 DB관련 로직이 섞여 있죠.
public DetailRespDto 글상세보기(int id) {
// 조회수 업데이트치기
int result = boardDao.updateReadCount(id);
if(result == 1) {
return boardDao.findById(id);
}else {
return null;
}
}
BoardController.java
list.jsp에서 상세보기 버튼을 누르게되면 cmd=detail 이 호출됩니다.
//list.jsp
<c:forEach var="board" items="${boards}">
<div class="card col-md-12 m-2">
<div class="card-body">
<h4 class="card-title">${board.title}</h4>
<a href="/blog/board?cmd=detail&id=${board.id}" class="btn btn-primary">상세보기</a>
</div>
<div>글 번호 : ${board.id }</div>
</div>
</c:forEach>
id값을 getParameter로 가져와서 자바코드에서 사용합니다.
글 상세보기(id)로 가져온 DetailRespDto 객체를 setAttribute 하여 dto 키값으로 jsp파일로 넘깁니다.
이 작업을 했기 때문에 detail.jsp 에서 ${dto} 를 사용할 수 있는것입니다.
else if(cmd.equals("detail")) {
int id = Integer.parseInt(request.getParameter("id"));
DetailRespDto dto = boardService.글상세보기(id); // board테이블+user테이블 = 조인된 데이터!!
if(dto == null) {
Script.back(response, "상세보기에 실패하였습니다");
}else {
request.setAttribute("dto", dto);
//System.out.println("DetailRespDto : "+dto);
RequestDispatcher dis = request.getRequestDispatcher("board/detail.jsp");
dis.forward(request, response);
}
}
글 상세보기 결과