벡엔드 웹프로그래밍/JSP

JSP 웹프로그래밍 71일차 (25/2/26)

wkun 2025. 2. 26. 17:59

contents

 

프로젝트 BookMarket 구성도

5.도서목록/상세정보(C/R)

6.도서삭제(D)

7.게시판 삭제(D)

8.도서수정(U)

9.게시판 수정(U)

10.조회수(R/U)

 

----------------------------------------------------------------

 

 

프로젝트 BookMarket 구성도

 

5.도서목록/상세정보(C/R)

 

*순서: 1)books.jsp -> 2) Book_ReadOne_Controller.java -> 3) BookRepository.java

                                            ↓                                        4)<-

                                      5)book.jsp                     

 

BookMarket_CRUD/src/main/webapp/book/books.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.util.*" %>
<%@ page import="dto.Book"%>
<html>
<head>
<link href = "./resources/css/bootstrap.min.css" rel="stylesheet">


<title>도서 목록</title>
</head>
<body>
<%
//전달된 파라미터 수신
ArrayList<Book> arr = (ArrayList<Book>) request.getAttribute("list"); //캐스팅 필수!(부모객체로 변환됨) Controller(read_All)->request에서 담은 주소 가져오기
%>
<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">BookList</p>
</div>
</div>




<div class="row align-items-md-stretch text-center">
<%
for(int i=0; i<arr.size();i++){
Book bk = arr.get(i);
%>
<div class="col-md-4">
<div class="h-100 p-2">
<img src="./resources/images/<%=bk.getFilename()%>" style="width: 250; height:350" />
<h5><b><%=bk.getName()%></b></h5>
<p><%=bk.getAuthor()%>
<br> <%=bk.getPublisher()%> | <%=bk.getReleaseDate()%>
<p> <%=bk.getDescription().substring(0,60)%>....
<p><%=bk.getUnitPrice()%>
<p><a href="read_One?id=<%=bk.getBookId()%>" class="btn btn-secondary" role="button"> 상세 정보 &raquo;</a> </div>
</div>
<%
}
%>
</div>
<jsp:include page="/footer.jsp" />
</div>
</body>
</html>

 

BookMarket_CRUD/src/main/java/Controller/Book_ReadOne_Controller.java

package Controller.Book;


import java.io.IOException;
import java.time.LocalDate;
import java.util.ArrayList;


import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;


import dao.BookRepository;
import dao.MemberRepository;
import dto.Book;
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("/read_One")
public class Book_ReadOne_Controller extends HttpServlet{


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//전처리
String id = req.getParameter("id");

//모델이동
BookRepository br = BookRepository.getInstance();
Book bk = br.getOneBook(id); //Book DTO 하나만 가져옴

//뷰이동
req.setAttribute("book", bk); //bk 주소 book 변수에 담기(request)
RequestDispatcher ds = req.getRequestDispatcher("book/book.jsp"); //book.jsp 이동
ds.forward(req, resp);
}


@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


}


}

 

BookMarket_CRUD/src/main/java/dao/BookRepository.java

package dao;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import dto.Book;




public class BookRepository{
//싱글톤
private static BookRepository br = new BookRepository();
public static BookRepository getInstance(){
return br;
}

private BookRepository() { }

Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
//create
public void addBook(Book bk) {
//데이터베이스에 저장


//데이터베이스 연결
conn = DBConnection.connection();
//쿼리작성및 실행
String sql="insert into book values(?,?,?,?,?,?,?,?,?,?,?)";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,bk.getBookId());
pstmt.setString(2,bk.getName());
pstmt.setInt(3,bk.getUnitPrice());
pstmt.setString(4,bk.getAuthor());
pstmt.setString(5,bk.getDescription());
pstmt.setString(6,bk.getPublisher());
pstmt.setString(7,bk.getCategory());
pstmt.setLong(8,bk.getUnitsInStock());
pstmt.setString(9,bk.getReleaseDate());
pstmt.setString(10,bk.getCondition());
pstmt.setString(11,bk.getFilename());
pstmt.executeUpdate();
}
catch(Exception e) {}
}

//ResultSet 반환 및 변환(read일 경우)

//read_All
public ArrayList<Book> getAllBooks() {
ArrayList<Book> listOfBooks = new ArrayList<Book>();
//데이터 베이스 연결
conn = DBConnection.connection();
//쿼리 작성 및 실행
String sql="select * from book";
try {
pstmt = conn.prepareStatement(sql);
//ResultSet
rs = pstmt.executeQuery();


while(rs.next()) {
Book bk = new Book(); //bk 객체 *3개
bk.setBookId(rs.getString("b_id"));
bk.setName(rs.getString("b_name"));
bk.setUnitPrice(rs.getInt("b_unitPrice"));
bk.setAuthor(rs.getString("b_author"));
bk.setPublisher(rs.getString("b_publisher"));
bk.setReleaseDate(rs.getString("b_releaseDate"));
bk.setDescription(rs.getString("b_description"));
bk.setCategory(rs.getString("b_category"));
bk.setUnitsInStock(rs.getLong("b_unitsInStock"));
bk.setCondition(rs.getString("b_condition"));
bk.setFilename(rs.getString("b_fileName"));


listOfBooks.add(bk); // ArrayList에 저장
}


}
catch(Exception e) {}




return listOfBooks;
}


public Book getOneBook(String id) {
Book bk = new Book();
//데이터 베이스 연결
try {
conn = DBConnection.connection();
//쿼리 작성및 실행
String sql = "select * from book where b_id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
//ResultSet --> DTO로 변환
if(rs.next()) {
bk.setBookId(rs.getString("b_id"));
bk.setName(rs.getString("b_name"));
bk.setUnitPrice(rs.getInt("b_unitPrice"));
bk.setAuthor(rs.getString("b_author"));
bk.setDescription(rs.getString("b_description"));
bk.setPublisher(rs.getString("b_publisher"));
bk.setCategory(rs.getString("b_category"));
bk.setUnitsInStock(rs.getLong("b_unitsInStock"));
bk.setReleaseDate(rs.getString("b_releaseDate"));
bk.setCondition(rs.getString("b_condition"));
bk.setFilename(rs.getString("b_fileName"));
}
}catch(Exception e) {}
return bk;
}
//update

//delete


}

*public Book getOneBook(String id) {

 

sql

USE BookMarketDB;
drop table book;
CREATE TABLE IF NOT EXISTS book(
    b_id VARCHAR(10) NOT NULL,
    b_name VARCHAR(20),
    b_unitPrice  INTEGER,
    b_author VARCHAR(20),
    b_description TEXT,
    b_publisher VARCHAR(20),
b_category VARCHAR(20),
    b_unitsInStock LONG,
    b_releaseDate   VARCHAR(20),
    b_condition VARCHAR(20),
    b_fileName  VARCHAR(20),
    PRIMARY KEY (b_id)
)default CHARSET=utf8;

desc book;


INSERT INTO book VALUES('ISBN1234', 'C# 프로그래밍', 27000, '우재남','C#을 처음 접하는 독자를 대상으로 일대일 수업처럼 자세히 설명한 책이다. 꼭 알아야 할 핵심 개념은 기본 예제로 최대한 쉽게 설명했으며, 중요한 내용은 응용 예제, 퀴즈, 셀프 스터디, 예제 모음으로 한번 더 복습할 수 있다.', '한빛아카데미', 'IT모바일', 1000,  '2022/10/06', 'new', 'ISBN1234.jpg');
INSERT INTO book VALUES('ISBN1235', '자바마스터', 30000, '송미영', '자바를 처음 배우는 학생을 위해 자바의 기본 개념과 실습 예제를 그림을 이용하여 쉽게 설명합니다. 자바의 이론적 개념→기본 예제→프로젝트 순으로 단계별 학습이 가능하며, 각 챕터의 프로젝트를 실습하면서 온라인 서점을 완성할 수 있도록 구성하였습니다.', '한빛아카데미', 'IT모바일',1000, '2023/01/01', 'new', 'ISBN1235.jpg');
INSERT INTO book VALUES('ISBN1236', '파이썬 프로그래밍', 30000, '최성철', '파이썬으로 프로그래밍을 시작하는 입문자가 쉽게 이해할 수 있도록 기본 개념을 상세하게 설명하며, 다양한 예제를 제시합니다. 또한 프로그래밍의 기초 원리를 이해하면서 파이썬으로 데이터를 처리하는 기법도 배웁니다.', '한빛아카데미', 'IT모바일', 1000, '2023/01/01', 'new', 'ISBN1236.jpg');

select * from book;

 

BookMarket_CRUD/src/main/webapp/book/book.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="dto.Book"%>
<%@ page import="dao.BookRepository"%>
<%@ page errorPage = "exceptionNoBookId.jsp"%>


<html>
<head>
<link href = "./resources/css/bootstrap.min.css" rel="stylesheet">
<title>도서 정보</title>
<script type="text/javascript">
function addToCart() {
if (confirm("상품을 장바구니에 추가하시겠습니까?")) {
document.addForm.submit();
} else {
document.addForm.reset();
}
}
</script>


</head>
<body>
<div class="container py-4">
<jsp:include page="/menu.jsp"></jsp:include>


<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">BookInfo</p>
</div>
</div>

<%
Book book = (Book) request.getAttribute("book");
%>
<div class="row align-items-md-stretch">
<div class="col-md-5">
<img src="./resources/images/<%=book.getFilename()%>" style="width: 70%">
</div>
<div class="col-md-6">
<h3><b><%=book.getName()%></b></h3>
<p><%=book.getDescription()%>
<p><b>도서코드 : </b><span class="badge text-bg-danger"> <%=book.getBookId()%></span>
<p><b>저자</b> : <%=book.getAuthor()%>
<p><b>출판사</b> : <%=book.getPublisher()%>
<p><b>출판일</b> : <%=book.getReleaseDate()%>
<p><b>분류</b> : <%=book.getCategory()%>
<p><b>재고수</b> : <%=book.getUnitsInStock()%>
<h4><%=book.getUnitPrice()%></h4>
<p><form name="addForm" action="./addCart.jsp?id=<%=book.getBookId()%>" method="post"><a href="#" class="btn btn-info" onclick="addToCart()"> 도서주문 &raquo;</a>
<a href="./cart.jsp" class="btn btn-warning"> 장바구니 &raquo;</a>
<a href="./books.jsp" class="btn btn-secondary"> 도서목록 &raquo;</a>
</form>
</div>
</div>
<jsp:include page="/footer.jsp"></jsp:include>
</div>
</body>
</html>

* <jsp:include page="/menu.jsp"></jsp:include>/ <jsp:include page="/footer.jsp"></jsp:include>

  <% Book book = (Book) request.getAttribute("book"); %> : (Book)캐스팅

 

실행 결과

 

 

6.도서삭제(D)

 

menu.jsp -> editBook.jsp -> Book_Edit_Controller.java -> BookRepository.java

 

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?edit=update" class = "nav-link" >도서 수정</a></li>
<li class ="nav-item"><a href = "editBook?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>

 

BookMarket_CRUD/src/main/webapp/book/editBook.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.sql.*"%>




<html>
<head>
<link rel ="stylesheet" href ="./resources/css/bootstrap.min.css" />
<title>도서 편집</title>
<script type="text/javascript">
function deleteConfirm(id) {
if (confirm("해당 도서를 삭제합니다!!") == true)
location.href = "editBook?edit=deleteprocess&id="+id;
else
return;
}
</script>


</head>
<%@ page import="java.util.*" %>
<%@ page import="dto.Book" %>
<%
ArrayList<Book> arr = (ArrayList<Book>) request.getAttribute("books");
String edit = request.getParameter("edit");
%>
<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">BookEditing</p>
</div>
</div>

<div class="row align-items-md-stretch text-center">
<%
for(int i=0; i<arr.size();i++){
Book bk = arr.get(i);

%>
<div class="col-md-4">
<div class="h-100 p-2 round-3">
<img src="./resources/images/<%=bk.getFilename()%>" style="width: 250; height:350" />
<p><h5><b><%=bk.getName()%></b></h5>
<p><%=bk.getAuthor()%>
<br> <%=bk.getPublisher()%> | <%=bk.getReleaseDate()%>
<p> <%=bk.getDescription().substring(0,60)%>....
<p><%=bk.getUnitPrice()%>
<p><%
if (edit.equals("update")) {
%>
<a href="./updateBook.jsp?id=<%=bk.getBookId()%>" class="btn btn-success" role="button"> 수정 &raquo;</a>

<%
} else if (edit.equals("delete")) {
%>
<a href="#" onclick="deleteConfirm('<%=bk.getBookId()%>')" class="btn btn-danger" role="button">삭제 &raquo;</a>
<%
}
%>
</div>
</div>
<%
}
%>

</div>
<jsp:include page="/footer.jsp" />
</div>
</body>
</html>

 

BookMarket_CRUD/src/main/java/Controller/Book_Edit_Controller.java

package Controller.Book;


import java.io.IOException;
import java.util.ArrayList;


import dao.BookRepository;
import dto.Book;
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("/editBook")
public class Book_Edit_Controller extends HttpServlet{


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//edit = "update" "delete" "deleteprocess"
String edit = req.getParameter("edit");
String id=null;
RequestDispatcher ds=null;
BookRepository br = BookRepository.getInstance();
ArrayList<Book> ar=null;


if(edit.equals("deleteprocess")) {
id=req.getParameter("id"); //ISBN1234
br.deleteBook(id);
ar = br.getAllBooks();
req.setAttribute("list", ar);
ds = req.getRequestDispatcher("book/books.jsp");
}else {
ar = br.getAllBooks();
req.setAttribute("edit", edit); //생략해도 리퀘스트는 유지됨
req.setAttribute("books", ar);
ds = req.getRequestDispatcher("book/editBook.jsp");
}


ds.forward(req, resp);
}


@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


}


}

 

BookMarket_CRUD/src/main/java/dao/BookRepository.java

package dao;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import dto.Book;




public class BookRepository{
//싱글톤
private static BookRepository br = new BookRepository();
public static BookRepository getInstance(){
return br;
}

private BookRepository() { }

Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
//create
public void addBook(Book bk) {
//데이터베이스에 저장


//데이터베이스 연결
conn = DBConnection.connection();
//쿼리작성및 실행
String sql="insert into book values(?,?,?,?,?,?,?,?,?,?,?)";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,bk.getBookId());
pstmt.setString(2,bk.getName());
pstmt.setInt(3,bk.getUnitPrice());
pstmt.setString(4,bk.getAuthor());
pstmt.setString(5,bk.getDescription());
pstmt.setString(6,bk.getPublisher());
pstmt.setString(7,bk.getCategory());
pstmt.setLong(8,bk.getUnitsInStock());
pstmt.setString(9,bk.getReleaseDate());
pstmt.setString(10,bk.getCondition());
pstmt.setString(11,bk.getFilename());
pstmt.executeUpdate();
}
catch(Exception e) {}
}

//ResultSet 반환 및 변환(read일 경우)

//read_All
public ArrayList<Book> getAllBooks() {
ArrayList<Book> listOfBooks = new ArrayList<Book>();
//데이터 베이스 연결
conn = DBConnection.connection();
//쿼리 작성 및 실행
String sql="select * from book";
try {
pstmt = conn.prepareStatement(sql);
//ResultSet
rs = pstmt.executeQuery();


while(rs.next()) {
Book bk = new Book(); //bk 객체 *3개
bk.setBookId(rs.getString("b_id"));
bk.setName(rs.getString("b_name"));
bk.setUnitPrice(rs.getInt("b_unitPrice"));
bk.setAuthor(rs.getString("b_author"));
bk.setPublisher(rs.getString("b_publisher"));
bk.setReleaseDate(rs.getString("b_releaseDate"));
bk.setDescription(rs.getString("b_description"));
bk.setCategory(rs.getString("b_category"));
bk.setUnitsInStock(rs.getLong("b_unitsInStock"));
bk.setCondition(rs.getString("b_condition"));
bk.setFilename(rs.getString("b_fileName"));


listOfBooks.add(bk); // ArrayList에 저장
}


}
catch(Exception e) {}




return listOfBooks;
}


public Book getOneBook(String id) {
Book bk = new Book();
//데이터 베이스 연결
try {
conn = DBConnection.connection();
//쿼리 작성및 실행
String sql = "select * from book where b_id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
//ResultSet --> DTO로 변환
if(rs.next()) {
bk.setBookId(rs.getString("b_id"));
bk.setName(rs.getString("b_name"));
bk.setUnitPrice(rs.getInt("b_unitPrice"));
bk.setAuthor(rs.getString("b_author"));
bk.setDescription(rs.getString("b_description"));
bk.setPublisher(rs.getString("b_publisher"));
bk.setCategory(rs.getString("b_category"));
bk.setUnitsInStock(rs.getLong("b_unitsInStock"));
bk.setReleaseDate(rs.getString("b_releaseDate"));
bk.setCondition(rs.getString("b_condition"));
bk.setFilename(rs.getString("b_fileName"));
}
}catch(Exception e) {}
return bk;
}
//update

//delete
public void deleteBook(String id) {
try {
conn = DBConnection.connection();
String sql="delete from book where b_id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.executeUpdate();
}catch(Exception e) {}


}


}

 

실행 결과

 

 

7.게시판 삭제(D)

 

view.jsp -> Board_Delete_Controller.java -> BoardRepository.java -> list.jsp

 

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 session="false" %>
<%@ page import="dto.Board"%>
<%@ page import="dto.Member" %>


<% //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();


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>
<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 ">
<%
// mb:멤버객체 notice:보드객체
String mid = mb.getId();
String bid = notice.getId();
if(mid.equals(bid)){


%>
<p>
<a href="BoardDeleteAction?num=<%=notice.getNum()%>&pageNum=<%=nowpage%>" class="btn btn-danger"> 삭제</a>
<input type="submit" class="btn btn-success" value="수정 ">
<%} %>
<a href="BoardListAction?pageNum=<%=nowpage%>" class="btn btn-primary"> 목록</a>
</div>
</div>
</form>


</div>
<jsp:include page="../footer.jsp" />
</div>
</body>
</html>


 

BookMarket_CRUD/src/main/java/Controller/Board_Delete_Controller.java

package Controller.Board;


import java.io.IOException;


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("/BoardDeleteAction")
public class Board_Delete_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();
br.deleteBoard(num);
resp.sendRedirect("BoardListAction?pageNum="+pageNum);
System.out.println("컨트롤러 확인");


}


@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


}


}

 

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
public void deleteBoard(int num) {
try {
conn = DBConnection.connection();
String sql ="delete from board where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.executeUpdate();
}catch(Exception e) {}
}
}

 

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">&laquo;글쓰기</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>

 

실행 결과

 

8.도서수정(U)

*CR

view                     Controller
<a>       ↙              뷰이동
              ↗            /전처리        DTO       Repository
[form]                     모델이동       →              add
                                                   ←
             ↙              뷰이동

 

*U

view       ISBN1234   [Controller: CTUD                                 [
<a> 수정      →          /전처리                  ISBN1234
                    ↙           모델이동                    →
[form      DTO/form     forward: Read       Book(DTO)               getOne()
                               뷰이동   ]                    ← 
                                                                 update                     updateSet()
                                  [/전처리                    DTO
             ]   ↗              모델이동                    →
                                  뷰이동   ]  
                  ↙             Redirect: CUD                                                           ]

 

editBook.jsp -> Book_Update_Controller.java -> updateBook.jsp -> BookRepository.java

 

BookMarket_CRUD/src/main/webapp/book/editBook.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.sql.*"%>




<html>
<head>
<link rel ="stylesheet" href ="./resources/css/bootstrap.min.css" />
<title>도서 편집</title>
<script type="text/javascript">
function deleteConfirm(id) {
if (confirm("해당 도서를 삭제합니다!!") == true)
location.href = "editBook?edit=deleteprocess&id="+id;
else
return;
}
</script>


</head>
<%@ page import="java.util.*" %>
<%@ page import="dto.Book" %>
<%
ArrayList<Book> arr = (ArrayList<Book>) request.getAttribute("books");
String edit = request.getParameter("edit");
%>
<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">BookEditing</p>
</div>
</div>

<div class="row align-items-md-stretch text-center">
<%
for(int i=0; i<arr.size();i++){
Book bk = arr.get(i);

%>
<div class="col-md-4">
<div class="h-100 p-2 round-3">
<img src="./resources/images/<%=bk.getFilename()%>" style="width: 250; height:350" />
<p><h5><b><%=bk.getName()%></b></h5>
<p><%=bk.getAuthor()%>
<br> <%=bk.getPublisher()%> | <%=bk.getReleaseDate()%>
<p> <%=bk.getDescription().substring(0,60)%>....
<p><%=bk.getUnitPrice()%>
<p><%
if (edit.equals("update")) {
%>
<a href="updateBook?id=<%=bk.getBookId()%>" class="btn btn-success" role="button"> 수정 &raquo;</a>

<%
} else if (edit.equals("delete")) {
%>
<a href="#" onclick="deleteConfirm('<%=bk.getBookId()%>')" class="btn btn-danger" role="button">삭제 &raquo;</a>
<%
}
%>
</div>
</div>
<%
}
%>

</div>
<jsp:include page="/footer.jsp" />
</div>
</body>
</html>

 

BookMarket_CRUD/src/main/java/Controller/Book_Update_Controller.java

package Controller.Book;


import java.io.IOException;


import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;


import dao.BookRepository;
import dto.Book;
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("/updateBook")
public class Book_Update_Controller extends HttpServlet{


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");

BookRepository br = BookRepository.getInstance();
Book bk = br.getOneBook(id);

req.setAttribute("book", bk);
RequestDispatcher ds = req.getRequestDispatcher("book/updateBook.jsp");
ds.forward(req, resp);
}


@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String realFolder = req.getServletContext().getRealPath("/resources/images");
int maxSize = 5 * 1024 * 1024; //최대 업로드될 파일의 크기5Mb
String encType = "utf-8"; //인코딩 타입


MultipartRequest multi = new MultipartRequest(req, realFolder, maxSize, encType, new DefaultFileRenamePolicy());


String bookId = multi.getParameter("bookId");
String name = multi.getParameter("name");
String unitPrice = multi.getParameter("unitPrice");
String author = multi.getParameter("author");
String publisher = multi.getParameter("publisher");
String releaseDate = multi.getParameter("releaseDate");
String description = multi.getParameter("description");
String category = multi.getParameter("category");
String unitsInStock = multi.getParameter("unitsInStock");
String condition = multi.getParameter("condition");


String fileName = multi.getFilesystemName("bookImage");

//unitPrice가 문자열이므로 숫자인 price변수를 사용
int price;


if (unitPrice.isEmpty())
price = 0;
else
price = Integer.valueOf(unitPrice);


//unitsInStock 문자열 변수이므로 stock이라는 정수변수를 대체사용
long stock;


if (unitsInStock.isEmpty())
stock = 0;
else
stock = Long.valueOf(unitsInStock);

// 전처리 - 하나의 객체로 묶음
Book bk = new Book();
bk.setBookId(bookId);
bk.setName(name);
bk.setUnitPrice(price);
bk.setAuthor(author);
bk.setPublisher(publisher);
bk.setReleaseDate(releaseDate);
bk.setDescription(description);
bk.setCategory(category);
bk.setUnitsInStock(stock);
bk.setCondition(condition);
bk.setFilename(fileName);

BookRepository br = BookRepository.getInstance();
br.updateBook(bk);

resp.sendRedirect("read_All");


}


}

 

BookMarket_CRUD/src/main/webapp/book/updateBook.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="dto.Book"%>
<html>
<head>
<link rel ="stylesheet" href ="./resources/css/bootstrap.min.css" />
<%
Book bk = (Book) request.getAttribute("book");
%>
<title>도서 수정</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">Book Updating</p>
</div>
</div>
<div class="row align-items-md-stretch">

<div class="col-md-5">
<img src="./resources/images/<%=bk.getFilename()%>" alt="image" style="width: 100%" />
</div>
<div class="col-md-7">
<form name="newBook" action="updateBook" method="post" enctype ="multipart/form-data">


<div class="mb-3 row">
<label class="col-sm-2">도서코드</label>
<div class="col-sm-5">
<input type="text" name="bookId" id="bookId" class="form-control" value='<%=bk.getBookId()%>'>
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2">도서명</label>
<div class="col-sm-5">
<input type="text" name="name" id="name" class="form-control" value='<%=bk.getName()%>'>
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2">가격</label>
<div class="col-sm-5">
<input type="text" name="unitPrice" id="unitPrice"class="form-control" value='<%=bk.getUnitPrice()%>'>
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2">저자</label>
<div class="col-sm-5">
<input type="text" name="author" class="form-control" value='<%=bk.getAuthor()%>'>
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2">출판사</label>
<div class="col-sm-5">
<input type="text" name="publisher" class="form-control" value='<%=bk.getPublisher()%>'>
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2">출판일</label>
<div class="col-sm-5">
<input type="text" name="releaseDate" class="form-control" value='<%=bk.getReleaseDate()%>'>
</div>
</div>

<div class="mb-3 row">
<label class="col-sm-2">상세정보</label>
<div class="col-sm-8">
<textarea name="description" id="description" cols="50" rows="2"
class="form-control" placeholder="100자 이상 적어주세요"><%=bk.getDescription()%></textarea>
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2">분류</label>
<div class="col-sm-5">
<input type="text" name="category" class="form-control" value='<%=bk.getCategory()%>'>
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2">재고수</label>
<div class="col-sm-5">
<input type="text" name="unitsInStock" id="unitsInStock"class="form-control" value='<%=bk.getUnitsInStock()%>'>
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2">상태</label>
<div class="col-sm-8">
<input type="radio" name="condition" value="new " <%if(bk.getCondition().equals("new")){%>checked<%}%>>신규도서
<input type="radio" name="condition" value="old" <%if(bk.getCondition().equals("old")){%>checked<%}%>> 중고도서
<input type="radio" name="condition" value="eBook" <%if(bk.getCondition().equals("eBook")){%>checked<%}%>> E-Book
</div>
</div>

<div class="mb-3 row">
<label class="col-sm-2">이미지</label>
<div class="col-sm-8">
<input type="file" name="bookImage" class="form-control">
</div>
</div>

<div class="mb-3 row">
<div class="col-sm-offset-2 col-sm-10 ">
<input type="submit" class="btn btn-primary" value="등록 " >
</div>
</div>
</form>
</div>
<jsp:include page="/footer.jsp" />
</div>


</body>
</html>

 

BookMarket_CRUD/src/main/java/dao/BookRepository.java

package dao;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import dto.Book;




public class BookRepository{
//싱글톤
private static BookRepository br = new BookRepository();
public static BookRepository getInstance(){
return br;
}

private BookRepository() { }

Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
//create
public void addBook(Book bk) {
//데이터베이스에 저장


//데이터베이스 연결
conn = DBConnection.connection();
//쿼리작성및 실행
String sql="insert into book values(?,?,?,?,?,?,?,?,?,?,?)";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,bk.getBookId());
pstmt.setString(2,bk.getName());
pstmt.setInt(3,bk.getUnitPrice());
pstmt.setString(4,bk.getAuthor());
pstmt.setString(5,bk.getDescription());
pstmt.setString(6,bk.getPublisher());
pstmt.setString(7,bk.getCategory());
pstmt.setLong(8,bk.getUnitsInStock());
pstmt.setString(9,bk.getReleaseDate());
pstmt.setString(10,bk.getCondition());
pstmt.setString(11,bk.getFilename());
pstmt.executeUpdate();
}
catch(Exception e) {}
}

//ResultSet 반환 및 변환(read일 경우)

//read_All
public ArrayList<Book> getAllBooks() {
ArrayList<Book> listOfBooks = new ArrayList<Book>();
//데이터 베이스 연결
conn = DBConnection.connection();
//쿼리 작성 및 실행
String sql="select * from book";
try {
pstmt = conn.prepareStatement(sql);
//ResultSet
rs = pstmt.executeQuery();


while(rs.next()) {
Book bk = new Book(); //bk 객체 *3개
bk.setBookId(rs.getString("b_id"));
bk.setName(rs.getString("b_name"));
bk.setUnitPrice(rs.getInt("b_unitPrice"));
bk.setAuthor(rs.getString("b_author"));
bk.setPublisher(rs.getString("b_publisher"));
bk.setReleaseDate(rs.getString("b_releaseDate"));
bk.setDescription(rs.getString("b_description"));
bk.setCategory(rs.getString("b_category"));
bk.setUnitsInStock(rs.getLong("b_unitsInStock"));
bk.setCondition(rs.getString("b_condition"));
bk.setFilename(rs.getString("b_fileName"));


listOfBooks.add(bk); // ArrayList에 저장
}


}
catch(Exception e) {}




return listOfBooks;
}


public Book getOneBook(String id) {
Book bk = new Book();
//데이터 베이스 연결
try {
conn = DBConnection.connection();
//쿼리 작성및 실행
String sql = "select * from book where b_id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
//ResultSet --> DTO로 변환
if(rs.next()) {
bk.setBookId(rs.getString("b_id"));
bk.setName(rs.getString("b_name"));
bk.setUnitPrice(rs.getInt("b_unitPrice"));
bk.setAuthor(rs.getString("b_author"));
bk.setDescription(rs.getString("b_description"));
bk.setPublisher(rs.getString("b_publisher"));
bk.setCategory(rs.getString("b_category"));
bk.setUnitsInStock(rs.getLong("b_unitsInStock"));
bk.setReleaseDate(rs.getString("b_releaseDate"));
bk.setCondition(rs.getString("b_condition"));
bk.setFilename(rs.getString("b_fileName"));
}
}catch(Exception e) {}
return bk;
}
//update
public void updateBook(Book bk) {

try {
//데이터베이스 연결
String sql=null;
conn = DBConnection.connection();
//쿼리 작성 및 실행
if(bk.getFilename()!=null) {
sql = "UPDATE book SET b_name=?, b_unitPrice=?, b_author=?, b_description=?, b_publisher=?, b_category=?, b_unitsInStock=?, b_releaseDate=?, b_condition=?, b_fileName=? WHERE b_id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, bk.getName());
pstmt.setInt(2, bk.getUnitPrice());
pstmt.setString(3, bk.getAuthor());
pstmt.setString(4, bk.getDescription());
pstmt.setString(5, bk.getPublisher());
pstmt.setString(6, bk.getCategory());
pstmt.setLong(7, bk.getUnitsInStock());
pstmt.setString(8, bk.getReleaseDate());
pstmt.setString(9, bk.getCondition());
pstmt.setString(10, bk.getFilename());
pstmt.setString(11, bk.getBookId());
pstmt.executeUpdate();
}
else
{
sql = "UPDATE book SET b_name=?, b_unitPrice=?, b_author=?, b_description=?, b_publisher=?, b_category=?, b_unitsInStock=?, b_releaseDate=?, b_condition=? WHERE b_id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, bk.getName());
pstmt.setInt(2, bk.getUnitPrice());
pstmt.setString(3, bk.getAuthor());
pstmt.setString(4, bk.getDescription());
pstmt.setString(5, bk.getPublisher());
pstmt.setString(6, bk.getCategory());
pstmt.setLong(7, bk.getUnitsInStock());
pstmt.setString(8, bk.getReleaseDate());
pstmt.setString(9, bk.getCondition());
pstmt.setString(10, bk.getBookId());
pstmt.executeUpdate();
}
}catch(Exception e) {}
}


//delete
public void deleteBook(String id) {
try {
conn = DBConnection.connection();
String sql="delete from book where b_id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.executeUpdate();
}catch(Exception e) {}


}


}

*Controller: resp.sendRedirect("read_All"); -> books.jsp

 

실행 결과

 

 

9.게시판 수정(U)

view.jsp -> Board_Update_Controller.java -> Board.java -> BoardRepository.java

 

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 session="false" %>
<%@ page import="dto.Board"%>
<%@ page import="dto.Member" %>


<% //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();

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>
<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?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 ">
<%
// mb:멤버객체 notice:보드객체
String bid = notice.getId();
if(mb!=null){
String mid = mb.getId();
if(mid.equals(bid)){

%>
<p>
<a href="BoardDeleteAction?num=<%=notice.getNum()%>&pageNum=<%=nowpage%>" class="btn btn-danger"> 삭제</a>
<input type="submit" class="btn btn-success" value="수정 ">
<%}}%>
<a href="BoardListAction?pageNum=<%=nowpage%>" class="btn btn-primary"> 목록</a>
</div>
</div>
</form>

</div>
<jsp:include page="../footer.jsp" />
</div>
</body>
</html>



 

BookMarket_CRUD/src/main/java/Controller/Board_Update_Controller.java

package Controller.Board;


import java.io.IOException;
import java.time.LocalDate;


import dao.BoardRepository;
import dto.Board;
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("/BoardUpdateAction")
public class Board_Update_Controller extends HttpServlet{


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int num = Integer.parseInt(req.getParameter("num"));
int pageNum = Integer.parseInt(req.getParameter("pageNum"));
String name = req.getParameter("name");
String subject = req.getParameter("subject");
String content = req.getParameter("content");
String Rday = LocalDate.now().toString();

Board bd = new Board();
bd.setNum(num);
bd.setName(name);
bd.setSubject(subject);
bd.setContent(content);
bd.setRegist_day(Rday);

BoardRepository br = BoardRepository.getInstance();
br.updateBoard(bd);

resp.sendRedirect("BoardListAction?pageNum="+pageNum);

}


}

 

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 + "]";
}



}

 

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
public void updateBoard(Board bd) {
try {
conn = DBConnection.connection();
String sql = "update board set subject=?, content=? where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, bd.getSubject());
pstmt.setString(2, bd.getContent());
pstmt.setInt(3, bd.getNum());
pstmt.executeUpdate();


}catch(Exception e) {}
}

//Delete
public void deleteBoard(int num) {
try {
conn = DBConnection.connection();
String sql ="delete from board where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.executeUpdate();
}catch(Exception e) {}
}
}

* public void updateBoard(Board bd) {

 

실행 결과

 

 

10.조회수(R/U)

 

BookMarket_CRUD/src/main/java/Controller/Board_View_Controller.java

package Controller.Board;


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();
br.updateHit(num);

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 {


}


}

*br.updateHit(num);

 

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
public void updateBoard(Board bd) {
try {
conn = DBConnection.connection();
String sql = "update board set subject=?, content=? where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, bd.getSubject());
pstmt.setString(2, bd.getContent());
pstmt.setInt(3, bd.getNum());
pstmt.executeUpdate();


}catch(Exception e) {}
}
public void updateHit(int num) {
try {
conn = DBConnection.connection();


//먼저 조회수를 가져와야된다.
String sql = "select hit from board where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();

int hit=0;
if(rs.next()) {
hit = rs.getInt("hit");
hit++; //조회수 증가
}
sql="update board set hit=? where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, hit);
pstmt.setInt(2, num);
pstmt.executeUpdate();

}catch(Exception e) {}

}

//Delete
public void deleteBoard(int num) {
try {
conn = DBConnection.connection();
String sql ="delete from board where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.executeUpdate();
}catch(Exception e) {}
}
}

* public void updateHit(int num) {

 

실행 결과