contents
프로젝트 BookMarket 구성도
4.게시판(C/R)
-----------------------------------------
프로젝트 BookMarket 구성도
4.게시판(C/R)
BookMarket_CRUD/src/main/webapp/menu.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ page import="dto.Member" %> <%@ page session="false" %> <% HttpSession session = request.getSession(false); Member mb=null; if(session!=null){ mb = (Member)session.getAttribute("member"); } %> <header class="pb-3 mb-4 border-bottom"> <div class="container "> <div class="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start"> <a href="./welcome.jsp" class="d-flex align-items-center mb-3 mb-md-0 me-md-auto text-dark text-decoration-none"> <svg width="32" height="32" fill="currentColor" class="bi bi-house-fill" viewBox="0 0 16 16"> <path d="M8.707 1.5a1 1 0 0 0-1.414 0L.646 8.146a.5.5 0 0 0 .708.708L8 2.207l6.646 6.647a.5.5 0 0 0 .708-.708L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.707 1.5Z"/> <path d="m8 3.293 6 6V13.5a1.5 1.5 0 0 1-1.5 1.5h-9A1.5 1.5 0 0 1 2 13.5V9.293l6-6Z"/> </svg> <span class="fs-4">Home</span> </a> <ul class="nav nav-pills"> <% if(mb==null){ %> <li class="nav-item"><a class="nav-link" href="login">로그인 </a></li> <li class="nav-item"><a class="nav-link" href="addmember">회원 가입</a></li> <%}else {%> <li style="padding-top: 7px">[<%=mb.getName()%>님]</li> <li class="nav-item"><a class="nav-link" href="<c:url value="logout"/>">로그아웃 </a></li> <li class="nav-item"><a class="nav-link" href="<c:url value="/member/updateMember.jsp"/>">회원 수정</a></li> <%} %> <li class="nav-item"><a href="read_All" class="nav-link" >도서 목록</a></li> <li class ="nav-item"><a href = "addBook" class = "nav-link" >도서 등록</a></li> <li class ="nav-item"><a href = "editBook.jsp?edit=update" class = "nav-link" >도서 수정</a></li> <li class ="nav-item"><a href = "editBook.jsp?edit=delete" class = "nav-link" >도서 삭제</a></li> <li class ="nav-item"><a href = "BoardListAction?pageNum=1" class = "nav-link" >게시판</a></li> </ul> </div> </div> </header> |
*Session: <%@ page session="false" %>
BookMarket_CRUD/src/main/java/dto/Board.java
package dto;
public class Board { private int num; private String id; private String name; private String subject; private String content; private String regist_day; private int hit; private String ip; public Board() { super(); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getRegist_day() { return regist_day; } public void setRegist_day(String regist_day) { this.regist_day = regist_day; } public int getHit() { return hit; } public void setHit(int hit) { this.hit = hit; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } @Override public String toString() { return "Board [num=" + num + ", id=" + id + ", name=" + name + ", subject=" + subject + ", content=" + content + ", regist_day=" + regist_day + ", hit=" + hit + ", ip=" + ip + "]"; } } |
*DTO: 1)변수생성
2)생성자
3)getter/setter
4)toString()
sql
USE BookMarketDB; CREATE TABLE board ( num int not null auto_increment, id varchar(10) not null, name varchar(10) not null, subject varchar(100) not null, content text not null, regist_day varchar(30), hit int, ip varchar(20), PRIMARY KEY (num) )default CHARSET=utf8; select * from board; desc board; insert into board values(null,"a","abc","제목입니다a","내용입니다a","2025-01-01",1,"1.1.1.1"); insert into board values(null,"b","aaa","제목입니다b","내용입니다b","2025-01-02",1,"1.1.1.2"); insert into board values(null,"c","bbb","제목입니다c","내용입니다c","2025-01-03",1,"1.1.1.3"); insert into board values(null,"d","ccc","제목입니다d","내용입니다d","2025-01-04",1,"1.1.1.4"); select count(*) from board |
실행 결과
![]() |
BookMarket_CRUD/src/main/java/Controller/Board_Read_Controller.java
package Controller;
import java.io.IOException; import java.util.*; import dto.Board; import dao.BoardRepository; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet("/BoardListAction") public class Board_Read_Controller extends HttpServlet { //read의 최종적인 목표 : DB에서 특정테이블의 모든행 혹은 하나의 행을 읽어와서 뷰에서 보여준다.(DTO, DB데이터 준비) @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Board_Read_Controller doGet()"); //전처리 int pagenum = Integer.parseInt(req.getParameter("pageNum")); int limit = 5; int total_page; //모델이동 BoardRepository br = BoardRepository.getInstance(); ArrayList<Board> boardlist =br.getAllList(pagenum, limit); int total_record = br.getListCount(); if (total_record % limit == 0){ total_page =total_record/limit; Math.floor(total_page); } else{ total_page =total_record/limit; Math.floor(total_page); total_page = total_page + 1; } //뷰이동 req.setAttribute("Total_Record", total_record); req.setAttribute("Total_Page", total_page); req.setAttribute("pageNum", pagenum); req.setAttribute("list", boardlist); RequestDispatcher ds = req.getRequestDispatcher("board/list.jsp"); ds.forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } } |
*컨트롤러: 1)전처리: 파라미터多, 객체 묶음
2)모델이동: dao.Repository
3)뷰이동
*dto 변수를 dopost에 getParameter로 가져오기
BookMarket_CRUD/src/main/java/dao/BoardRepository.java
package dao;
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import dto.Board; public class BoardRepository { //싱글톤 private static BoardRepository br = new BoardRepository(); public static BoardRepository getInstance() { return br; } private BoardRepository() {} //공용변수선언 Connection conn=null; PreparedStatement pstmt= null; ResultSet rs = null; //Create public void addBoard(Board bd) { //데이터베이스 연결 try { conn = DBConnection.connection(); //쿼리 작성 및 실행 String sql = "insert into Board values(?,?,?,?,?,?,?,?)"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, null); pstmt.setString(2, bd.getId()); pstmt.setString(3, bd.getName()); pstmt.setString(4, bd.getSubject()); pstmt.setString(5, bd.getContent()); pstmt.setString(6, bd.getRegist_day()); pstmt.setInt(7, bd.getHit()); pstmt.setString(8, bd.getIp()); pstmt.executeUpdate(); //ResultSet }catch(Exception e){} } //Read public int getListCount() { int result = 0; try { //데이터베이스 연결 conn = DBConnection.connection(); //쿼리 작성 및 실행 String sql = "select count(*) from board"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); //ResultSet 변환 if(rs.next()) { result = rs.getInt("count(*)"); //컬럼명 //result = rs.getInt(1); 첫번째 컬럼 } System.out.println("총게시글의 갯수 : " + result); }catch(Exception e) {} return result; } public Board getOneList(int num) { Board board=null; try { //데이터베이스 연결 conn = DBConnection.connection(); //쿼리작성 및 실행 String sql = "select * from Board where num=?"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, num); rs = pstmt.executeQuery(); //ResultSet --> DTO --> ArrayList<DTO> while (rs.next()) { board = new Board(); board.setNum(rs.getInt("num")); board.setId(rs.getString("id")); board.setName(rs.getString("name")); board.setSubject(rs.getString("subject")); board.setContent(rs.getString("content")); board.setRegist_day(rs.getString("regist_day")); board.setHit(rs.getInt("hit")); board.setIp(rs.getString("ip")); } } catch (SQLException e) {e.printStackTrace();} return board; } public ArrayList<Board> getAllList(int page, int limit){ //페이징 처리된 함수 : 일부 발췌 int total_record = getListCount(); int start = (page - 1) * limit; int index = start + 1; ArrayList<Board> ab = new ArrayList<Board>(); try { //데이터베이스 연결 conn = DBConnection.connection(); //쿼리작성 및 실행 String sql = "select * from Board"; pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); rs = pstmt.executeQuery(); // ResultSet --> DTO --> ArrayList<DTO> while (rs.absolute(index)) { Board board = new Board(); board.setNum(rs.getInt("num")); board.setId(rs.getString("id")); board.setName(rs.getString("name")); board.setSubject(rs.getString("subject")); board.setContent(rs.getString("content")); board.setRegist_day(rs.getString("regist_day")); board.setHit(rs.getInt("hit")); board.setIp(rs.getString("ip")); ab.add(board); if (index < (start + limit) && index <= total_record) index++; else break; } } catch (SQLException e) {e.printStackTrace();} return ab; } public ArrayList<Board> getAllList2(){ //페이징 안된 함수 ArrayList<Board> ab = new ArrayList<Board>(); try { //데이터베이스 연결 conn = DBConnection.connection(); //쿼리작성 및 실행 String sql = "select * from Board"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); //ResultSet --> DTO --> ArrayList<DTO> while (rs.next()) { Board board = new Board(); board.setNum(rs.getInt("num")); board.setId(rs.getString("id")); board.setName(rs.getString("name")); board.setSubject(rs.getString("subject")); board.setContent(rs.getString("content")); board.setRegist_day(rs.getString("regist_day")); board.setHit(rs.getInt("hit")); board.setIp(rs.getString("ip")); ab.add(board); } } catch (SQLException e) {e.printStackTrace();} return ab; } //Update //Delete } |
* 모델: 1)기본데이터
2)객체(1) DTO
3)ArrayList<DTO>
*sql 추가: select count(*) from board
BookMarket_CRUD/src/main/webapp/board/list.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ page import="java.util.*"%> <%@ page import="dto.Board"%> <%@ page session="false" %> <% //게시글 5개가 담겨있음 ArrayList<Board> boardList = (ArrayList<Board>) request.getAttribute("list"); int total_record = (Integer) request.getAttribute("Total_Record"); int pageNum =(Integer) request.getAttribute("pageNum"); int total_page=(Integer) request.getAttribute("Total_Page"); HttpSession session = request.getSession(false); //String sessionId = (String) session.getAttribute("sessionId"); String sessionId =null; if(session!=null){ sessionId = session.getId(); System.out.println("세션아이디값"+sessionId); }else{ System.out.println("세션아이디값이 없습니다."); } %> <html> <head> <link rel="stylesheet" href="./resources/css/bootstrap.min.css" /> <title>Board</title> <script type="text/javascript"> function checkForm() { let session_value="<%=sessionId%>"; console.log(session_value); if (session_value=="null") { alert("로그인 해주세요."); return false; } location.href = "BoardWriteForm?id=<%=sessionId%>" } </script> </head> <body> <div class="container py-4"> <jsp:include page="../menu.jsp" /> <div class="p-5 mb-4 bg-body-tertiary rounded-3"> <div class="container-fluid py-5"> <h1 class="display-5 fw-bold">게시판</h1> <p class="col-md-8 fs-4">Board</p> </div> </div> <div class="row align-items-md-stretch text-center"> <form action="<c:url value="./BoardListAction.do"/>" method="post"> <div class="text-end"> <span class="badge text-bg-success">전체 <%=total_record%>건 </span> </div> <div style="padding-top: 20px"> <table class="table table-hover text-center"> <tr> <th>번호</th> <th>제목</th> <th>작성일</th> <th>조회</th> <th>글쓴이</th> </tr> <% for (int j = 0; j < boardList.size() ; j++){ Board notice = (Board) boardList.get(j); %> <tr> <td><%=notice.getNum()%></td> <td><a href="./BoardViewAction?num=<%=notice.getNum()%>&pageNum=<%=pageNum%>"><%=notice.getSubject()%></a></td> <td><%=notice.getRegist_day()%></td> <td><%=notice.getHit()%></td> <td><%=notice.getName()%></td> </tr> <% } %> </table> </div> <div align="center"> <% for(int i=1; i<=total_page;i++){ %> <a href="BoardListAction?pageNum=<%=i%>"> <%if(pageNum==i){ %> <font color='FF0000'><b> [<%=i %>]</b></font> <% } else { %> <font color='000000'> [<%=i %>]</font> <%} %> </a> <%} %> </div> <div class="py-3" align="right"> <a href="#" onclick="checkForm(); return false;" class="btn btn-primary">«글쓰기</a> </div> <div align="left"> <select name="items" class="txt"> <option value="subject">제목에서</option> <option value="content">본문에서</option> <option value="name">글쓴이에서</option> </select> <input name="text" type="text" /> <input type="submit" id="btnAdd" class="btn btn-primary " value="검색 " /> </div> </form> </div> <jsp:include page="../footer.jsp" /> </div> </body> </html> |
*<a href="#" onclick="checkForm(); return false;">, <form type="submit">
: return false; -> 태그기능 취소시킴, onclick= "함수호출"
-return false는 JavaScript에서 주로 이벤트 핸들러 내에서 사용되며, 특정 이벤트의 기본 동작을 방지하고 이벤트 전파를 중단하는 데 사용
*request 거치면 무조건 String: 변환해야 쓸 수 있음 ex) (Integer) request.getAttribute("Total_Record");
BookMarket_CRUD/src/main/webapp/footer.jsp
<%@ page session="false" %>
<footer class="pt-3 mt-4 text-body-secondary border-top"> © BookMarket </footer> |
<%@ page session="false" %> 추가
실행 결과
총게시글의 갯수 : 4
총게시글의 갯수 : 4 세션아이디값이 없습니다. admin 1234 Board_Read_Controller doGet() 총게시글의 갯수 : 4 총게시글의 갯수 : 4 세션아이디값95F43E8B83B97F0ECD403F602557E980 |
null/로그인
![]() |
![]() |
BookMarket_CRUD/src/main/java/Controller/Board_Create_Controller.java
package Controller;
import java.io.IOException; import java.time.LocalDate; import dao.BoardRepository; import dto.Board; import dto.Member; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; @WebServlet("/BoardWriteForm") public class Board_Create_Controller extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { RequestDispatcher ds = req.getRequestDispatcher("board/writeForm.jsp"); ds.forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(false); Member mb = null; if(session != null) { mb = (Member) session.getAttribute("member"); } String id = mb.getId(); String name = req.getParameter("name"); String subject = req.getParameter("subject"); String content = req.getParameter("content"); String regist_day = LocalDate.now().toString(); int hit = 0; String ip = req.getRemoteAddr(); System.out.println(id); System.out.println(name); System.out.println(subject); System.out.println(content); System.out.println(regist_day); System.out.println(ip); Board bd = new Board(); bd.setId(id); bd.setName(name); bd.setSubject(subject); bd.setContent(content); bd.setRegist_day(regist_day); bd.setHit(hit); bd.setIp(ip); //모델이동 BoardRepository br = BoardRepository.getInstance(); br.addBoard(bd); resp.sendRedirect("BoardListAction?pageNum=1"); } } |
1)@WebServlet("/BoardWriteForm")
list.jsp(location.href = "BoardWriteForm?id=<%=sessionId%>") 연결 매핑
2)doget: board/writeForm.jsp
3)<form name="newWrite" action="BoardWriteForm" : writeForm.jsp
4)dopost 객체 Board bd = new Board(); -> BoardRepository.java: Create -> public void addBoard(Board bd) {}
5)resp.sendRedirect("BoardListAction?pageNum=1");
Board_Read_Controller.java의 Integer.parseInt(req.getParameter("pageNum")); 가져와야 함
*session: 멤버 객체 -> 아공간, DB 갈 필요x
BookMarket_CRUD/src/main/webapp/board/writeForm.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ page session="false" %> <%@ page import="dto.Member" %> <% HttpSession session = request.getSession(false); Member mb = null; if(session != null){ mb = (Member) session.getAttribute("member"); } %> <html> <head> <link rel="stylesheet" href="./resources/css/bootstrap.min.css" /> <title>Board</title> </head> <script type="text/javascript"> function checkForm() { if (!document.newWrite.name.value) { alert("성명을 입력하세요."); return false; } if (!document.newWrite.subject.value) { alert("제목을 입력하세요."); return false; } if (!document.newWrite.content.value) { alert("내용을 입력하세요."); return false; } } </script> <body> <div class="container py-4"> <jsp:include page="../menu.jsp" /> <div class="p-5 mb-4 bg-body-tertiary rounded-3"> <div class="container-fluid py-5"> <h1 class="display-5 fw-bold">게시판</h1> <p class="col-md-8 fs-4">Board</p> </div> </div> <div class="row align-items-md-stretch text-center"> <form name="newWrite" action="BoardWriteForm" method="post" onsubmit="return checkForm()"> <input name="id" type="hidden" class="form-control" value="${sessionId}"> <div class="mb-3 row"> <label class="col-sm-2 control-label" >성명</label> <div class="col-sm-3"> <input name="name" type="text" class="form-control" value="<%=mb.getName() %>" readOnly> </div> </div> <div class="mb-3 row"> <label class="col-sm-2 control-label" >제목</label> <div class="col-sm-5"> <input name="subject" type="text" class="form-control" placeholder="subject"> </div> </div> <div class="mb-3 row"> <label class="col-sm-2 control-label" >내용</label> <div class="col-sm-8"> <textarea name="content" cols="50" rows="5" class="form-control"placeholder="content"></textarea> </div> </div> <div class="mb-3 row"> <div class="col-sm-offset-2 col-sm-10 "> <input type="submit" class="btn btn-primary " value="등록 "> <input type="reset" class="btn btn-primary " value="취소 "> </div> </div> </form> </div> <jsp:include page="../footer.jsp" /> </div> </body> </html> |
*<%@ page session="false" %>
실행 결과
연결 확인
admin
kim ddddd ddddd 2025-02-25 0:0:0:0:0:0:0:1 |
![]() |
![]() |
게시판 상세정보 보기
BookMarket_CRUD/src/main/java/Controller/Board_View_Controller.java
package Controller;
import java.io.IOException; import dao.BoardRepository; import dto.Board; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet("/BoardViewAction") public class Board_View_Controller extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int num = Integer.parseInt(req.getParameter("num")) ; int pageNum = Integer.parseInt(req.getParameter("pageNum")); BoardRepository br = BoardRepository.getInstance(); Board bd=br.getOneList(num); req.setAttribute("board", bd); req.setAttribute("num", num); req.setAttribute("page", pageNum); RequestDispatcher ds = req.getRequestDispatcher("board/view.jsp"); ds.forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } } |
BookMarket_CRUD/src/main/webapp/board/view.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ page import="dto.Board"%> <% //BoardViewAction?num=1&pageNum=1 Board notice = (Board) request.getAttribute("board"); int num = ((Integer) request.getAttribute("num")).intValue(); int nowpage = ((Integer) request.getAttribute("page")).intValue(); %> <html> <head> <link rel="stylesheet" href="./resources/css/bootstrap.min.css" /> <title>Board</title> </head> <body> <div class="container py-4"> <jsp:include page="../menu.jsp" /> <div class="p-5 mb-4 bg-body-tertiary rounded-3"> <div class="container-fluid py-5"> <h1 class="display-5 fw-bold">게시판</h1> <p class="col-md-8 fs-4">Board</p> </div> </div> <div class="row align-items-md-stretch text-center"> <form name="newUpdate" action="BoardUpdateAction.do?num=<%=notice.getNum()%>&pageNum=<%=nowpage%>" method="post"> <div class="mb-3 row"> <label class="col-sm-2 control-label" >성명</label> <div class="col-sm-3"> <input name="name" class="form-control" value=" <%=notice.getName()%>"> </div> </div> <div class="mb-3 row"> <label class="col-sm-2 control-label" >제목</label> <div class="col-sm-5"> <input name="subject" class="form-control" value=" <%=notice.getSubject()%>" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2 control-label" >내용</label> <div class="col-sm-8" style="word-break: break-all;"> <textarea name="content" class="form-control" cols="50" rows="5"> <%=notice.getContent()%></textarea> </div> </div> <div class="mb-3 row"> <div class="col-sm-offset-2 col-sm-10 "> <c:set var="userId" value="<%=notice.getId()%>" /> <c:if test="${sessionId==userId}"> <p> <a href="./BoardDeleteAction.do?num=<%=notice.getNum()%>&pageNum=<%=nowpage%>" class="btn btn-danger"> 삭제</a> <input type="submit" class="btn btn-success" value="수정 "> </c:if> <a href="BoardListAction?pageNum=<%=nowpage%>" class="btn btn-primary"> 목록</a> </div> </div> </form> </div> <jsp:include page="../footer.jsp" /> </div> </body> </html> |
실행 결과
![]() |
*dto -> Repositoty -> Controller 연결 -> view: 뷰 뿌리거나 입력받음(view 가공에 따라 작성시간 달라짐)
DB 연결
'벡엔드 웹프로그래밍 > JSP' 카테고리의 다른 글
JSP 웹프로그래밍 71일차 (25/2/26) (0) | 2025.02.26 |
---|---|
JSP 웹프로그래밍 69일차 (25/2/24) (0) | 2025.02.24 |
JSP 웹프로그래밍 68일차 (25/2/21) (0) | 2025.02.21 |
JSP 웹프로그래밍 67일차 (25/2/20) (2) | 2025.02.20 |
JSP 웹프로그래밍 66일차 (25/2/19) (0) | 2025.02.19 |