오늘의 코드
저번에 작성한 코드에 댓글 기능과 페이징처리를 추가함
추가한 부분만 따로 올림
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>게시판 목록 <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>