티스토리 뷰
데이터베이스 연동
데이터 삽입, 수정, 삭제
CRUD 메서드를 사용해 신규 도서 삽입하기
BookRepositoryImpl.java //수정
public void setNewBook(Book book) {
// TODO Auto-generated method stub
String SQL = "INSERT INTO book (b_bookId, b_name, b_unitPrice, b_author,"
+ "b_description, b_publisher, b_category, b_unitsInStock, b_releaseDate,"
+ "b_condition, b_fileNmae" + "VALUES(?,?,?,?,?,?,?,?,?,?,?)";
template.update(SQL, book.getBookId(),book.getName(),book.getUnitPrice(),
book.getAuthor(), book.getDescription(), book.getPublisher(), book.getCategory(),
book.getUnitsInStock(),book.getReleaseDate(),book.getCondition(),book.getFileName());
}
BookController.java
@PostMapping("/add")
public String submitAddNewBook(@Valid @ModelAttribute("NewBook") Book book, BindingResult result, HttpServletRequest request)
{
if(result.hasErrors())
{
return "addBook";
}
MultipartFile bookImage = book.getBookImage();
String saveName = bookImage.getOriginalFilename();
String save = request.getSession().getServletContext().getRealPath("/resources/images");
File saveFile = new File(save, saveName);
if(bookImage !=null && !bookImage.isEmpty())
try {
bookImage.transferTo(saveFile);
//추가 구문
book.setFileName(saveName);
}
catch(Exception e)
{
throw new RuntimeException("도서 이미지 업로드가 실패하였습니다.", e);
}
bookService.setNewBook(book);
return "redirect:/books";
}
addBook.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!-- Chpater12 다국어 처리 태그 추가 -->
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<link href="<c:url value="/resources/css/bootstrap.min.css"/>" rel="stylesheet">
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
//삭제구문..
<div class="float-right" style="padding-right:30px">
<a href="?language=ko">Korean</a>|<a href="?language=en">English</a>
</div>
<br><br>
<form:form modelAttribute="NewBook"
action="./add?${_csrf.parameterName}=${_csrf.token}" class="form-horizontal"
enctype="multipart/form-data">
<fieldset>
<%-- <legend><spring:message code="addBook.form.title.label" /></legend> --%>
<legend>
<spring:message code="addBook.form.subtitle.label" />
</legend>
<div class="form-group row">
<label class="col-sm-2 control-label">
<spring:message code="addBook.form.bookId.label" />
</label>
<div class="col-sm-3">
<form:input path="bookId" class="form-control"/>
</div>
<div class="col-sm-6">
<form:errors path="bookId" cssClass="text-danger"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">
<spring:message code="addBook.form.name.label" />
</label>
<div class="col-sm-3">
<form:input path="name" class="form-control" />
</div>
<div class="col-sm-6">
<form:errors path="name" cssClass="text-danger"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">
<spring:message code="addBook.form.unitPrice.label" />
</label>
<div class="col-sm-3">
<form:input path="unitPrice" class="form-control"/>
</div>
<div class="col-sm-6">
<form:errors path="unitPrice" cssClass="text-danger"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">
<spring:message code="addBook.form.author.label" />
</label>
<div class="col-sm-3">
<form:input path="author" class="form-control"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">
<spring:message code="addBook.form.description.label" />
</label>
<div class="col-sm-5">
<form:input path="description" cols="50" rows="2"
class="form-control"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">
<spring:message code="addBook.form.publisher.label" />
</label>
<div class="col-sm-3">
<form:input path="publisher" class="form-control"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">
<spring:message code="addBook.form.category.label" />
</label>
<div class="col-sm-3">
<form:input path="category" class="form-control"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">
<spring:message code="addBook.form.unitsInStock.label" />
</label>
<div class="col-sm-3">
<form:input path="unitsInStock" class="form-control"/>
</div>
<div class="col-sm-6">
<form:input path="unitsInStock" cssClass="text-danger"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">
<spring:message code="addBook.form.releaseDate.label" />
</label>
<div class="col-sm-3">
<form:input path="releaseDate" class="form-control"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">
<spring:message code="addBook.form.condition.label" />
</label>
<div class="col-sm-3">
<form:radiobutton path="condition" value="New"/>New
<form:radiobutton path="condition" value="Old"/>Old
<form:radiobutton path="condition" value="E-Book"/>E-Book
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">
<spring:message code="addBook.form.bookImage.label" />
</label>
<div class="col-sm-7">
<form:input path="bookImage" type="file" class="form-contorl" />
</div>
</div>
<div class="form-group row">
<div class="col-sm-offset-2 col-sm-10">
<input type="submit" class="btn btn-primary" value="등록"/>
<!-- Chapter12 다국어처리 추가 -->
<spring:message code="addBook.form.button.label" />
</div>
</div>
</fieldset>
</form:form>
</div>
</body>
</html>
pom.xml
<properties>
<security-version>5.6.3</security-version>
</properties>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${security-version}</version>
</dependency>
menu.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<nav class = "navbar navbar-expand navbar-dark bg-dark">
<div class= "container">
<div class = "navbar-header">
<a class="navbar-brand" href="${pageContext.request.contextPath}/home">Book Market</a>
</div>
<div>
<ul class="navbar-nav mr-auto">
<li class="nav-item"><a class="nav-link" href="<c:url value="/home"/>">Home</a></li>
<li class="nav-item"><a class="nav-link" href="<c:url value="/books"/>">Books</a></li>
<li class="nav-item"><a class="nav-link" href="<c:url value="/books/add"/>">Add Book</a></li>
<li class="nav-item"><a class="nav-link" href="<c:url value="/cart/"/>">Cart</a></li>
//추가구문
<li class="nav-item">
<sec:authorize access="isAuthenticated()">
<form:form action="${pageContext.request.contextPath }/logout" method="POST">
<input type="submit" class="btn btn-success" value="Logout"/>
</form:form>
</sec:authorize>
</li>
<li class="nav-item">
<sec:authorize access="!isAuthenticated()">
<a class="nav-link" href="<c:url value="/login" />">Login</a>
</sec:authorize>
</li>
//
</ul>
</div>
</div>
</nav>
</body>
</html>
CRUD 메서드를 사용하여 도서 정보 수정하기
BookRepository.java 인터페이스에 도서 정보를 수정하는 메서드를 추가합니다.
void setUpdateBook(Book book);
BookRepositoryImpl.java
@Override
public void setUpdateBook(Book book) {
// TODO Auto-generated method stub
if(book.getFileName() != null)
{
String SQL ="UPDATE book SET b_nam=?, b_unitPrice=?,"
+ " b_author=?, b_description=?, b_publisher=?,"
+ " b_category=?, b_unitsInStock=?, b_releaseDate=?, b_condition=?,b_fileNmae=?";
template.update(SQL,book.getBookId(),book.getName(),book.getUnitPrice(),
book.getAuthor(), book.getDescription(), book.getPublisher(), book.getCategory(),
book.getUnitsInStock(),book.getReleaseDate(),book.getCondition(),book.getFileName() );
}
else if(book.getFileName() == null)
{
String SQL = "update Book set b_nam=?, b_unitPrice=?, b_author=?, b_description=?, b_publisher=?,b_category=?, b_unitsInStock=?, b_releaseDate=?, b_condition=? where b_bookId=?";
template.update(SQL,book.getBookId(),book.getName(),book.getUnitPrice(),
book.getAuthor(), book.getDescription(), book.getPublisher(), book.getCategory(),
book.getUnitsInStock(),book.getReleaseDate(),book.getCondition());
}
}
BookService.java
void setUpdateBook(Book book);
BookServiceImpl.java
@Override
public void setUpdateBook(Book book) {
// TODO Auto-generated method stub
bookRepository.setUpdateBook(book);
}
BookController.java
@GetMapping("/update")
public String getUpdateBookForm(@ModelAttribute("updateBook") Book book,
@RequestParam("id")String bookId, Model model)
{
Book bookById = bookService.getBookById(bookId);
model.addAttribute("book", bookById);
return "updateForm";
}
@PostMapping("/update")
public String submitUpdateBookForm(@ModelAttribute("updateBook") Book book)
{
MultipartFile bookImage = book.getBookImage();
String rootDirectory = "/resources/images";
if(bookImage != null && !bookImage.isEmpty())
{
try {
String fname = bookImage.getOriginalFilename();
bookImage.transferTo(new File("/resources/images"+fname));
book.setFileName(fname);
}
catch(Exception e)
{
throw new RuntimeException("Book Image saving failed", e);
}
}
bookService.setUpdateBook(book);
return "redirect:/books";
}
book.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<link href="<c:url value="/resources/css/bootstrap.min.css"/>" rel="stylesheet">
<meta charset="UTF-8">
<script src="${pageContext.request.contextPath}/resources/js/controllers.js"></script>
<title>Insert title here</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-4">
<c:choose>
<c:when test="${book.getBookImage()==null }">
<!-- chapter 17 DB -->
<%-- <img src="<c:url value="/resources/images/${book.getBookId() }.png"/>"style="width:100%"/> --%>
<img src="<c:url value="/resources/images/${book.fileName }" />" style="width: 100%"/>
</c:when>
<c:otherwise>
<%-- <img src="<c:url value="/resources/images/${book.getBookImage().getOriginalFilename()}"/>"style="width:100%"/> --%>
<img src="<c:url value="/resources/images/${book.fileName }" />" style="width: 100%"/>
</c:otherwise>
</c:choose>
</div>
<div class="col-md-8">
<h3>${book.name}</h3>
<p>${book.description}</p>
<br>
<p><b>도서코드 : </b><span class="badge badge-info">${book.bookId}</span>
<p><b>저자</b> : ${book.author}
<p><b>출판사</b> : ${book.publisher}
<p><b>출판일</b> : ${book.releaseDate}
<p><b>분류</b> : ${book.category}
<p><b>재고수</b> : ${book.unitsInStock}
<h4>${book.unitPrice}원</h4>
<br>
<form:form name="addForm" method="put">
<p><a href="javascript:addToCart('../cart/add/${book.bookId }')" class="btn btn-primary">도서주문 »</a>
<a href="<c:url value="/cart"/>" class="btn btn-warning">장바구니 »</a>
<a href="<c:url value="/books"/>" class="btn btn-secondary">도서 목록 »</a>
//추가구문
<sec:authorize access="isAuthenticated()">
<a href="<c:url value="/books/update?id=${book.bookId }" />" class="btn btn-success">수정»</a>
<a href="<c:url value="javascript:deleteConfirm('${book.bookId }')" />" class="btn btn-danger">삭제 »</a>
</sec:authorize>
//
</form:form>
</div>
</div>
<hr>
</div>
</body>
</html>
updateForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<link href="<c:url value="/resources/css/bootstrap.min.css"/>"rel="stylesheet" />
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-4">
<img src="<c:url value="/resource/images/${book.fimeName }" />" alt="image"
style="width:100%"/>
</div>
<div class="col-md-7">
<form:form modelAttribute="updateBook" action="./update?${_csrf.parameterName }=${_csrf.token}" class="form-horizontal"
enctype="multipart/form-data">
<fieldset>
<div class="form-group row">
<label class="col-sm-2 control-label">도서 ID</label>
<div class="col-sm-6" style="padding-top : 10px">
<form:input id="bookId" path="bookId" type="hodden" class="form-control" value="${book.bookId }"/>
<span class="badge badge-info">${book.bookId }</span>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">도서명</label>
<div class="col-sm-6">
<form:input path="name" class="form-control" value="${book.name}"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">가격</label>
<div class="col-sm-6">
<form:input path="unitPrice" class="form-control" value="${book.unitPrice}"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">저자</label>
<div class="col-sm-6">
<form:input path="author" class="form-control" value="${book.author}"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">상세정보</label>
<div class="col-sm-10">
<textarea path="description" cols="50" rows="2" class="form-control">${book.description }</textarea>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">출판사</label>
<div class="col-sm-6">
<form:input path="publisher" class="form-control" value="${book.publisher}"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">분류</label>
<div class="col-sm-6">
<form:input path="category" class="form-control" value="${book.category}"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">재고수</label>
<div class="col-sm-6">
<form:input path="unitsInStock" class="form-control" value="${book.unitsInStock}"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">출판일</label>
<div class="col-sm-6">
<form:input path="releaseDate" class="form-control" value="${book.releaseDate}"/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">상태</label>
<div class="col-sm-6">
<form:radiobutton path="condition" value="New"/>New
<form:radiobutton path="condition" value="Old"/>Old
<form:radiobutton path="condition" value="E-Book"/>E-Book
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label">이미지</label>
<div class="col-sm-10">
<form:input path="bookImage" class="form-control" type="file"/>
</div>
</div>
<div class="form-group row">
<div class="col-sm-offset-2 col-sm-10">
<input type="submit" class="btn btn-primary" value="수정"/>
<a href="<c:url value="/books" />" class="btn btn-primary">취소</a>
</div>
</div>
</fieldset>
</form:form>
</div>
</div>
</div>
</body>
</html>
tiles.xml
<tiles-definitions>
<definition name="updateForm" extends="base-Template">
<put-attribute name="title" value="Book" />
<put-attribute name="heading" value="도서수정" />
<put-attribute name="subheading" value="Book Editing" />
<put-attribute name="content" value="/WEB-INF/views/updateForm.jsp" />
</definition>
</tiles-definitions>
CRUD 메서드를 사용해 도서 삭제하기.
BookRepository.java
void setDeleteBook(String bookID);
BookRepositoryImpl.java
@Override
public void setDeleteBook(String bookID) {
// TODO Auto-generated method stub
String SQL = "delete from Book where b_bookId = ?";
this.template.update(SQL, bookID);
}
BookService.java
void setDeleteBook(String bookID);
BookServiceImpl.java
@Override
public void setDeleteBook(String bookID) {
// TODO Auto-generated method stub
bookRepository.setDeleteBook(bookID);
}
BookController.java
@RequestMapping(value="/delete")
public String getDeleteBookForm(Model model, @RequestParam("id") String bookId)
{
bookService.setDeleteBook(bookId);
return "redirect:/books";
}
controllers.js
function deleteConfirm(id)
{
if(confirm("삭제합니다!!")==true) location.href = "./delete?id=" +id;
else return;
}
book.jsp
<a href="<c:url value="/books"/>" class="btn btn-secondary">도서 목록 »</a>
<sec:authorize access="isAuthenticated()">
<a href="<c:url value="/books/update?id=${book.bookId }" />" class="btn btn-success">수정»</a>
//추가 구문
<a href="<c:url value="javascript:deleteConfirm('${book.bookId }')" />" class="btn btn-danger">삭제 »</a>
//
</sec:authorize>
</form:form>
</div>
'정리 노트 > Spring' 카테고리의 다른 글
Spring Project[Project] (0) | 2024.02.28 |
---|---|
SQL2 (0) | 2024.02.07 |
Spring Chapter17 [17-5] (0) | 2024.02.02 |
Spring[17-4] (0) | 2024.02.01 |
Spring Chapter14-Chapter15 [17-3] (0) | 2024.01.31 |