BoardResponseDto
DetailResponseDto를 Board로 바꾼다.( 재사용하기위해서 )
BoardRepository
더보기
public BoardResponseDto findById(int id) { // object 받기(안에 내용 다 받아야 하니까)
StringBuilder sb = new StringBuilder();
sb.append("SELECT b.id, b.userid, b.title, b.content, b.readcount, b.createdate, u.username ");
sb.append("FROM board b INNER JOIN users u ");
sb.append("ON b.userId = u.id ");
sb.append("AND b.id = ?");
final String SQL = sb.toString();
BoardResponseDto boardDto = null;
try {
conn = DBConn.getConnection(); // DB에 연결
pstmt = conn.prepareStatement(SQL);
// 물음표 완성하기
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
// if 돌려서 rs -> java오브젝트에 집어넣기
if(rs.next()) {
boardDto = new BoardResponseDto();
Board board = Board.builder()
.id(rs.getInt(1))
.userId(rs.getInt(2))
.title(rs.getString(3))
.content(rs.getString(4))
.readCount(rs.getInt(5))
.createDate(rs.getTimestamp(6))
.build();
boardDto.setBoard(board);
boardDto.setUsername(rs.getString(7));
}
return boardDto;
} catch (SQLException e) {
e.printStackTrace();
System.out.println(TAG + "findById : " + e.getMessage());
} finally {
DBConn.close(conn, pstmt, rs);
}
return null; // 실패시
}
BoardResponseDto로 바꾸었기 때문에 리포지토리의 리턴값도 바꾸어야한다.
ReplyResponseDto
댓글DTO생성
DetailResponseDto
board와 reply를 합쳐서 detail
데이터베이스
데이터베이스에서 쿼리문을 테스트해본다.
ReplyRepository
더보기
public List<ReplyResponseDto> findAll(int boardId) {
StringBuffer sb = new StringBuffer();
sb.append("SELECT r.id, r.userid, r.boardId, r.content, r.createDate, u.username, u.userProfile ");
sb.append("FROM reply r INNER JOIN users u ");
sb.append("ON r.userid = u.id ");
sb.append("WHERE boardId = ? ");
sb.append("ORDER BY r.id DESC ");
final String SQL = sb.toString();
List<ReplyResponseDto> replyDtos = new ArrayList<>();
try {
conn = DBConn.getConnection();
pstmt = conn.prepareStatement(SQL);
pstmt.setInt(1, boardId);
rs = pstmt.executeQuery();
while (rs.next()) {
Reply reply = Reply.builder()
.id(rs.getInt(1))
.userId(rs.getInt(2))
.boardId(rs.getInt(3))
.content(rs.getString(4))
.createDate(rs.getTimestamp(5))
.build();
ReplyResponseDto replyDto = ReplyResponseDto.builder().reply(reply).username(rs.getString(6))
.userProfile(rs.getString(7)).build();
replyDtos.add(replyDto);
}
return replyDtos;
} catch (SQLException e) {
e.printStackTrace();
System.out.println(TAG + "findAll(boardId) : " + e.getMessage());
} finally {
DBConn.close(conn, pstmt, rs);
}
return null; // 실패시
}
findAll을 오버로딩하고, 스트링버퍼
BoardDetailAction
더보기
package com.cos.blog.action.board;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Vector;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import com.cos.blog.action.Action;
import com.cos.blog.dto.BoardResponseDto;
import com.cos.blog.dto.DetailResponseDto;
import com.cos.blog.dto.ReplyResponseDto;
import com.cos.blog.model.Board;
import com.cos.blog.repository.BoardRepository;
import com.cos.blog.repository.ReplyRepository;
import com.cos.blog.util.HtmlParser;
import com.cos.blog.util.Script;
public class BoardDetailAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (request.getParameter("id") == null || request.getParameter("id").equals("")) {
Script.back("잘못된 접근입니다.", response);
return;
}
int boardId = Integer.parseInt(request.getParameter("id"));
BoardRepository boardRepository = BoardRepository.getInstance();
ReplyRepository replyRepository = ReplyRepository.getInstance();
int result = 0;
Cookie[] cookies = request.getCookies();
int visitor = 0;
for (Cookie cookie : cookies) {
System.out.println(cookie.getName());
if(cookie.getName().equals("visit")) {
visitor = 1;
if(cookie.getValue().contains(request.getParameter("id"))) {
result = 1;
} else {
cookie.setValue(cookie.getValue()+ "_" + request.getParameter("id"));
response.addCookie(cookie);
result = boardRepository.readCountUp(boardId);
}
}
}
if(visitor == 0) {
Cookie cookie1 = new Cookie("visit", request.getParameter("id"));
response.addCookie(cookie1);
result = boardRepository.readCountUp(boardId);
}
// if(result != 1) {
// Script.back("서버오류", response);
// return;
// }
// Cookie cookie =
// HttpSession session = request.getSession();
// if(session.getAttribute("sameUser") == null || !session.getAttribute("sameUser").equals(request.getParameter("id"))) {
// result = boardRepository.readCountUp(id);
// session.setAttribute("sameUser", request.getParameter("id"));
// }
if(result == 1) {
System.out.println("리절트1 ");
BoardResponseDto boardDto = boardRepository.findById(boardId);
List<ReplyResponseDto> replyDtos = replyRepository.findAll(boardId);
DetailResponseDto detailDto = DetailResponseDto.builder()
.boardDto(boardDto)
.replyDtos(replyDtos)
.build();
if (detailDto != null) {
String content = detailDto.getBoardDto().getBoard().getContent(); // DTO에서 컨텐츠 가져오기
String doc = HtmlParser.youtubeParser(content); // 유튜브 링크가 있다면 아래에 영상 프레임 넣기
detailDto.getBoardDto().getBoard().setContent(doc); // 바뀐 내용을 콘텐츠에 바꿔넣기
request.setAttribute("detailDto", detailDto);
RequestDispatcher dis = request.getRequestDispatcher("board/detail.jsp");
dis.forward(request, response);
} else {
Script.back("잘못된 접근입니다.", response);
}
} else {
Script.back("상세보기를 할 수 없습니다.", response);
}
}
}
리포지토리를 소환
데이터를 가져와서 객체에 저장
detailDto에 두 객체를 저장
기존의 dto를 detailDto로 모두 바꿔준다
detail.jsp
기존의 dto를 detailDto로 모두 바꿔준다
데이터베이스에 댓글을 임의로 넣고 테스트
결과
-
'Web > Jsp' 카테고리의 다른 글
get / post 방식 (0) | 2020.06.12 |
---|---|
블로그 댓글쓰기 (0) | 2020.06.12 |
사진 업로드 (0) | 2020.06.11 |
자바스크립트 on 이벤트 (0) | 2020.06.11 |
multipart/form-data // HTML 파일업로드 MIME타입 (0) | 2020.06.11 |