백엔드 교육과정/4월

2024.04.15_ jsp Servlet 을 이용한 MVC<게시판 만들기(오류 수정)>+ 페이징 처리, 댓글 기능

Ji@n 2024. 4. 15. 17:48

 

 

과정 요약 


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"%> ${board.boardTitle }

글 수정 페이지

글 번호 : ${board.boardId }

제목 :

작성자 : ${board.memberId }

작성일 : ${board.boardDateCreated }

 

 

 

 

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
댓글 번호
게시글 번호 
댓글 작성자 
댓글 내용
댓글 작성일 

 

 

reply 테이블

 

ROWNUM

 

 

서브트리

 

 

 

페이징 처리 완성

 

 

 

B+ TREE

 

 

페이징 처리 쿼리

 

 

 

PageCriteria

 

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.boardTitle }

글 보기

글 번호 : ${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();
		} 
		
		
	}
    
    
    
}

 

실행