자바43일차

달달한스위츠·2024년 4월 14일

자바배우기

목록 보기
40/43

오늘의 코드
저번에 작성한 코드에 댓글 기능과 페이징처리를 추가함
추가한 부분만 따로 올림

package edu.web.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
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 edu.web.domain.BoardVO;
import edu.web.persistence.BoardDAO;
import edu.web.persistence.BoardDAOImple;
import edu.web.util.PageCriteria;
import edu.web.util.PageMaker;

@WebServlet("*.do") // *.do : ~.do로 선언된 HTTP 호출에 대해 반응
public class BoardController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final String BOARD_URL = "WEB-INF/board/";
	private static final String MAIN = "index";
	private static final String LIST = "list";
	private static final String REGISTER = "register";
	private static final String DETAIL = "detail";
	private static final String UPDATE = "update";
	private static final String DELETE = "delete";
	private static final String EXTENSION = ".jsp";
	private static final String SERVER_EXTENSION = ".do";

	private static BoardDAO dao;
	
	public BoardController() {
		dao = BoardDAOImple.getInstance();
	}

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String requestURI = request.getRequestURI();
		String requestMethod = request.getMethod();
		System.out.println("호출 경로 : " + requestURI);
		System.out.println("호출 방식 : " + requestMethod);

		if (requestURI.contains(LIST + SERVER_EXTENSION)) {
			System.out.println("list 호출 확인");
			list(request, response);
		} else if (requestURI.contains(REGISTER + SERVER_EXTENSION)) {
			System.out.println("register 호출 확인");
			if (requestMethod.equals("GET")) { // GET 방식(페이지 불러오기)
				registerGET(request, response);
			} else if (requestMethod.equals("POST")) { // POST 방식(DB에 저장)
				registerPOST(request, response);
			}
		} else if (requestURI.contains(DETAIL + SERVER_EXTENSION)) {
			System.out.println("detail 호출 확인");
			detail(request, response);
		} else if (requestURI.contains(UPDATE + SERVER_EXTENSION)) {
			System.out.println("update 호출 확인");
			if(requestMethod.equals("GET")) { // GET 방식(페이지 불러오기)
				updateGET(request, response);
			} else if (requestMethod.equals("POST")) { // POST 방식(DB에 저장)
				updatePOST(request, response);
			}
		} else if (requestURI.contains(DELETE + SERVER_EXTENSION)) {
			System.out.println("delete 호출 확인");
			if(requestMethod.equals("POST")) {
				deletePOST(request, response);
			}
		}

	} // end service()

	

	// TODO : 전체 게시판 내용(list)을 DB에서 가져오고, 그 데이터를 list.jsp 페이지에 전송
	private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		System.out.println("list()");
		String path = BOARD_URL + LIST + EXTENSION;
		
//		List<BoardVO> boardList = dao.select();
//		List<BoardVO> boardList = dao.select(1, 3);
//		int page = Integer.parseInt(request.getParameter("page"));
		// null이여도 상관이 없게 된다.
		String page = request.getParameter("page");
		
		PageCriteria criteria = new PageCriteria();
		if(page != null) {
			criteria.setPage(Integer.parseInt(page));
		}
		
		List<BoardVO> boardList = dao.select(criteria);
		
		request.setAttribute("boardList", boardList);
		
		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);
		RequestDispatcher dis = request.getRequestDispatcher(path);
		dis.forward(request, response);
		
	} // end list()

	// TODO : register.jsp 페이지 호출
	private void registerGET(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		System.out.println("registerGET()");
		String path = BOARD_URL + REGISTER + EXTENSION;
		RequestDispatcher dis = request.getRequestDispatcher(path);
		dis.forward(request, response);
		
	} // end registerGET()

	// TODO : register.jsp form으로 전송된 데이터를 DB 테이블에 등록
	// TODO : index.jsp로 이동
	private void registerPOST(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		System.out.println("registerPOST()");
		String memberid = request.getParameter("memberid");
		String boardtitle = request.getParameter("boardtitle");
		String boardcontent = request.getParameter("boardcontent");
		
		BoardVO board = new BoardVO(0, boardtitle, boardcontent, memberid, null);
		
		int result = dao.insert(board);
		System.out.println(result);
		response.sendRedirect("index.jsp");
		
	} // end registerPOST()
	
	// TODO : DB 테이블에서 상세 조회 데이터를 가져와서, detail.jsp로 전송 및 페이지 출력
	private void detail(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		System.out.println("detail()");
		String path = BOARD_URL + DETAIL + EXTENSION;
		
		int boardId = Integer.parseInt(request.getParameter("boardId"));
		
		System.out.println(boardId);
		BoardVO boardvo = dao.select(boardId);
		
		request.setAttribute("boardvo", boardvo);
		RequestDispatcher dis = request.getRequestDispatcher(path);
		dis.forward(request, response);
	} // end detail()
	
	// TODO : DB 테이블에서 상세 조회한 게시글 데이터를 전송하고, update.jsp 페이지로 호출
	private void updateGET(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		System.out.println("updateGET()");
		String path = BOARD_URL + UPDATE + EXTENSION;
		
		int boardId = Integer.parseInt(request.getParameter("boardId"));
		
		System.out.println(boardId);
		BoardVO boardvo = dao.select(boardId);
		
		request.setAttribute("boardvo", boardvo);
		RequestDispatcher dis = request.getRequestDispatcher(path);
		dis.forward(request, response);
	} // end updateGET()
	
	// TODO : update.jsp에서 전송된 수정할 데이터를 DB로 전송하여 테이블 수정 수행
	// TODO : 수정이 완료되면, detail.jsp로 이동(이동할 때 어떤 값을 전송해야 할걸?ㅎ)
	private void updatePOST(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		System.out.println("updatePOST()");		
		 
		String path = DETAIL + SERVER_EXTENSION;
		
		int boardId = Integer.parseInt(request.getParameter("boardId"));
		
		String boardtitle = request.getParameter("boardtitle");
		String boardcontent = request.getParameter("boardcontent");
		String memberId = request.getParameter("memberId");
		
		BoardVO board = new BoardVO(boardId, boardtitle, boardcontent, memberId, null);
		
		System.out.println(boardId);
		int result = dao.update(board);
		
		if(result == 1) {
			System.out.println(result);
			request.setAttribute("boardId", boardId);
			RequestDispatcher dis = request.getRequestDispatcher(path);
			dis.forward(request, response);
		}
		
	} // end updatePOST()
	
	// TODO : 게시글 번호를 전송받아서, DB 테이블에서 데이터 삭제
	// TODO : 삭제가 완료되면, index.jap로 이동
	private void deletePOST(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		System.out.println("deletePOST()");		
		String path = MAIN + EXTENSION;
		
		int boardId = Integer.parseInt(request.getParameter("boardId"));
		
		int result = dao.delete(boardId);
		if(result == 1) {
			RequestDispatcher dis = request.getRequestDispatcher(path);
			dis.forward(request, response);
		}
	} // end deletePOST()

}

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 req, 
			HttpServletResponse resp) throws ServletException, IOException {
		String requsetURI = req.getRequestURI();
		System.out.println(requsetURI);
		
		if(requsetURI.contains("add")) {
			System.out.println("add 호출 확인");
			replyAdd(req, resp);
		}
		
	}

	// ajax 통신으로 댓글 JSON 데이터를 전송받아,
	// DB에 저장하고, 저장에 성공하면 success 메세지를 다시 돌려줌
	private void replyAdd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String obj = req.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) {
				resp.getWriter().append("success");
			}
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}
package edu.web.domain;

import java.util.Date;

public class ReplyVO {
	private int replyId;
	private int boardId;
	private String memberId;
	private String replyContent;
	private Date replyDateCreated;
	
	public ReplyVO() {}

	public ReplyVO(int replyId, int boardId, String memberId, String replyContent, Date replyDateCreated) {
		this.replyId = replyId;
		this.boardId = boardId;
		this.memberId = memberId;
		this.replyContent = replyContent;
		this.replyDateCreated = replyDateCreated;
	}

	public int getReplyId() {
		return replyId;
	}

	public void setReplyId(int replyId) {
		this.replyId = replyId;
	}

	public int getBoardId() {
		return boardId;
	}

	public void setBoardId(int boardId) {
		this.boardId = boardId;
	}

	public String getMemberId() {
		return memberId;
	}

	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}

	public String getReplyContent() {
		return replyContent;
	}

	public void setReplyContent(String replyContent) {
		this.replyContent = replyContent;
	}

	public Date getReplyDateCreated() {
		return replyDateCreated;
	}

	public void setReplyDateCreated(Date replyDateCreated) {
		this.replyDateCreated = replyDateCreated;
	}

	@Override
	public String toString() {
		return "ReplyVO [replyId=" + replyId + ", boardId=" + boardId + ", memberId=" + memberId + ", replyContent="
				+ replyContent + ", replyDateCreated=" + replyDateCreated + "]";
	} 

}






package edu.web.persistence;

import java.util.List;

import edu.web.domain.BoardVO;
import edu.web.util.PageCriteria;

public interface BoardDAO {
	// 게시글 등록
	int insert(BoardVO vo);
	
	// 게시글 전체 조회
	List<BoardVO> select();
	
	// 게시글 상세 조회
	BoardVO select(int boardId);
	
	// 게시글 수정
	int update(BoardVO vo);
	
	// 게시글 삭제
	int delete(int boardId);
	
	// 게시글 페이징 처리
	List<BoardVO> select(PageCriteria criteria);
	
	// 전체 게시물 갯수
	int getTotalCount();
}




package edu.web.persistence;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import edu.web.dbcp.connmgr.ConnMgr;
import edu.web.domain.BoardVO;
import edu.web.util.PageCriteria;

public class BoardDAOImple implements BoardDAO, BoardQuery{
	private static BoardDAOImple instance = null;
	
	private BoardDAOImple() {}
	
	public static BoardDAOImple getInstance() {
		if(instance == null) {
			instance = new BoardDAOImple();
		}
		return instance;
	}

	@Override
	public int insert(BoardVO vo) {
		int result = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			conn = ConnMgr.getConnection();
			pstmt = conn.prepareStatement(SQL_INSERT);
			pstmt.setString(1, vo.getBoardTitle());
			pstmt.setString(2, vo.getBoardContent());
			pstmt.setString(3, vo.getMemberId());
			
			result = pstmt.executeUpdate();
			System.out.println("insert 성공");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnMgr.close(conn, pstmt);
		}
		
		
		return result;
	}

	@Override
	public List<BoardVO> select() {
		List<BoardVO> list = new ArrayList<>();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = ConnMgr.getConnection();
			pstmt = conn.prepareStatement(SQL_SELECT_ALL);
			
			rs = pstmt.executeQuery();
			
			int boardId;
			String boardTitle;
			String boardContent;
			String memberId;
			Date boardDateCreated;
			BoardVO vo = null;
			
			while(rs.next()) {
				boardId = rs.getInt(COL_BOARD_ID);
				boardTitle = rs.getString(COL_BOARD_TITLE);
				boardContent = rs.getString(COL_BOARD_CONTENT);
				memberId = rs.getString(COL_MEMBER_ID);
				boardDateCreated = rs.getTimestamp(COL_BOARD_DATE_CREATED);
				vo = new BoardVO(boardId, boardTitle, boardContent, memberId, boardDateCreated);
				list.add(vo);
			}
			System.out.println("select all 성공");
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnMgr.close(conn, pstmt, rs);
		}
		
		return list;
	}

	@Override
	public BoardVO select(int boardId) {
		BoardVO vo = null;
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = ConnMgr.getConnection();
			pstmt = conn.prepareStatement(SQL_SELECT_BY_BOARD_ID);
			pstmt.setInt(1, boardId);
			
			rs = pstmt.executeQuery();
			
			
			String boardTitle;
			String boardContent;
			String memberId;
			Date boardDateCreated;
			
			if(rs.next()) {
//				boardId = rs.getInt(COL_BOARD_ID);
				boardTitle = rs.getString(COL_BOARD_TITLE);
				boardContent = rs.getString(COL_BOARD_CONTENT);
				memberId = rs.getString(COL_MEMBER_ID);
				boardDateCreated = rs.getTimestamp(COL_BOARD_DATE_CREATED);
				vo = new BoardVO(boardId, boardTitle, boardContent, memberId, boardDateCreated);

			}
			System.out.println("select by board_id 성공");
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnMgr.close(conn, pstmt, rs);
		}
		
		return vo;
	}

	@Override
	public int update(BoardVO vo) {
		int result = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			conn = ConnMgr.getConnection();
			pstmt = conn.prepareStatement(SQL_UPDATE);
			pstmt.setString(1, vo.getBoardTitle());
			pstmt.setString(2, vo.getBoardContent());
			pstmt.setInt(3, vo.getBoardId());
			
			result = pstmt.executeUpdate();
			System.out.println("update 성공");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnMgr.close(conn, pstmt);
		}
		
		
		return result;
	}

	@Override
	public int delete(int boardId) {
		int result = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			conn = ConnMgr.getConnection();
			pstmt = conn.prepareStatement(SQL_DELETE);
			pstmt.setInt(1, boardId);
			
			result = pstmt.executeUpdate();
			System.out.println("delete 성공");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnMgr.close(conn, pstmt);
		}
		
		
		return result;
	}

	@Override
	public List<BoardVO> select(PageCriteria criteria) {
		List<BoardVO> list = new ArrayList<>();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = ConnMgr.getConnection();
			pstmt = conn.prepareStatement(SQL_SELECT_PAGESCOPE);
			
			pstmt.setInt(1, criteria.getStart());
			pstmt.setInt(2, criteria.getEnd());
			rs = pstmt.executeQuery();
			
			int boardId;
			String boardTitle;
			String boardContent;
			String memberId;
			Date boardDateCreated;
			BoardVO vo = null;
			
			while(rs.next()) {
				boardId = rs.getInt(COL_BOARD_ID);
				boardTitle = rs.getString(COL_BOARD_TITLE);
				boardContent = rs.getString(COL_BOARD_CONTENT);
				memberId = rs.getString(COL_MEMBER_ID);
				boardDateCreated = rs.getTimestamp(COL_BOARD_DATE_CREATED);
				vo = new BoardVO(boardId, boardTitle, boardContent, memberId, boardDateCreated);
				list.add(vo);
			}
			System.out.println("select page 성공");
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnMgr.close(conn, pstmt, rs);
		}
		
		return list;
	}

	@Override
	public int getTotalCount() {
		int count = 0;
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = ConnMgr.getConnection();
			pstmt = conn.prepareStatement(SQL_TOTAL_CNT);
			
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
				count = rs.getInt("total_cnt");
			}
			System.out.println("select page 성공");
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnMgr.close(conn, pstmt, rs);
		}
		
		return count;
		
	}
	
	
	
}
package edu.web.persistence;

public interface BoardQuery {
	public static final String TABLE_NAME = "BOARD";
	public static final String COL_BOARD_ID = "BOARD_ID";
	public static final String COL_BOARD_TITLE = "BOARD_TITLE";
	public static final String COL_BOARD_CONTENT = "BOARD_CONTENT";
	public static final String COL_MEMBER_ID = "MEMBER_ID";
	public static final String COL_BOARD_DATE_CREATED = "BOARD_DATE_CREATED";
	
	// 게시글 등록
	// INSERT INTO BOARD 
	// VALUES (BOARD_SEQ.NEXTVAL, ?, ?, ?, SYSDATE);
	public static final String SQL_INSERT = 
			"INSERT INTO " + TABLE_NAME + " VALUES " 
			+ "(BOARD_SEQ.NEXTVAL, ?, ?, ?, SYSDATE)";
	
	// 전체 게시글 조회
	//	SELECT * FROM BOARD ORDER BY BOARD_ID DESC;
	public static final String SQL_SELECT_ALL = 
			"SELECT * FROM " + TABLE_NAME + 
			" ORDER BY " + COL_BOARD_ID + " DESC";
	
	// 상세 게시글 조회
	//	SELECT * FROM BOARD 
	//	WHERE BOARD_ID = 1;
	public static final String SQL_SELECT_BY_BOARD_ID = 
			"SELECT * FROM " + TABLE_NAME + " WHERE "
			+ COL_BOARD_ID + " = ?";
	
	// 상세 게시글 수정
//	UPDATE BOARD 
//	SET
//	BOARD_TITLE = 'TEST', 
//	BOARD_CONTENT = 'TEST', 
//	BOARD_DATE_CREATED = SYSDATE
//	WHERE BOARD_ID = 1;
	public static final String SQL_UPDATE = 
			"UPDATE " + TABLE_NAME + " SET "
			+ COL_BOARD_TITLE + " = ?, "
			+ COL_BOARD_CONTENT + " = ?, "
			+ COL_BOARD_DATE_CREATED + " = SYSDATE "
			+ "WHERE " + COL_BOARD_ID + " = ?";
			
	// 상세 게시글 삭제
	// DELETE BOARD WHERE BOARD_ID = ?
	public static final String SQL_DELETE = 
			"DELETE " + TABLE_NAME + 
			" WHERE " + COL_BOARD_ID + " = ?";
	
	// 게시글 페이징 처리 조회
	// SELECT * FROM(
	//	    SELECT ROW_NUMBER() OVER (ORDER BY BOARD_ID DESC) AS RN, BOARD.*
	//	    FROM BOARD
	//	)
	//	WHERE RN BETWEEN 2 AND 5;
	public static final String SQL_SELECT_PAGESCOPE = 
			"SELECT * FROM("
			+ "    SELECT ROW_NUMBER() OVER (ORDER BY BOARD_ID DESC) AS RN, BOARD.*"
			+ "    FROM BOARD"
			+ ")"
			+ "WHERE RN BETWEEN ? AND ?";
	
	// SELECT COUNT(BOARD_ID) TOTAL_CNT FROM BOARD;
	public static final String SQL_TOTAL_CNT = 
			"SELECT COUNT(BOARD_ID) TOTAL_CNT FROM BOARD";
}








package edu.web.persistence;

import java.util.List;

import edu.web.domain.ReplyVO;

public interface ReplyDAO {
	int insert(ReplyVO vo);
	List<ReplyVO> select(int boardId);
	int update(ReplyVO vo);
	int delete(int replyId);
}
package edu.web.persistence;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import edu.web.dbcp.connmgr.ConnMgr;
import edu.web.domain.ReplyVO;

public class ReplyDAOImple implements ReplyDAO, ReplyQuery {
	private static ReplyDAOImple instance = null;
	
	private ReplyDAOImple() {}
	
	public static ReplyDAOImple getInstance() {
		if(instance == null) {
			instance = new ReplyDAOImple();
		}
		return instance;
	}

	@Override
	public int insert(ReplyVO vo) {
		int result = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			conn = ConnMgr.getConnection();
			pstmt = conn.prepareStatement(SQL_INSERT);
			pstmt.setInt(1, vo.getBoardId());
			pstmt.setString(2, vo.getMemberId());
			pstmt.setString(3, vo.getReplyContent());
			
			result = pstmt.executeUpdate();
			System.out.println("reply insert 성공");
		} catch (Exception e) {
			
			e.printStackTrace();
		} finally {
			ConnMgr.close(conn, pstmt);
		}
		
		
		return result;
	}

	@Override
	public List<ReplyVO> select(int boardId) {
		List<ReplyVO> list = new ArrayList<>();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = ConnMgr.getConnection();
			pstmt = conn.prepareStatement(SQL_SELECT_BY_BOARD_ID);
			pstmt.setInt(1, boardId);
			rs = pstmt.executeQuery();
			
			int replyId;
			String memberId;
			String replyContent;
			Date replyDateCreated;
			ReplyVO vo = null;
			
			while(rs.next()) {
				replyId = rs.getInt(COL_REPLY_ID);
				memberId = rs.getString(COL_MEMBER_ID);
				replyContent = rs.getString(COL_REPLY_CONTENT);
				replyDateCreated = rs.getTimestamp(COL_REPLY_DATE_CREATED);
				vo = new ReplyVO(replyId, boardId, memberId, replyContent, replyDateCreated);
				list.add(vo);
			}
			
			System.out.println("reply list 성공");
			
		} catch (Exception e) {
			
			e.printStackTrace();
		} finally {
			ConnMgr.close(conn, pstmt, rs);
		}
		
		
		return list;
	}

	@Override
	public int update(ReplyVO vo) {
		int result = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			conn = ConnMgr.getConnection();
			pstmt = conn.prepareStatement(SQL_UPDATE);
			pstmt.setString(1, vo.getReplyContent());
			pstmt.setInt(2, vo.getReplyId());
			
			result = pstmt.executeUpdate();
			System.out.println("reply update 성공");
		} catch (Exception e) {
			
			e.printStackTrace();
		} finally {
			ConnMgr.close(conn, pstmt);
		}
		
		
		return result;
	}

	@Override
	public int delete(int replyId) {
		int result = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			conn = ConnMgr.getConnection();
			pstmt = conn.prepareStatement(SQL_DELETE);
			pstmt.setInt(1, replyId);
			
			result = pstmt.executeUpdate();
			System.out.println("reply delete 성공");
		} catch (Exception e) {
			
			e.printStackTrace();
		} finally {
			ConnMgr.close(conn, pstmt);
		}
		
		
		return result;
	}
	
	
}
package edu.web.persistence;

public interface ReplyQuery {
	public static final String TABLE_NAME = "REPLY";
	public static final String COL_REPLY_ID = "REPLY_ID";
	public static final String COL_BOARD_ID = "BOARD_ID";
	public static final String COL_MEMBER_ID = "MEMBER_ID";
	public static final String COL_REPLY_CONTENT = "REPLY_CONTENT";
	public static final String COL_REPLY_DATE_CREATED = "REPLY_DATE_CREATED";
	
	// INSERT INTO REPLY VALUES
	// (REPLY_SEQ.NEXTVAL, ?, ?, ?, SYSDATE);
	public static final String SQL_INSERT =
			"INSERT INTO " + TABLE_NAME + " VALUES " +
					"(REPLY_SEQ.NEXTVAL, ?, ?, ?, SYSDATE)";
	
	// SELECT * FROM REPLY WHERE BOARD_ID = ?
	// ORDER BY REPLY_ID DESC;
	public static final String SQL_SELECT_BY_BOARD_ID = 
			"SELECT * FROM " + TABLE_NAME + " WHERE " + COL_BOARD_ID
			+ " = ? ORDER BY " + COL_REPLY_ID + " DESC";
	
	// UPDATE_REPLY SET
	// REPLY_CONTENT = ?, REPLY_DATE_CREATED = SYSDATE
	// WHERE REPLY_ID = ?;
	public static final String SQL_UPDATE = 
			"UPDATE " + TABLE_NAME + " SET " + 
			COL_REPLY_CONTENT + " = ?, " + COL_REPLY_DATE_CREATED + " = SYSDATE "
			+ " WHERE " + COL_REPLY_ID + " = ?";
	
	// DELETE REPLY WHERE REPLY_ID = ?;
	public static final String SQL_DELETE = 
			"DELETE " + TABLE_NAME + " WHERE "
			+ COL_REPLY_ID + " = ?";
	
}








package edu.web.util;

// 브라우저에서 보여질 페이지 번호와
// 한 페이지에서 보여질 게시글의 개수를 저장하는 클래스
// -> paging 처리에 필요한 start와 end 번호를 알 수 있음
public class PageCriteria {
	private int page; // 현재 페이지 번호
	private int numsPerPage; // 한 페이지의 게시글 개수
	
	public PageCriteria() {
		this.page = 1; // 값이 없을 경우 무조건 1부터 실행
		this.numsPerPage = 10;
	}
	
	public PageCriteria(int page, int numsPerPage) {
		this.page = page;
		this.numsPerPage = numsPerPage;
	}

	// getter/setter
	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}

	public int getNumsPerPage() {
		return numsPerPage;
	}

	public void setNumsPerPage(int numsPerPage) {
		this.numsPerPage = numsPerPage;
	}
	
	// 현재 보여지는 페이지의 시작 글 일련번호(rn)
	public int getStart() {
		return (this.page - 1) * this.numsPerPage + 1;
	}
	
	// 현재 보여지는 페이지의 마지막 글 일련번호(rn)
	public int getEnd() {
		return this.page * this.numsPerPage;
	}
	
	
}



package edu.web.util;

// 페이지 번호들의 링크를 만들기 위한 유틸리티 클래스
public class PageMaker {
	private PageCriteria criteria;
	private int totalCount; // 전체 게시글 개수
	private int numsOfPageLinks; // 페이지 번호 링크의 개수
	private int startPageNo; // 시작 페이지 링크 번호
	private int endPageNo; // 끝 페이지 링크 번호
	private boolean hasPrev; // 화면에 보이는 시작 페이지 번호보다 작은 숫자의 페이지가 있는 지
	private boolean hasNext; // 화면에 보이는 끝 페이지 번호보다 큰 숫자의 페이지가 있는 지
	
	public PageMaker() {
		this.numsOfPageLinks = 3; // 페이지 번호 링크의 개수
	}
	
	public PageCriteria getCriteria() {
		return criteria;
	}
	
	public void setCriteria(PageCriteria criteria) {
		this.criteria = criteria;
	}
	
	public int getTotalCount() {
		return totalCount;
	}
	
	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}
	
	public int getNumsOfPageLinks() {
		return numsOfPageLinks;
	}
	
	public int getStartPageNo() {
		return startPageNo;
	}
	
	public int getEndPageNo() {
		return endPageNo;
	}
	
	public boolean isHasPrev() {
		return hasPrev;
	}
	
	public boolean isHasNext() {
		return hasNext;
	}
	
	// startPageNo, endPageNo, hasPrev, hasNext 값을 계산 및 세팅
	public void setPageData() {
		int totalLinkNo = (int) Math.ceil((double) totalCount / criteria.getNumsPerPage());
		int temp = (int) Math.ceil((double) criteria.getPage() / numsOfPageLinks) * numsOfPageLinks;
		
		if (temp > totalLinkNo) {
			endPageNo = totalLinkNo;
		} else {
			endPageNo = temp;
		}
		
		startPageNo = ((endPageNo - 1) / numsOfPageLinks) * numsOfPageLinks + 1;
		
		if (startPageNo == 1) {
			hasPrev = false;
		} else {
			hasPrev = true;
		}
		
		if (endPageNo * criteria.getNumsPerPage() >= totalCount) {
			hasNext = false;
		} else {
			hasNext = true;
		}
		// Math.ceil (올림)
		// Math.floor (버림
		
	}
	
} // end PageMaker













<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.List" %>
<%@ page import="edu.web.domain.BoardVO" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<style type="text/css">
table, th, td {
   border-style : solid;
   border-width : 1px;
   text-align : center;
}

ul {
   list-style-type : none;
}

li {
   display : inline-block;
}
</style>
<head>
    <title>게시판 목록</title>
</head>
<body>
    <h1>게시판 목록 &nbsp; <button onclick="location.href='register.do'">글 작성하기</button></h1>
    <a href="register.do"><input type="button" value="글 작성"></a>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>제목</th>
                <th>작성자</th>
                <th>작성일</th>
            </tr>
        </thead>
        <tbody>
        <c:forEach var="vo" items="${boardList }">
        	<tr>
        		<td>${vo.boardId }</td>
        		<td><a href="detail.do?boardId=${vo.boardId }">${vo.boardTitle }</a></td>
        		<td>${vo.memberId }</td>
        		<td>${vo.boardDateCreated }</td>
        	</tr>
        </c:forEach>
           <%--  <% 
            List<BoardVO> boardList = (List<BoardVO>) request.getAttribute("boardList");
            if (boardList != null) {
                for (BoardVO board : boardList) {
            %>
                <tr>
                    <td><%= board.getBoardId() %></td>
                    <td><a href="detail.do?boardId=<%=board.getBoardId() %>"> <%=board.getBoardTitle() %> </a></td>
                    <td><%= board.getMemberId() %></td>
                    <td><%= board.getBoardDateCreated() %></td>
                </tr>
            <% 
                }
            }
            %> --%>
        </tbody>
    </table>
    
    <ul>
    <c:if test="${pageMaker.hasPrev }">
    	<li><a href="list.do?page=${pageMaker.startPageNo - 1 }">이전</a></li>
    </c:if>
    	<c:forEach begin="${pageMaker.startPageNo }" end="${pageMaker.endPageNo }"
    		var="num">
	    	<li><a href="list.do?page=${num }">${num }</a></li>
    	</c:forEach>
    <c:if test="${pageMaker.hasNext }">
    	<li><a href="list.do?page=${pageMaker.endPageNo + 1 }">다음</a></li>
    </c:if>
    </ul>
    
</body>
</html>
<%@page import="edu.web.domain.BoardVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.7.1.js">
</script>
<%
BoardVO boardvo = (BoardVO) request.getAttribute("boardvo");
%>
<title>게시글 상세조회</title>
</head>
<body>
<form id="updateForm" action="" method="post">
<input type="hidden" id="boardId" name="boardId" value="${boardvo.boardId }">
	<h2>게시글 상세조회 <button onclick="listForm()">뒤로가기</button></h2>
	<label for="memberId">게시글 작성자:</label>
		<input type="text" name="memberId" value="${boardvo.memberId }" readonly required> <br> 
	<label for="boardtitle">게시글 제목:</label>
		<input type="text" id="boardtitle" name="boardtitle" value="${boardvo.boardTitle }" readonly required> <br> 
		<label for="boardcontent">게시글 내용:</label><br>
		<textarea id="boardcontent" name="boardcontent" rows="4" cols="50" readonly>${boardvo.boardContent }</textarea>
		<br> 
		<label for="boardDate">게시및수정 된 날짜:</label><br>
		<input type="text" id="boardDate" name="boardDate" value="${boardvo.boardDateCreated }" readonly="readonly" required> <br> 
		<br>
		<button onclick="updateForm()">게시글 수정하기</button> 
		<button onclick="deleteForm()">게시글 삭제하기</button>
		</form> <br>
		
		<div style="text-align: center;">
			<input type="text" id="memberId">
			<input type="text" id="replyContent">
			<button id="btnAdd">작성</button>
		</div>
		<hr>
		<div style="text-align: center;">
			<div id="replies"></div>
		</div>
		
		<div>
			<br><br><br><br><br><br><br><br>
		</div>
		
		<script type="text/javascript">
			$(document).ready(function(){
				$('#btnAdd').click(function(){
					let boardId = $('#boardId').val(); // 게시판 번호 데이터
					let memberId = $('#memberId').val(); // 작성자 데이터
					let replyContent = $('#replyContent').val(); // 댓글 내용
					let obj = {
							'boardId' : boardId,
							'memberId' : memberId,
							'replyContent' : replyContent
					};
					console.log(obj);
					
					// $.ajax로 송수신
					$.ajax({
						type : 'POST',
						url : 'replies/add',
						data : {'obj' : JSON.stringify(obj)}, // JSON으로 변환
						success : function(result) {
							console.log(result);
						}
					});
				});
				
				
				
				
				
				
				function listForm() {
					let form = document.getElementById("updateForm");
					form.method = "GET";
					form.action = "list.do";
					form.submit();
				}
				
				function updateForm() {
					let form = document.getElementById("updateForm");
					form.method = "GET";
					form.action = "update.do";
					form.submit();
				}

				function deleteForm() {
					if (confirm('정말로 삭제 하시겠습니까?')) {
						let form = document.getElementById("updateForm");
						form.method = "POST";
						form.action = "delete.do";
						form.submit();
					} else {
						form.method = "GET";
						location.href = "detail.do";
					}
				}
			});
		
		
		
		</script>
</body>
</html>

0개의 댓글