2024.04.15_ jsp Servlet 을 이용한 MVC<게시판 만들기(오류 수정)>+ 페이징 처리, 댓글 기능
과정 요약
1. DB 연결
private static BoardDAO dao;
2.
dao = BoardDAOImple.getInstance();
3. 전체 게시판 내용(list)을 DB에서 가져오고, 그 데이터를 list.jsp 페이지에 전송
List<BoardVO> list = dao.select();
System.out.println(list);
String path = BOARD_URL + LIST + EXTENSION; //servlet을 거치도록 함 (포워딩)
RequestDispatcher dispatcher
= request.getRequestDispatcher(path);
dispatcher.forward(request, response);
request.setAttribute("list", list); // jsp로 전송
4. list.jsp
JSTL을 쓰는게 좋음 -> 가독성
5. register.jsp 페이지 구성
6. resgisterGET은 만들었으니
7. registerPOST
register.jsp form에서 전송된 데이터를 DB 테이블에 등록
String boardTitle = request.getParameter("boardTitle");
String boardContent = request.getParameter("boardContent");
String memberId = request.getParameter("memberId");
BoardVO vo = new BoardVO(0, boardTitle, boardContent, memberId, null); // VO 에 묶기
System.out.println(vo); // 확인하기
int result = dao.insert(vo); // 연결하기
System.out.println("결과 : " + result);
if(result == 1) { // 구조적 안정성을 위해 if문 설정
response.sendRedirect("index.jsp"); // url 경로가 안보여서 sendRedirect를 씀
}
8. detail
DB 테이블에서 상세 조회 데이터를 가져와서, detail.jsp 페이지로 전송 및 페이지 출력
* list.jsp 바꾸기
<td><a href="detail.do?boardId=${board.boardId}">${board.boardTitle}</a></td>
* 받아오기
int boardId = Integer.parseInt(request.getParameter("boardId"));
BoardVO vo = dao.select(boardId);
System.out.println(vo);
String path = BOARD_URL + DETAIL + EXTENSION;
RequestDispatcher dispatcher
= request.getRequestDispatcher(path);
dispatcher.forward(request, response);
9. detail.jsp
만들기
10. updateGET
DB 테이블에서 상세 조회한 게시글 데이터를 전송하고, update.jsp 페이지를 호출
int boardId = Integer.parseInt(request.getParameter("boardId"));
BoardVO vo = dao.select(boardId);
System.out.println(vo);
String path = BOARD_URL +UPDATE+ EXTENSION;
RequestDispatcher dispatcher
= request.getRequestDispatcher(path);
dispatcher.forward(request, response);
11. update.jsp 만들기
12. updatePOST
update.jsp에서 전송된 수정할 데이터를 DB로 전송하여 테이블 수정 수행
수정이 완료되면, detail.jsp로 이동(이동할 때 어떤 값을 전송해야 할걸?) -> forwarding 쓰면 안댐..get방식에서 쓰는 방식
int boardId = Integer.parseInt(request.getParameter("boardId"));
String boardTitle = request.getParameter("boardTitle");
String boardContent = request.getParameter("boardContent");
BoardVO vo = new BoardVO(boardId, boardTitle, boardContent, null, null);
int result = dao.update(vo);
if(result == 1){
String path = DETAIL + EXTENSION ;
response.sendRedirect(path + "?boardId=" + boardId);
}
13. 한글 깨지는거 -> 필터 만들기(CharFilte.java)
14. deletePOST
* detail.jsp에서 form으로 delete.do 으로 보내기
int boardId = Integer.parseInt(request.getParameter("boardId"));
int result = dao.delete(boardId);
if(result == 1){
response.sendRedirect(MAIN + EXTENSION);
}
8. detail
원래 코드
getParameter는 String 타입이라
boardId 를 String 으로 받아와서
Integer.parseInt() 로 변환하려고 했음
-> 그냥 Integer.parseInt() 괄호 안에
request.getParameter() 넣기
그리고 jsp 만들고 순서 대로 해야하는데
jsp를 나중에 만들 생각해서
받아오는 값들이 이상해짐
수정 코드
실행 화면
흠.. 좀 이상하긴 함..
고쳐볼것
+ 수정
request.setAttribute( "board", result ); 를 빼먹었다...
jsp 파일에서 데이터를 사용하려면 servlet 에서 속성을 설정해야 한다.
이걸 사용해야 jsp 파일에서 "board"라는 이름의 속성을 통해 데이터에 접근 할 수 있음
즉 "board"라는 이름으로 'result' 객체를 jsp 파일에 전달할 수 있다.
jsp파일에서는 ${board] 와 같이 EL(Expression Language)을 이용해 해당 객체에 접근 할 수 있다
10. updateGET
원래 코드
update.jsp를 완성하고 나서 만들었어야 했는데
jsp를 나중에 만들고자 해서
어려움이 있었음
수정 코드
update.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
글 수정 페이지
12. updatePOST
원래 코드
수정코드
boardId , boardTitle , boardContent 만 가져오고
vo 에 저장한다
그리고 update
14. delete
원래 코드
이것도 getParameter가 String 만 받으니깐 int인 boardId 를
형변환 시킴
int boardId = Integer.parseInt(request.getParameter("boardId"));
그리고
response.sendRedirect() 괄호안에
MAIN + EXTENSION 을 넣어도 됌
수정 코드
1. 주제 : 비동기 댓글 기능 구현
2. 기능
- 댓글 등록
- 댓글 전체 조회
- 댓글 수정
- 댓글 삭제
3. 테이블
REPLY
댓글 번호
게시글 번호
댓글 작성자
댓글 내용
댓글 작성일
1페이지 부터 시작해서 5 페이지 까지 보여줌
페이지 링크의 개수
3으로 설정하면 3페이지씩
10으로 설정하면 10 페이지씩 나눠진다
// TODO : 전체 게시판 내용(list)을 DB에서 가져오고, 그 데이터를 list.jsp 페이지에 전송
private void list(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("list()");
//List<BoardVO> list = dao.select(); // VO 객체 생성
String page = request.getParameter("page");
PageCriteria criteria = new PageCriteria();
if(page != null) {
criteria.setPage(Integer.parseInt(page));
}
List<BoardVO> list = dao.select(criteria);
// list.jsp 페이지로 포워딩
String path = BOARD_URL + LIST + EXTENSION;
// System.out.println(path);
RequestDispatcher dispatcher
= request.getRequestDispatcher(path);
// 데이터를 list.jsp 페이지에 전송한다
request.setAttribute("boardList", list); // 서버에서 JSP 페이지로 데이터를 전달
PageMaker pageMaker = new PageMaker();
pageMaker.setCriteria(criteria);
int totalCount = dao.getTotalCount();
pageMaker.setTotalCount(totalCount);
pageMaker.setPageData();
System.out.println("전체 게시글 수 : " + pageMaker.getTotalCount());
System.out.println("현재 선책된 페이지 : " + criteria.getPage());
System.out.println("한 페이지 당 게시글 수 : "
+ criteria.getNumsPerPage());
System.out.println("페이지 링크 번호 개수 : "
+ pageMaker.getNumsOfPageLinks());
System.out.println("시작 페이지 링크 번호 : "
+ pageMaker.getStartPageNo());
System.out.println("끝 페이지 링크 번호 : "
+ pageMaker.getEndPageNo());
request.setAttribute("pageMaker", pageMaker);
dispatcher.forward(request, response);
}//end list()
list.jsp
형광펜 친 부분이 퀴즈였음
페이징 처리할때
현재 페이지가 6 (=지금 페이지의 가장 첫번째 숫자)인데
이전을 클릭하면 5로 넘어감
따라서 이 페이지의 첫번째 숫자(pageMaker.startPageNo) 에서 1을 빼면
page = 5가 나온다
현재 페이지는 5이고 이 페이지의 가장 마지막 페이지 넘버임
다음을 누르면 페이지 6으로 이동하므로
현재의 가장 마지막 페이지 넘버( ageMaker.endPageNo ) 에 1을 더하면 된다
다음으로 댓글 처리를 위해
댓글기능
ReplyDAO,
ReplyDAOImple,
ReplyQuery
다운로드 했음
detail.jsp 파일을 수정하고
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
글 보기
글 번호 : ${board.boardId }
제목 :
${board.boardTitle }
작성자 : ${board.memberId }
작성일 : ${board.boardDateCreated }
ReplyController
package edu.web.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import edu.web.domain.ReplyVO;
import edu.web.persistence.ReplyDAO;
import edu.web.persistence.ReplyDAOImple;
@WebServlet("/replies/*")
public class ReplyController extends HttpServlet {
private static final long serialVersionUID = 1L;
private ReplyDAO dao;
public ReplyController() {
dao = ReplyDAOImple.getInstance();
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String requestURI = request.getRequestURI();
System.out.println(requestURI);
if(requestURI.contains("add")) {
System.out.println("add 호출 확인");
replyAdd(request, response);
}
}
// ajax 통신으로 댓글 JSON 데이터를 전송받아,
// DB에 저장하고, 저장에 성공하면 success 메세지를 다시 돌려줌
private void replyAdd(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
String obj = request.getParameter("obj");
System.out.println(obj);
JSONParser parser = new JSONParser();
try {
JSONObject jsonObject = (JSONObject)parser.parse(obj);
int boardId = Integer.parseInt((String)jsonObject.get("boardId"));
String memberId = (String) jsonObject.get("memberId");
String replyContent = (String) jsonObject.get("replyContent");
ReplyVO vo = new ReplyVO(0, boardId, memberId, replyContent, null);
System.out.println(vo);
int result = dao.insert(vo);
if(result == 1) {
response.getWriter().append("success");
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
실행