contents
프로젝트 BookMarket 구성도
1.로그인/로그아웃(C/R)
2.회원가입(C/R)
3.도서등록(C/R)
---------------------------------------------
1.로그인/로그아웃(C/R)
*CUD: set -> 리턴 타입x(void), 파라미터 가져와야 함
ResultSet(x)
R: get return;
*Create: 1.Connection
2.PreparedStatement
3.ResultSet
* C -> R n개 DTO
R -> U -> R 1개 DTO
D -> R n개 DTO: id만
BookMarket_CRUD/src/main/webapp/welcome.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.Date"%> <html > <head> <link rel ="stylesheet" href ="./resources/css/bootstrap.min.css" /> <title>Welcome</title> </head> <body> <div class="container py-4"> <%@ include file="menu.jsp"%> <%!String greeting = "도서 쇼핑몰에 오신 것을 환영합니다"; String tagline = "Welcome to Web Market!";%> <div class="p-5 mb-4 bg-body-tertiary rounded-3"> <div class="container-fluid py-5"> <h1 class="display-5 fw-bold"><%=greeting%></h1> <p class="col-md-8 fs-4">BookMarket</p> </div> </div> <div class="row align-items-md-stretch text-center"> <div class="col-md-12"> <div class="h-100 p-5"> <h3><%=tagline%></h3> <% //response.setIntHeader("Refresh", 5); Date day = new java.util.Date(); String am_pm; int hour = day.getHours(); int minute = day.getMinutes(); int second = day.getSeconds(); if (hour / 12 == 0) { am_pm = "AM"; } else { am_pm = "PM"; hour = hour - 12; } String CT = hour + ":" + minute + ":" + second + " " + am_pm; out.println("현재 접속 시각: " + CT + "\n"); %> </div> </div> </div> <%@ include file="footer.jsp"%> </div> </body> </html> |
BookMarket_CRUD/src/main/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" id="WebApp_ID" version="5.0"> <display-name>BookMarket_CRUD</display-name> <welcome-file-list> <welcome-file>welcome.jsp</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.jsp</welcome-file> <welcome-file>default.htm</welcome-file> </welcome-file-list> </web-app> |
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" %> <% Member 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="<c:url value="/books.jsp"/>" class="nav-link" >도서 목록</a></li> <li class ="nav-item"><a href = "addBook" class = "nav-link" >도서 등록</a></li> <li class ="nav-item"><a href = "<c:url value="/editBook.jsp?edit=update"/>" class = "nav-link" >도서 수정</a></li> <li class ="nav-item"><a href = "<c:url value="/editBook.jsp?edit=delete"/>" class = "nav-link" >도서 삭제</a></li> <li class ="nav-item"><a href = "<c:url value ="/BoardListAction.do?pageNum=1"/>" class = "nav-link" >게시판</a></li> </ul> </div> </div> </header> |
실행 결과
![]() |
BookMarket_CRUD/src/main/java/Controller/Member_Read_Controller.java
package Controller;
import java.io.IOException; import dao.MemberRepository; 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("/login") public class Member_Read_Controller extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //전처리 : 전달된 파라미터를 수신(Request에 존재하는) //모델이동 : 데이터를 삽입 or 데이터를 가져옴 //뷰이동 : 파라미터를 가지고 혹은 안가지고 // 뷰페이지로 이동하여 클라이언트에게 전송(Response) RequestDispatcher ds = req.getRequestDispatcher("member/loginMember.jsp"); ds.forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //전처리 : id, password를 수신해야됨 name='id' name='password' String id=req.getParameter("id"); String password=req.getParameter("password"); System.out.println(id); System.out.println(password); //모델이동 : 데이터를 삽입 or 데이터를 가져옴 MemberRepository mr = MemberRepository.getInstance(); Member mb = mr.loginprocess(id, password); //뷰이동 HttpSession session = req.getSession(true); session.setAttribute("member", mb); resp.sendRedirect("/BookMarket_CRUD"); } } |
BookMarket_CRUD/src/main/webapp/member/loginMember.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<html> <head> <link rel="stylesheet" href="resources/css/bootstrap.min.css" /> <title>Login</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">Membership Login</p> </div> </div> <div class="container" align="center"> <div class="col-md-4 col-md-offset-4"> <h3 class="form-signin-heading">Please sign in</h3> <% String error = request.getParameter("error"); if (error != null) { out.println("<div class='alert alert-danger'>"); out.println("아이디와 비밀번호를 확인해 주세요"); out.println("</div>"); } %> <form class="form-signin" action="login" method="post"> <div class="form-floating mb-3 row"> <input type="text" class="form-control" name='id' id="floatingInput" placeholder="ID" required autofocus> <label for="floatingInput">ID</label> </div> <div class="form-floating mb-3 row"> <input type="password" class="form-control" name='password' placeholder="Password"> <label for="floatingPassword">Password</label> </div> <button class="btn btn btn-lg btn-success btn-block" type="submit">로그인</button> </form> </div> </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 private ArrayList<Book> listOfBooks = new ArrayList<Book>(); public ArrayList<Book> getAllBooks() { return listOfBooks; } //update //delete public Book getBookById(String bookId) { Book bookById = null; for (int i = 0; i < listOfBooks.size(); i++) { Book book = listOfBooks.get(i); if (book != null && book.getBookId() != null && book.getBookId().equals(bookId)) { bookById = book; break; } } return bookById; } } |
BookMarket_CRUD/src/main/java/dao/MemberRepository.java
package dao;
import java.sql.*; import dto.Member; public class MemberRepository { //멤버 정보를 CRUD하는 클래스 <--> 데이터베이스 private static MemberRepository mr = new MemberRepository(); public static MemberRepository getInstance() { return mr; } private MemberRepository() { } Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; //DataBase 연결 public Connection DBconnection() { String url = "jdbc:mysql://localhost:3306/bookmarketdb"; String user = "root"; String password = "1234"; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, user, password); } catch (Exception e) { System.out.println("데이터베이스연결실패"); e.printStackTrace(); } return conn; } //Create public void addmember(Member mb) { //데이터베이스연결 conn = DBconnection(); //쿼리작성 String sql="insert into member values(?,?,?,?,?,?,?,?,?);"; //쿼리실행 try { pstmt = conn.prepareStatement(sql); pstmt.setString(1,mb.getId()); pstmt.setString(2,mb.getPassword()); pstmt.setString(3,mb.getName()); pstmt.setString(4,mb.getGender()); pstmt.setString(5,mb.getBirth()); pstmt.setString(6,mb.getMail()); pstmt.setString(7,mb.getPhone()); pstmt.setString(8,mb.getAddress()); pstmt.setString(9,mb.getRegist_day()); pstmt.executeUpdate(); } catch(Exception e) {} } //Read public Member loginprocess(String id, String password) { //데이터베이스연결 conn = DBconnection(); //쿼리전송 Member mb=null; try { String sql="select * from Member where id=? and password=?"; pstmt = conn.prepareStatement(sql); pstmt.setString(1,id); pstmt.setString(2,password); rs = pstmt.executeQuery(); //데이터리턴 : ResultSet --> DTO if(rs.next()) { String rid = rs.getString("id"); String rpw = rs.getString("password"); String rname = rs.getString("name"); String rgender = rs.getString("gender"); String rbirth = rs.getString("birth"); String rmail = rs.getString("mail"); String rphone = rs.getString("phone"); String raddress = rs.getString("address"); String rregist_day = rs.getString("regist_day"); mb = new Member(); mb.setId(rid); mb.setPassword(rpw); mb.setName(rname); mb.setGender(rgender); mb.setBirth(rbirth); mb.setMail(rmail); mb.setPhone(rphone); mb.setAddress(raddress); mb.setRegist_day(rregist_day); } } catch(Exception e) {} return mb; } //Update //Delete } |
Database table:
MySQL Workbench/sql
USE BookMarketDB; drop table Member; create table Member ( id varchar(10) not null, password varchar(10) not null, name varchar(10) not null, gender varchar(4), birth varchar(10), mail varchar(30), phone varchar(20), address varchar(90), regist_day varchar(50), primary key(id) ) default CHARSET=utf8; select * from Member; insert into Member values("admin","1234","kim","man","20250101","abc@gmail.com","01012341234","busan","2025-01-01"); |
BookMarket_CRUD/src/main/java/dto/Member.java
package dto;
public class Member { String id; String password; String name; String gender; String birth; String mail; String phone; String address; String regist_day; public Member(String id, String password, String name, String gender, String birth, String mail, String phone, String address, String regist_day) { super(); this.id = id; this.password = password; this.name = name; this.gender = gender; this.birth = birth; this.mail = mail; this.phone = phone; this.address = address; this.regist_day = regist_day; } public Member() { } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getBirth() { return birth; } public void setBirth(String birth) { this.birth = birth; } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getRegist_day() { return regist_day; } public void setRegist_day(String regist_day) { this.regist_day = regist_day; } @Override public String toString() { return "Member [id=" + id + ", password=" + password + ", name=" + name + ", gender=" + gender + ", birth=" + birth + ", mail=" + mail + ", phone=" + phone + ", address=" + address + ", regist_day=" + regist_day + "]"; } } |
BookMarket_CRUD/src/main/java/Controller/Member_logout_Controller.java
package Controller;
import java.io.IOException; import dao.MemberRepository; 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("/logout") public class Member_logout_Controller extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //전처리 : 전달된 파라미터를 수신(Request에 존재하는) //모델이동 : 데이터를 삽입 or 데이터를 가져옴 //뷰이동 : 파라미터를 가지고 혹은 안가지고 // 뷰페이지로 이동하여 클라이언트에게 전송(Response) HttpSession session = req.getSession(false); session.invalidate(); resp.sendRedirect("/BookMarket_CRUD"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } } |
실행 결과
![]() |
2.회원가입(C/R)
BookMarket_CRUD/src/main/webapp/member/addMember.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <link rel="stylesheet" href="resources/css/bootstrap.min.css" /> <script type="text/javascript"> function checkForm() { if (!document.newMember.id.value) { alert("아이디를 입력하세요."); return false; } if (!document.newMember.password.value) { alert("비밀번호를 입력하세요."); return false; } if (document.newMember.password.value != document.newMember.password_confirm.value) { alert("비밀번호를 동일하게 입력하세요."); return false; } } </script> <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">Membership Joining</p> </div> </div> <div class="row align-items-md-stretch text-center"> <form name="newMember" action="addmember" method="post" onsubmit="return checkForm()"> <div class="mb-3 row"> <label class="col-sm-2 ">아이디</label> <div class="col-sm-3"> <input name="id" type="text" class="form-control" placeholder="id" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2">비밀번호</label> <div class="col-sm-3"> <input name="password" type="text" class="form-control" placeholder="password" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2">비밀번호확인</label> <div class="col-sm-3"> <input name="password_confirm" type="text" class="form-control" placeholder="password confirm" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2">성명</label> <div class="col-sm-3"> <input name="name" type="text" class="form-control" placeholder="name" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2">성별</label> <div class="col-sm-2"> <input name="gender" type="radio" value="남" /> 남 <input name="gender" type="radio" value="여" /> 여 </div> </div> <div class="mb-3 row"> <label class="col-sm-2">생일</label> <div class="col-sm-10 "> <div class="row"> <div class="col-sm-2"> <input type="text" name="birthyy" maxlength="4" class="form-control" placeholder="년(4자)" size="6"> </div> <div class="col-sm-2"> <select name="birthmm" class="form-select"> <option value="">월</option> <option value="01">1</option> <option value="02">2</option> <option value="03">3</option> <option value="04">4</option> <option value="05">5</option> <option value="06">6</option> <option value="07">7</option> <option value="08">8</option> <option value="09">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> </select> </div> <div class="col-sm-2"> <input type="text" name="birthdd" maxlength="2" class="form-control" placeholder="일" size="4"> </div> </div> </div> </div> <div class="mb-3 row"> <label class="col-sm-2">이메일</label> <div class="col-sm-10"> <div class="row"> <div class="col-sm-4"> <input type="text" name="mail1" maxlength="50" class="form-control" placeholder="email"> </div> @ <div class="col-sm-3"> <select name="mail2" class="form-select"> <option>naver.com</option> <option>daum.net</option> <option>gmail.com</option> <option>nate.com</option> </select> </div> </div> </div> </div> <div class="mb-3 row"> <label class="col-sm-2">전화번호</label> <div class="col-sm-3"> <input name="phone" type="text" class="form-control" placeholder="phone" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2 ">주소</label> <div class="col-sm-5"> <input name="address" type="text" class="form-control" placeholder="address"> </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="취소 " onclick="reset()" > </div> </div> </form> </div> <jsp:include page="/footer.jsp" /> </div> </body> </html> |
BookMarket_CRUD/src/main/java/Controller/Member_addmember_Controller.java
package Controller;
import java.io.IOException; import java.time.LocalDate; import dao.MemberRepository; 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("/addmember") public class Member_addmember_Controller extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //전처리 : 전달된 파라미터를 수신(Request에 존재하는) //모델이동 : 데이터를 삽입 or 데이터를 가져옴 //뷰이동 : 파라미터를 가지고 혹은 안가지고 // 뷰페이지로 이동하여 클라이언트에게 전송(Response) RequestDispatcher ds = req.getRequestDispatcher("member/addMember.jsp"); ds.forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String id = req.getParameter("id"); String password = req.getParameter("password"); String name = req.getParameter("name"); String gender = req.getParameter("gender"); String birthyy = req.getParameter("birthyy"); String birthmm = req.getParameter("birthmm"); String birthdd = req.getParameter("birthdd"); String birth = birthyy+"-"+birthmm+"-"+birthdd; String mail1 = req.getParameter("mail1"); String mail2 = req.getParameter("mail2"); String mail = mail1+"@"+mail2; String phone = req.getParameter("phone"); String address = req.getParameter("address"); String regist_day = LocalDate.now().toString(); System.out.println(regist_day); Member mb = new Member(); mb.setId(id); mb.setPassword(password); mb.setName(name); mb.setGender(gender); mb.setBirth(birth); mb.setMail(mail); mb.setPhone(phone); mb.setAddress(address); mb.setRegist_day(regist_day); MemberRepository mr = MemberRepository.getInstance(); mr.addmember(mb); //resp.sendRedirect("/BookMarket_CRUD"); resp.sendRedirect("login"); } } |
실행 결과
![]() |
싱글톤:
BookMarket_CRUD/src/main/java/dao/MemberRepository.java
package dao;
import java.sql.*; import dto.Member; public class MemberRepository { //멤버 정보를 CRUD하는 클래스 <--> 데이터베이스 private static MemberRepository mr = new MemberRepository(); public static MemberRepository getInstance() { return mr; } private MemberRepository() { } Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; //DataBase 연결 //Create public void addmember(Member mb) { //데이터베이스연결 conn = DBConnection.connection(); //쿼리작성 String sql="insert into member values(?,?,?,?,?,?,?,?,?)"; //쿼리실행 try { pstmt = conn.prepareStatement(sql); pstmt.setString(1,mb.getId()); pstmt.setString(2,mb.getPassword()); pstmt.setString(3,mb.getName()); pstmt.setString(4,mb.getGender()); pstmt.setString(5,mb.getBirth()); pstmt.setString(6,mb.getMail()); pstmt.setString(7,mb.getPhone()); pstmt.setString(8,mb.getAddress()); pstmt.setString(9,mb.getRegist_day()); pstmt.executeUpdate(); } catch(Exception e) {} } //Read public Member loginprocess(String id, String password) { //데이터베이스연결 conn = DBConnection.connection(); //쿼리전송 Member mb=null; try { String sql="select * from Member where id=? and password=?"; pstmt = conn.prepareStatement(sql); pstmt.setString(1,id); pstmt.setString(2,password); rs = pstmt.executeQuery(); //데이터리턴 : ResultSet --> DTO if(rs.next()) { String rid = rs.getString("id"); String rpw = rs.getString("password"); String rname = rs.getString("name"); String rgender = rs.getString("gender"); String rbirth = rs.getString("birth"); String rmail = rs.getString("mail"); String rphone = rs.getString("phone"); String raddress = rs.getString("address"); String rregist_day = rs.getString("regist_day"); mb = new Member(); mb.setId(rid); mb.setPassword(rpw); mb.setName(rname); mb.setGender(rgender); mb.setBirth(rbirth); mb.setMail(rmail); mb.setPhone(rphone); mb.setAddress(raddress); mb.setRegist_day(rregist_day); } } catch(Exception e) {} return mb; } //Update //Delete } |
실행 결과
![]() |
![]() |
3.도서등록(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" %> <% Member 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 = "<c:url value="/editBook.jsp?edit=update"/>" class = "nav-link" >도서 수정</a></li> <li class ="nav-item"><a href = "<c:url value="/editBook.jsp?edit=delete"/>" class = "nav-link" >도서 삭제</a></li> <li class ="nav-item"><a href = "<c:url value ="/BoardListAction.do?pageNum=1"/>" class = "nav-link" >게시판</a></li> </ul> </div> </div> </header> |
BookMarket_CRUD/src/main/java/Controller/Book_create_Controller.java
package Controller;
import java.io.IOException; import java.time.LocalDate; 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("/addBook") public class Book_create_Controller extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { RequestDispatcher ds = req.getRequestDispatcher("book/addBook.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.addBook(bk); resp.sendRedirect("read_All"); } } |
BookMarket_CRUD/src/main/webapp/addBook.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <html> <head> <link rel ="stylesheet" href ="resources/css/bootstrap.min.css" /> <script type="text/javascript" src="resources/js/validation.js"></script> <title>도서 등록</title> </head> <body> <fmt:setLocale value='<%= request.getParameter("language") %>'/> <fmt:bundle basename="bundle.message" > <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"><fmt:message key="title" /></h1> <p class="col-md-8 fs-4">Book Addition</p> </div> </div> <div class="row align-items-md-stretch"> <div class="text-end"> <a href="?language=ko" >Korean</a> | <a href="?language=en" >English</a> <a href = "logout.jsp" class ="btn btn-sm btn-success pull right">logout</a> </div> <form name="newBook" action="addBook" method="post" enctype ="multipart/form-data"> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="bookId" /></label> <div class="col-sm-3"> <input type="text" name="bookId" id="bookId" class="form-control" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="name" /></label> <div class="col-sm-3"> <input type="text" name="name" id="name" class="form-control" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="unitPrice" /></label> <div class="col-sm-3"> <input type="text" name="unitPrice" id="unitPrice" class="form-control" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="author" /></label> <div class="col-sm-3"> <input type="text" name="author" class="form-control"> </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="publisher" /></label> <div class="col-sm-3"> <input type="text" name="publisher" class="form-control"> </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="releaseDate" /></label> <div class="col-sm-3"> <input type="text" name="releaseDate" class="form-control"> </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="description" /></label> <div class="col-sm-5"> <textarea name="description" id="description" cols="50" rows="2" class="form-control" placeholder="100자 이상 적어주세요"></textarea> </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="category" /></label> <div class="col-sm-3"> <input type="text" name="category" class="form-control" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="unitsInStock" /></label> <div class="col-sm-3"> <input type="text" name="unitsInStock" 1 id = "unitsInStock" class="form-control" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="condition" /></label> <div class="col-sm-5"> <input type="radio" name="condition" value="new " ><fmt:message key="condition_New" /> <input type="radio" name="condition" value="old" > <fmt:message key="condition_Old" /> <input type="radio" name="condition" value="eBook" ><fmt:message key="condition_Ebook" /> </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="bookImage" /></label> <div class="col-sm-5"> <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="button" class="btn btn-primary" value="<fmt:message key="button" />" onclick="CheckAddBook()"> </div> </div> </form> </div> <jsp:include page="/footer.jsp" /> </div> </fmt:bundle> </body> </html> |
* action="addBook"
BookMarket_CRUD/src/main/java/bundle/message.properties
title = \uB3C4\uC11C \uB4F1\uB85D
bookId = \uB3C4\uC11C\uCF54\uB4DC name = \uB3C4\uC11C\uBA85 unitPrice =\uAC00\uACA9 author = \uC800\uC790 publisher = \uCD9C\uD310\uC0AC releaseDate = \uCD9C\uD310\uC77C description = \uC0C1\uC138\uC815\uBCF4 category = \uBD84\uB958 unitsInStock = \uC7AC\uACE0\uC218 condition =\uC0C1\uD0DC condition_New = \uC2E0\uADDC\uB3C4\uC11C condition_Old = \uC911\uACE0\uB3C4\uC11C condition_Ebook = E-Book bookImage = \uC774\uBBF8\uC9C0 button = \uB4F1\uB85D |
BookMarket_CRUD/src/main/java/bundle/message_en.properties
title = Book Addition
bookId = Book ID name = Name unitPrice =Unit Price author = Author publisher = Publisher releaseDate = ReleaseDate description = Description category = Category unitsInStock = UnitsInStock condition =Condition condition_New = New condition_Old = Old condition_Ebook = E-Book bookImage = Image button = Insert |
BookMarket_CRUD/src/main/webapp/book/addBook.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <html> <head> <link rel ="stylesheet" href ="resources/css/bootstrap.min.css" /> <script type="text/javascript" src="resources/js/validation.js"></script> <title>도서 등록</title> </head> <body> <fmt:setLocale value='<%= request.getParameter("language") %>'/> <fmt:bundle basename="bundle.message" > <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"><fmt:message key="title" /></h1> <p class="col-md-8 fs-4">Book Addition</p> </div> </div> <div class="row align-items-md-stretch"> <div class="text-end"> <a href="?language=ko" >Korean</a> | <a href="?language=en" >English</a> <a href = "logout.jsp" class ="btn btn-sm btn-success pull right">logout</a> </div> <form name="newBook" action="addBook" method="post" enctype ="multipart/form-data"> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="bookId" /></label> <div class="col-sm-3"> <input type="text" name="bookId" id="bookId" class="form-control" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="name" /></label> <div class="col-sm-3"> <input type="text" name="name" id="name" class="form-control" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="unitPrice" /></label> <div class="col-sm-3"> <input type="text" name="unitPrice" id="unitPrice" class="form-control" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="author" /></label> <div class="col-sm-3"> <input type="text" name="author" class="form-control"> </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="publisher" /></label> <div class="col-sm-3"> <input type="text" name="publisher" class="form-control"> </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="releaseDate" /></label> <div class="col-sm-3"> <input type="text" name="releaseDate" class="form-control"> </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="description" /></label> <div class="col-sm-5"> <textarea name="description" id="description" cols="50" rows="2" class="form-control" placeholder="100자 이상 적어주세요"></textarea> </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="category" /></label> <div class="col-sm-3"> <input type="text" name="category" class="form-control" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="unitsInStock" /></label> <div class="col-sm-3"> <input type="text" name="unitsInStock" 1 id = "unitsInStock" class="form-control" > </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="condition" /></label> <div class="col-sm-5"> <input type="radio" name="condition" value="New " ><fmt:message key="condition_New" /> <input type="radio" name="condition" value="Old" > <fmt:message key="condition_Old" /> <input type="radio" name="condition" value="EBook" ><fmt:message key="condition_Ebook" /> </div> </div> <div class="mb-3 row"> <label class="col-sm-2"><fmt:message key="bookImage" /></label> <div class="col-sm-5"> <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="button" class="btn btn-primary" value="<fmt:message key="button" />" onclick="CheckAddBook()"> </div> </div> </form> </div> <jsp:include page="/footer.jsp" /> </div> </fmt:bundle> </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.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); } } catch(Exception e) {} return listOfBooks; } //update //delete } |
Database table:
MySQL Workbench/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/java/dao/MemberRepositoty.java
package dao;
import java.sql.*; import dto.Member; public class MemberRepository { //멤버 정보를 CRUD하는 클래스 <--> 데이터베이스 private static MemberRepository mr = new MemberRepository(); public static MemberRepository getInstance() { return mr; } private MemberRepository() { } Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; //DataBase 연결 //Create public void addmember(Member mb) { //데이터베이스연결 conn = DBConnection.connection(); //쿼리작성 String sql="insert into member values(?,?,?,?,?,?,?,?,?)"; //쿼리실행 try { pstmt = conn.prepareStatement(sql); pstmt.setString(1,mb.getId()); pstmt.setString(2,mb.getPassword()); pstmt.setString(3,mb.getName()); pstmt.setString(4,mb.getGender()); pstmt.setString(5,mb.getBirth()); pstmt.setString(6,mb.getMail()); pstmt.setString(7,mb.getPhone()); pstmt.setString(8,mb.getAddress()); pstmt.setString(9,mb.getRegist_day()); pstmt.executeUpdate(); } catch(Exception e) {} } //Read public Member loginprocess(String id, String password) { //데이터베이스연결 conn = DBConnection.connection(); //쿼리전송 Member mb=null; try { String sql="select * from Member where id=? and password=?"; pstmt = conn.prepareStatement(sql); pstmt.setString(1,id); pstmt.setString(2,password); rs = pstmt.executeQuery(); //데이터리턴 : ResultSet --> DTO if(rs.next()) { String rid = rs.getString("id"); String rpw = rs.getString("password"); String rname = rs.getString("name"); String rgender = rs.getString("gender"); String rbirth = rs.getString("birth"); String rmail = rs.getString("mail"); String rphone = rs.getString("phone"); String raddress = rs.getString("address"); String rregist_day = rs.getString("regist_day"); mb = new Member(); mb.setId(rid); mb.setPassword(rpw); mb.setName(rname); mb.setGender(rgender); mb.setBirth(rbirth); mb.setMail(rmail); mb.setPhone(rphone); mb.setAddress(raddress); mb.setRegist_day(rregist_day); } } catch(Exception e) {} return mb; } //Update //Delete } |
공통클래스
BookMarket_CRUD/src/main/java/dao/DBConnection.java
package dao;
import java.sql.Connection; import java.sql.DriverManager; public class DBConnection { public static Connection connection() { Connection conn= null; String url = "jdbc:mysql://localhost:3306/bookmarketdb"; String user = "root"; String password = "1234"; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, user, password); } catch (Exception e) { System.out.println("데이터베이스연결실패"); e.printStackTrace(); } return conn; } } |
BookMarket_CRUD/src/main/java/Controller/Book_ReadAll_controller.java
package Controller;
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_All") public class Book_ReadAll_Controller extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //전처리 : 아무것도 가져오지 않았음 //모델이동 BookRepository br = BookRepository.getInstance(); ArrayList<Book> arr = br.getAllBooks(); //뷰이동 req.setAttribute("list", arr); RequestDispatcher ds = req.getRequestDispatcher("book/books.jsp"); ds.forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } } |
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"); %> <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="./book.jsp?id=<%=bk.getBookId()%>" class="btn btn-secondary" role="button"> 상세 정보 »</a> </div> </div> <% } %> </div> <jsp:include page="/footer.jsp" /> </div> </body> </html> |
실행 결과
![]() |
<form:action>
menu.jsp -> Controller -> Repository -> Database table(select)
addmember.jsp ↓ <- 파라미터 확인 <-
view 반환
'벡엔드 웹프로그래밍 > JSP' 카테고리의 다른 글
JSP 웹프로그래밍 71일차 (25/2/26) (0) | 2025.02.26 |
---|---|
JSP 웹프로그래밍 70일차 (25/2/25) (0) | 2025.02.25 |
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 |