벡엔드 웹프로그래밍/JSP

JSP 웹프로그래밍 69일차 (25/2/24)

wkun 2025. 2. 24. 17:58

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"> 상세 정보 &raquo;</a> </div>
</div>
<%
}
%>
</div>
<jsp:include page="/footer.jsp" />
</div>
</body>
</html>

 

실행 결과

 

<form:action>

menu.jsp            ->   Controller  ->  Repository      ->  Database table(select)

addmember.jsp              ↓           <- 파라미터 확인 <-

                                 view 반환