코딩항해기
[과제/JSP] 선택한 글의 댓글 출력, 없는 페이지 오류 페이지로 바꾸기 본문
jsp / apache tomcat 10.1
1. 선택한 글의 댓글 출력
순서 (로직) 설계하기
- Model에서 댓글을 불러오는 쿼리 작성하기
- 불러온 데이터를 C에게 넘겨주기
- Controller는 받은 데이터를 요청에 담아 V에게 전달하기
- V는 받은 데이터를 화면에 보여주기
(이미 게시물 내용을 상세보기로 보여주며, 보드 게시물의 PK값을 넘겨주고 있기 때문에 쿼리에 필요한 정보를 요청하는 과정이 생략됐다.)
쿼리문 작성하기
SELECT R.RID,R.BID,B.TITLE,R.CONTENT,M.NAME FROM REPLY R JOIN BOARD B ON R.BID=B.BID JOIN MEMBER M ON R.WRITER=M.MID WHERE B.BID = 101
조회하는 게시물의 댓글리스트를 조회하는 것이므로 WHERE절을 통해 BID값을 임의로 정해 쿼리가 잘 돌아가는지 확인했다. BID는 게시물에 따라 변화되어야하는 값이므로 플레이스홀더(물음표 : ?)로 치환한다.
SELECT R.RID,R.BID,B.TITLE,R.CONTENT,M.NAME FROM REPLY R JOIN BOARD B ON R.BID=B.BID JOIN MEMBER M ON R.WRITER=M.MID WHERE B.BID = ?
DAO 작성하기 (C에게 데이터를 넘겨주기)
댓글 데이터는 한 번에 여러 데이터를 조회하여 반환하는 것이므로, SELECTALL이다.
DB와 연결을 해준 후 쿼리를 완성하여 받은 값을 ArrayList에 담아서 반환하고 DB와의 연결을 종료한다.
(주석 및 로그는 생략됐다 원래는 로그를 작성하여 정상작동여부를 확인하는 것이 좋다!)
public ArrayList<ReplyDTO> selectAll(ReplyDTO replyDTO){
ArrayList<ReplyDTO> datas=new ArrayList<>();
Connection conn=JDBCUtil.connect(); //연결
PreparedStatement pstmt=null;
try {
pstmt=conn.prepareStatement(SELECTALL); //쿼리
pstmt.setInt(1, replyDTO.getBid()); //id
ResultSet rs=pstmt.executeQuery();
while(rs.next()) {
ReplyDTO data=new ReplyDTO();
data.setRid(rs.getInt("RID")); //댓글id
data.setContent(rs.getString("CONTENT")); //내용
data.setWriter(rs.getString("NAME")); //이름
datas.add(data);
}
} catch (SQLException e) {
System.out.println("SQL문 실패");
}
JDBCUtil.disconnect(conn,pstmt);//연결해제
return datas;
}
Controller에서 V에게 데이터 전달하기
컨트롤러는 기존 선택 게시물 정보를 넘길 때 이제 댓글 데이터까지 함께 넘겨야한다.
즉, 기존 선택 게시물 정보를 넘기는 Action에 댓글 데이터 불러와 요청에 함께 넘기면 된다.
(수업용 코드에 바로 작성하여 주석 다소 생략됐다, 꼭 주석 작성해야한다!)
public class BoardAction implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
BoardDTO boardDTO = new BoardDTO();
BoardDAO boardDAO = new BoardDAO();
boardDTO.setBid(Integer.parseInt(request.getParameter("bid")));
BoardDTO data = boardDAO.selectOne(boardDTO);
request.setAttribute("data", boardDTO);
//댓글 데이터
ReplyDAO replyDAO = new ReplyDAO();
ReplyDTO replyDTO = new ReplyDTO();
replyDTO.setBid(Integer.parseInt(request.getParameter("bid")));
//데이터 불러오기
ArrayList<ReplyDTO> replyList = replyDAO.selectAll(replyDTO);
//데이터 요청에 담기
//replyList로 전달
request.setAttribute("replyList", replyList);
ActionForward forward = new ActionForward();
forward.setRedirect(false);
forward.setPath("board.jsp");
return forward;
}
}
V는 받은 데이터를 화면에 보여주기
이제 마지막 단계까지 왔다. 정상적으로 데이터가 잘 전달되고 있다면, V는 데이터를 보여주면된다.
기존 페이지에 댓글을 출력할 JSTL을 작성하면된다. Controller에서 replyList로 데이터가 넘어오기 때문에 replyList로 받아야한다.
댓글정보출력...
<c:forEach var="reply" items="${replyList}">
<table border="1">
<tr><td>${reply.writer}</td><td>${reply.content}</td></tr>
</table>
</c:forEach>
정상작동 확인하기!
2. 없는 페이지 오류 페이지로 바꾸기
게시물을 조회할 때 url에 bid를 담아 이동하기 때문에 url을 수정하면 해당하는 게시물이 없는 페이지로도 이동할 수 있다.
없는 게시물로 이동할 경우 오류를 띄우는 기능을 추가할 예정이다.
로직 설계하기
- 어떤 상황일 때 오류 페이지가 나와야하는지 확인하기
- C파트에서 확인한 상황일 때 error페이지로 갈 수 있도록 분기 설정하기
- V파트에서 error 페이지 만들기
오류 페이지가 나와야하는 상황 찾기
- bid에 유효하지 않은 값이 들어왔을 때 (NumberFormatException 발생)
- bid에 들어갈 수 있는 값이지만 존재하지 않는 게시물일 때 (오류 발생하지 않음)
(유효하지 않은 값은 500에러가 발생하므로 web.xml에서 처리하는 것이 이상적이지만 이번 과제에는 별도로 분기처리를 했다.)
web.xml에서 처리할 경우 web.xml 루트엘리먼트 태그 안에 error페이지를 설정해주면된다.
<error-page>
<error-code>404</error-code>
<location>/error/error.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/error.jsp</location>
</error-page>
error페이지로 분기처리하기
error페이지로 분기처리할 방법에 대해 생각해보았다.
현채 Front Controller에서 어떠한 요청도 받지 못해 forward가 null일 때를 검증하고 있는데, 그 상황에서도 error페이지로 이동해야하므로 그 부분을 활용해보기로 결정했다.
forward는 기능에 따라 맞는 경로와 이동 페이지를 반환하기 위해 만든 클래스로, Redirect인지 forward인지 결정하는 boolean 타입의 필드 하나와, 이동 페이지를 저장하는 String 필드 하나로 총 두 개의 필드값을 가지고 있는 클래스이다.
// 3. 응답(페이지 이동 등)
// 1) 전달할 데이터가 있니? 없니? == 포워드? 리다이렉트?
// 2) 어디로 갈까? == 경로
if(forward == null) {
// command 요청이 없는 경우
System.out.println("error 발생");
forward = new ActionForward();
forward.setRedirect(true);
forward.setPath("error/error.jsp");
}
이제 forward를 null로 반환하면 error페이지로 이동할 수 있는 준비가 됐다.
error가 발생하는 지점에 retrun null을 하면 된다.
public class BoardAction implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
BoardDTO boardDTO = new BoardDTO();
BoardDAO boardDAO = new BoardDAO();
try {
boardDTO.setBid(Integer.parseInt(request.getParameter("bid")));
//넘버포맷 오류 발생 시
} catch (NumberFormatException e) {
return null;
}
BoardDTO data = boardDAO.selectOne(boardDTO);
//넘어온 데이터가 없는 경우 == 게시물이 없는 경우 (오류발생해야하는 경우)
if(data == null) {
return null;
}
request.setAttribute("data", data);
ReplyDAO replyDAO = new ReplyDAO();
ReplyDTO replyDTO = new ReplyDTO();
replyDTO.setBid(Integer.parseInt(request.getParameter("bid")));
ArrayList<ReplyDTO> replyList = replyDAO.selectAll(replyDTO);
request.setAttribute("replyList", replyList);
ActionForward forward = new ActionForward();
forward.setRedirect(false);
forward.setPath("board.jsp");
return forward;
}
}
V파트에서 error페이지 만들기
V에서 error 페이지를 만든다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
error페이지
<a href="main.do">돌아가기</a>
</body>
</html>
확인하기
에러페이지가 원하는 상황에 잘 뜨고 있다!
[풀이]
throw로 오류를 발생시켜 오류 페이지를 띄우는 방식을 보여주셨다.
언체크 예외를 사용하면 바로 오류 페이지로 이동시킬 수 있다. 단, web.xml에 error페이지 설정을 해둬야한다.
throw new RuntimeException(); //언체크 예외의 가장 상위 exception
'problem solving > 과제&실습 코딩' 카테고리의 다른 글
[연습] 커뮤니티 사이트로 JSP 프로젝트 V, C파트 연습 - 사전설계 (0) | 2024.09.14 |
---|---|
[실습/JS] Ajax로 JSON 데이터 불러오기, id 중복검사하기 (0) | 2024.08.22 |
[실습/JSP] 이전 쇼핑몰 프로그램에 JSTL, 커스텀 태그 적용하기 (0) | 2024.08.14 |
[실습/JSP] 이전 쇼핑몰 프로그램에 C 통합, EL식 더하기 (0) | 2024.08.12 |
[풀이/JSP] 간단한 쇼핑몰 프로그램 풀이코드 분석 (0) | 2024.08.11 |