1.需求澄清
管理端图书管理页面【book_manager.jsp】页面原型如下:
需要实现图书的添加、删除、修改、分页显示等操作
2.前期准备
2.1 创建数据表books
create TABLE books(
id INT PRIMARY KEY auto_increment,
title varchar(50),
author VARCHAR(50),
price DOUBLE(10,2),
sales INT,
stock INT,
img_path VARCHAR(50)
) charset "utf8";
数据表结构如下:
添加初始数据:
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('解忧杂货店','东野圭吾',27.20,100,100,'static/uploads/jieyouzahuodian.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('边城','沈从文',23.00,100,100,'static/uploads/biancheng.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('中国哲学史','冯友兰',44.5,100,100,'static/uploads/zhongguozhexueshi.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('忽然七日',' 劳伦',19.33,100,100,'static/uploads/huranqiri.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('苏东坡传','林语堂',19.30,100,100,'static/uploads/sudongpozhuan.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('百年孤独','马尔克斯',29.50,100,100,'static/uploads/bainiangudu.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('扶桑','严歌苓',19.8,100,100,'static/uploads/fusang.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('给孩子的诗','北岛',22.20,100,100,'static/uploads/geihaizideshi.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('为奴十二年','所罗门',16.5,100,100,'static/uploads/weinushiernian.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('平凡的世界','路遥',55.00,100,100,'static/uploads/pingfandeshijie.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('悟空传','今何在',14.00,100,100,'static/uploads/wukongzhuan.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('硬派健身','斌卡',31.20,100,100,'static/uploads/yingpaijianshen.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('从晚清到民国','唐德刚',39.90,100,100,'static/uploads/congwanqingdaominguo.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('三体','刘慈欣',56.5,100,100,'static/uploads/santi.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('看见','柴静',19.50,100,100,'static/uploads/kanjian.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('活着','余华',11.00,100,100,'static/uploads/huozhe.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('小王子','安托万',19.20,100,100,'static/uploads/xiaowangzi.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('我们仨','杨绛',11.30,100,100,'static/uploads/womensa.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('生命不息,折腾不止','罗永浩',25.20,100,100,'static/uploads/shengmingbuxi.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('皮囊','蔡崇达',23.90,100,100,'static/uploads/pinang.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('恰到好处的幸福','毕淑敏',16.40,100,100,'static/uploads/qiadaohaochudexingfu.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('大数据预测','埃里克',37.20,100,100,'static/uploads/dashujuyuce.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('人月神话','布鲁克斯',55.90,100,100,'static/uploads/renyueshenhua.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('C语言入门经典','霍尔顿',45.00,100,100,'static/uploads/cyuyanrumenjingdian.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('数学之美','吴军',29.90,100,100,'static/uploads/shuxuezhimei.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('Java编程思想','埃史尔',70.50,100,100,'static/uploads/Javabianchengsixiang.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('设计模式之禅','秦小波',20.20,100,100,'static/uploads/shejimoshizhichan.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('图解机器学习','杉山将',33.80,100,100,'static/uploads/tujiejiqixuexi.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('艾伦图灵传','安德鲁',47.20,100,100,'static/uploads/ailuntulingzhuan.jpg');
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('教父','马里奥普佐',29.00,100,100,'static/uploads/jiaofu.jpg');
效果如下:
2.2 创建JavaBean Book类
package com.bookstore.bean;
/**
* 图书类
*/
public class Book {
private Integer id;
private String title; //书名
private String author; //作者
private double price; //价格
private Integer sales; //销量
private Integer stock; //库存
private String imgPath = "static//img//default.jpg"; //封面图片的路径,因为存在用户未上传封面的情况,所以添加一个默认封面
public Book(Integer id, String title, String author, double price, Integer sales, Integer stock, String imgPath) {
this.id = id;
this.title = title;
this.author = author;
this.price = price;
this.sales = sales;
this.stock = stock;
this.imgPath = "static//img//default.jpg"; //封面图片的路径,因为存在用户未上传封面的情况,所以添加一个默认封面
}
public Book() {
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", title='" + title + '\'' +
", author='" + author + '\'' +
", price=" + price +
", sales=" + sales +
", stock=" + stock +
", imgPath='" + imgPath + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Integer getSales() {
return sales;
}
public void setSales(Integer sales) {
this.sales = sales;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
public String getImgPath() {
return imgPath;
}
public void setImgPath(String imgPath) {
this.imgPath = imgPath;
}
}
2.代码实现
2.1 查询所有图书需求
我们从首页点击后台管理
,可以进入图书后台管理页面,再该页面会展示所有的图书,并且可以对图书进行增删改查操作。现在我们就先实现,查询所有图书并展示在页面上
(1)Dao层实现
创建BookDao接口及实现类,并实现方法public List<Book> getBookList(); 获取所有的图书
-
BookDao接口如下:
package com.bookstore.dao; import com.bookstore.bean.Book; import java.util.List; public interface BookDao { /** * 获取数据库中的所有book * @return List<Book> */ public List<Book> getBookList(); }
-
BookDaoImpl类实现如下:
package com.bookstore.dao.impl; import com.bookstore.bean.Book; import com.bookstore.dao.BaseDao; import com.bookstore.dao.BookDao; import java.util.List; /** * 获取数据库中的所有book */ public class BookDaoImpl extends BaseDao<Book> implements BookDao { @Override public List<Book> getBookList() { String sql = "SELECT id,title,author,price,sales,stock,img_path as imgPath FROM books"; List<Book> bookList = getBeanList(Book.class, sql); return bookList; } }
-
在test目录下,写个单元测试来测试一下代码
package com.bookstore.test; import com.bookstore.bean.Book; import com.bookstore.dao.impl.BookDaoImpl; import org.junit.Test; import java.util.List; public class BookDaoTest { @Test public void getAllBooktest(){ BookDaoImpl bookDao = new BookDaoImpl(); List<Book> bookList = bookDao.getBookList(); bookList.forEach(System.out::println); } }
(2)service层实现
创建BookService接口及实现类,并实现方法public List<Book> getBookList(); 获取所有的图书
- BookService接口如下:
package com.bookstore.service; import com.bookstore.bean.Book; import java.util.List; public interface BookService { /** * 获取所有图书 * @return */ public List<Book> getBookList(); }
- BookServiceImpl类实现如下:
package com.bookstore.service.impl; import com.bookstore.bean.Book; import com.bookstore.dao.impl.BookDaoImpl; import com.bookstore.service.BookService; import java.util.List; public class BookServiceImpl extends BookDaoImpl implements BookService { /** * 获取所有图书 * @return */ @Override public List<Book> getBookList() { return super.getBookList(); } }
- 创建单元测试测试一下
package com.bookstore.test; import com.bookstore.bean.Book; import com.bookstore.service.impl.BookServiceImpl; import org.junit.Test; public class BookServiceTest { @Test public void getAllBookTest(){ BookServiceImpl bookService = new BookServiceImpl(); for (Book book : bookService.getBookList()) { System.out.println(book); } } }
(3)Servlet与JSP层实现
- 创建BookManagerServlet,并实现
bookList() → 获取图书列表的方法
package com.bookstore.servlet;
import com.bookstore.bean.Book;
import com.bookstore.service.impl.BookServiceImpl;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.List;
@WebServlet(name = "BookManagerServlet", value = "/BookManagerServlet")
public class BookManagerServlet extends BaseServlet {
BookServiceImpl service = new BookServiceImpl();
protected void bookList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.获取请求参数【略】
// 2.调用service相应方法
List<Book> bookList = service.getBookList();
// 3.将数据共享到域中
request.setAttribute("bookList",bookList);
// 4.路径跳转
request.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(request,response);
}
}
-
修改index.jsp中的
后台管理
跳转路径,当点击后台管理
后先跳转到BookManagerServlet。再通过BookManagerServlet转发到book_manager.jsp
页面
-
修改
book_manager.jsp
文件,将数据库查询到的数据展示在页面上
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html lang="en"> <head> <%@ include file="/WEB-INF/public_jsp/base.jsp"%> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <link rel="stylesheet" href="static/css/minireset.css" /> <link rel="stylesheet" href="static/css/common.css" /> <link rel="stylesheet" href="static/css/cart.css" /> <link rel="stylesheet" href="static/css/bookManger.css" /> </head> <body> <div class="header"> <div class="w"> <div class="header-left"> <a href="index.jsp"> <img src="static/img/logo.gif" alt="" /></a> <h1>图书管理系统</h1> </div> <div class="header-right"> <a href="#" class="order">图书管理</a> <a href="order_manager.jsp" class="destory">订单管理</a> <a href="index.jsp" class="gohome">返回商城</a> </div> </div> </div> <div class="list"> <div class="w"> <div class="add"> <a href="book_edit.jsp">添加图书</a> </div> <table> <thead> <tr> <th>图片</th> <th>商品名称</th> <th>价格</th> <th>作者</th> <th>销量</th> <th>库存</th> <th>操作</th> </tr> </thead> <tbody> <!--遍历图书列表,展示所有图书--> <c:forEach var="book" items="${requestScope.bookList}"> <tr> <td> <img src="${book.imgPath}" alt="" /> </td> <td>${book.title}</td> <td> ${book.price} </td> <td>${book.author}</td> <td>${book.sales}</td> <td>${book.stock}</td> <td> <a href="book_edit.jsp">修改</a><a href="" class="del">删除</a> </td> </tr> </c:forEach> </tbody> </table> <div class="footer"> <div class="footer-right"> <div>首页</div> <div>上一页</div> <ul> <li class="active">1</li> <li>2</li> <li>3</li> </ul> <div>下一页</div> <div>末页</div> <span>共10页</span> <span>30条记录</span> <span>到第</span> <input type="text" /> <span>页</span> <button>确定</button> </div> </div> </div> </div> <div class="bottom"> <div class="w"> <div class="top"> <ul> <li> <a href=""> <img src="static/img/bottom1.png" alt="" /> <span>大咖级讲师亲自授课</span> </a> </li> <li> <a href=""> <img src="static/img/bottom.png" alt="" /> <span>课程为学员成长持续赋能</span> </a> </li> <li> <a href=""> <img src="static/img/bottom2.png" alt="" /> <span>学员真是情况大公开</span> </a> </li> </ul> </div> <div class="content"> <dl> <dt>关于尚硅谷</dt> <dd>教育理念</dd> <!-- <dd>名师团队</dd> <dd>学员心声</dd> --> </dl> <dl> <dt>资源下载</dt> <dd>视频下载</dd> <!-- <dd>资料下载</dd> <dd>工具下载</dd> --> </dl> <dl> <dt>加入我们</dt> <dd>招聘岗位</dd> <!-- <dd>岗位介绍</dd> <dd>招贤纳师</dd> --> </dl> <dl> <dt>联系我们</dt> <dd>http://www.atguigu.com</dd> <dd></dd> </dl> </div> </div> <div class="down"> 尚硅谷书城.Copyright ©2015 </div> </div> </body> </html>
到这里我们的查询所有图书的需求就差不多完成了,效果如下:
2.2 添加图书需求
如下图,在后台管理
页面点击添加图书
,可以进入book_edit.jsp
图书添加页面
在图书添加页面,输入相关内容后,点击提交。即可将图书信息插入数据库,且页面会回到图书后台管理页面。
(1)完成图书添加页面用户输入的校验
先使用JavaScript完成对用户输入参数的校验。修改book_edit.jsp
如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<%@ include file="/WEB-INF/public_jsp/base.jsp"%>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<link rel="stylesheet" href="static/css/minireset.css" />
<link rel="stylesheet" href="static/css/common.css" />
<link rel="stylesheet" href="static/css/style.css" />
<link rel="stylesheet" href="static/css/cart.css" />
<link rel="stylesheet" href="static/css/bookManger.css" />
<link rel="stylesheet" href="static/css/register.css" />
<link rel="stylesheet" href="static/css/book_edit.css" />
<!--完成用户输入的相关校验-->
<script type="text/javascript">
$(function () {
// 校验名称参数【非空,小于50位】
function checkTitle() {
var title = $("input[name='title']").val();
if (title == "" || title.length>50){
$("#titleErrMessage").css("visibility","visible")
return false;
}else {
$("#titleErrMessage").css("visibility","hidden")
}
}
// 校验价格参数【非空,0<price<99999999.99】
function checkPrice() {
var price = $("input[name='price']").val();
if (price == "" || price<=0 || price>=99999999.99){
$("#priceErrMess").css("visibility","visible")
return false;
}else {
$("#priceErrMess").css("visibility","hidden")
}
}
// 校验作者参数【非空,小于50位】
function checkAuthor() {
var author = $("input[name='author']").val();
if (author==""||author.length>50){
$("#authorErrMess").css("visibility", "visible");
return false;
}else {
$("#authorErrMess").css("visibility", "hidden");
}
}
// 校验销量参数【非空,sales>0】
function checkSales() {
var sales = $("input[name='sales']").val();
if (sales==""||sales<0) {
$("#salesErrMess").css("visibility", "visible");
return false;
}else {
$("#salesErrMess").css("visibility", "hidden");
}
}
// 校验库存参数【非空,stock>0】
function checkStock() {
var stock = $("input[name='stock']").val();
if (stock==""||stock<0){
$("#stockErrMess").css("visibility","visible")
return false;
}else {
$("#stockErrMess").css("visibility", "hidden");
}
}
// 点击提交时进行参数校验
$("#commit").click(checkTitle);
$("#commit").click(checkPrice);
$("#commit").click(checkAuthor);
$("#commit").click(checkSales);
$("#commit").click(checkStock);
})
</script>
</head>
<body>
<div class="header">
<div class="w">
<div class="header-left">
<a href="index.jsp">
<img src="static/img/logo.gif" alt=""
/></a>
<h1>编辑图书</h1>
</div>
<div class="header-right">
<a href="pages/manager/book_manager.jsp" class="order">图书管理</a>
<a href="pages/manager/order_manager.jsp" class="destory">订单管理</a>
<a href="index.jsp" class="gohome">返回商城</a>
</div>
</div>
</div>
<div class="login_banner">
<div class="register_form">
<form action="">
<div class="form-item">
<div>
<label>名称:</label>
<input type="text" placeholder="请输入名称" name="title"/>
</div>
<span class="errMess" id="titleErrMessage">请输入正确的名称</span>
</div>
<div class="form-item">
<div>
<label>价格:</label>
<input type="number" placeholder="请输入价格" name="price"/>
</div>
<span class="errMess" id="priceErrMess">请输入正确数字</span>
</div>
<div class="form-item">
<div>
<label>作者:</label>
<input type="text" placeholder="请输入作者" name="author"/>
</div>
<span class="errMess" id="authorErrMess">请输入正确作者</span>
</div>
<div class="form-item">
<div>
<label>销量:</label>
<input type="number" placeholder="请输入销量" name="sales"/>
</div>
<span class="errMess" id="salesErrMess">请输入正确销量</span>
</div>
<div class="form-item">
<div>
<label>库存:</label>
<input type="number" placeholder="请输入库存" name="stock"/>
</div>
<span class="errMess" id="stockErrMess">请输入正确库存</span>
</div>
<button class="btn" id="commit">提交</button>
</form>
</div>
</div>
<div class="bottom">
尚硅谷书城.Copyright ©2015
</div>
</body>
</html>
效果如下:
(2)Dao层实现
BookDao接口及实现类中实现public int saveBook(Book book); 向数据库中插入一本图书
方法
- BookDao接口如下:
package com.bookstore.dao; import com.bookstore.bean.Book; import java.util.List; public interface BookDao { /** * 获取数据库中的所有book * @return List<Book> */ public List<Book> getBookList(); /** * 向数据库中插入一本图书 * @return */ public int saveBook(); }
- BookDaoImpl类实现如下:
package com.bookstore.dao.impl; import com.bookstore.bean.Book; import com.bookstore.dao.BaseDao; import com.bookstore.dao.BookDao; import java.util.List; /** * 获取数据库中的所有book */ public class BookDaoImpl extends BaseDao<Book> implements BookDao { /** * 获取所有图书 * @return */ @Override public List<Book> getBookList() { String sql = "SELECT id,title,author,price,sales,stock,img_path as imgPath FROM books"; List<Book> bookList = getBeanList(Book.class, sql); return bookList; } /** * 向数据库中插入一本图书 * @return */ @Override public int saveBook(Book book) { String sql = "INSERT INTO books(title,price,author,sales,stock,img_path) VALUES(?,?,?,?,?,?)"; int res = update(sql, book.getTitle(), book.getPrice(), book.getAuthor(), book.getSales(), book.getStock(),book.getImgPath()); return res; } }
- 测试代码如下:
@Test public void addBookTest(){ Book book = new Book(); book.setTitle("Java冲冲冲"); book.setAuthor("未知"); book.setPrice(55.8); book.setSales(100); book.setStock(1000); BookDaoImpl bookDao = new BookDaoImpl(); int i = bookDao.saveBook(book); }
(3)Servie层实现
在BookService接口及实现类实现public boolean saveBookService(Book book); 向数据库中插入一本图书
方法
- BookService接口如下:
package com.bookstore.service; import com.bookstore.bean.Book; import java.util.List; public interface BookService { /** * 获取所有图书 * @return */ public List<Book> getBookList(); /** * 实现图书添加业务 * @return */ public boolean saveBookService(Book book); }
- BookServiceImpl类实现如下:
package com.bookstore.service.impl; import com.bookstore.bean.Book; import com.bookstore.dao.impl.BookDaoImpl; import com.bookstore.service.BookService; import java.util.List; public class BookServiceImpl extends BookDaoImpl implements BookService { /** * 获取所有图书 * @return */ @Override public List<Book> getBookList() { return super.getBookList(); } /** * 图书添加业务 * @param book * @return */ @Override public boolean saveBookService(Book book) { int i = saveBook(book); if (i==1){ return true; }else { return false; } } }
(4)Servlet与JSP层实现
在BookManagerServlet中实现方法addBook() → 添加图书的方法
-
BookManagerServlet实现如下:
package com.bookstore.servlet; import com.bookstore.bean.Book; import com.bookstore.service.impl.BookServiceImpl; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; import java.util.List; @WebServlet(name = "BookManagerServlet", value = "/BookManagerServlet") public class BookManagerServlet extends BaseServlet { BookServiceImpl service = new BookServiceImpl(); protected void bookList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.获取请求参数【略】 // 2.调用service相应方法 List<Book> bookList = service.getBookList(); // 3.将数据共享到域中 request.setAttribute("bookList",bookList); // 4.路径跳转 request.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(request,response); } /** * 图书添加Servlet处理方法 * @param request * @param response * @throws ServletException * @throws IOException */ protected void addBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.获取请求参数 String title = request.getParameter("title"); String sPrice = request.getParameter("price"); double price = Double.parseDouble(sPrice); String author = request.getParameter("author"); String sSales = request.getParameter("sales"); int sales = Integer.parseInt(sSales); String sStock = request.getParameter("stock"); int stock = Integer.parseInt(sStock); Book book = new Book(); book.setTitle(title); book.setPrice(price); book.setAuthor(author); book.setSales(sales); book.setStock(stock); // 2.调用Service方法 boolean res = service.saveBookService(book); // 3.将数据共享到域中【略】 // 4.路径跳转【跳转回图书管理列表页面】 //直接重定向到jsp页面是错误的,因为还需要通过Servlet获取所有图书后再显示页面 // response.sendRedirect("/bookStore2/pages/manager/book_manager.jsp"); response.sendRedirect("/bookStore2/BookManagerServlet?method=bookList"); } }
-
修改图书添加页面
book_edit.jsp
,将form表单提交路径改为BookManagerServlet
,并设置method参数值为addBook
-
测试
发现有中文乱码问题。
-
解决乱码问题:
①:保证idea编码为utf-8
②:保证jsp的编码是utf-8
③:保证Servlet处理请求,响应的编码是utf-8【参考Servlet章节】
④:保证数据库的编码方式是utf-8【参考数据库章节】
2.3 删除图书需求
如下图:在后台图书管理页面
,点击删除按钮,应该将图书从数据库中删除,并重新回到后台图书管理页面
(1)Dao层实现
修改BookDao接口及实现类,并实现public void deleteBook(String bookId); 根据图书的ID删除一本图书
- BookDao接口如下:
package com.bookstore.dao; import com.bookstore.bean.Book; import java.util.List; public interface BookDao { /** * 获取数据库中的所有book * @return List<Book> */ public List<Book> getBookList(); /** * 向数据库中插入一本图书 * @return */ public int saveBook(Book book); /** * 根据图书id删除图书 * @param bookId * @return */ public int deleteBook(int bookId); }
- BookDaoImpl类实现如下:
package com.bookstore.dao.impl; import com.bookstore.bean.Book; import com.bookstore.dao.BaseDao; import com.bookstore.dao.BookDao; import java.util.List; /** * 获取数据库中的所有book */ public class BookDaoImpl extends BaseDao<Book> implements BookDao { /** * 获取所有图书 * @return */ @Override public List<Book> getBookList() { String sql = "SELECT id,title,author,price,sales,stock,img_path as imgPath FROM books"; List<Book> bookList = getBeanList(Book.class, sql); return bookList; } /** * 向数据库中插入一本图书 * @return */ @Override public int saveBook(Book book) { String sql = "INSERT INTO books(title,price,author,sales,stock,img_path) VALUES(?,?,?,?,?,?)"; int res = update(sql, book.getTitle(), book.getPrice(), book.getAuthor(), book.getSales(), book.getStock(),book.getImgPath()); return res; } /** * 根据图书id删除图书 * @param bookId * @return */ @Override public int deleteBook(int bookId) { String sql = "DELETE FROM books WHERE id=?"; int res = update(sql, bookId); return res; } }
(2)Servie层实现
修改BookService接口及实现类,实现public boolean deleteBookService(int bookId); 根据图书的ID删除一本图书
方法
- BookService接口如下:
package com.bookstore.service; import com.bookstore.bean.Book; import java.util.List; public interface BookService { /** * 获取所有图书 * @return */ public List<Book> getBookList(); /** * 实现图书添加业务 * @return */ public boolean saveBookService(Book book); /** * 实现删除图书业务 * @param bookId * @return */ public boolean deleteBookService(int bookId); }
- BookServiceImpl类实现如下:
package com.bookstore.service.impl; import com.bookstore.bean.Book; import com.bookstore.dao.impl.BookDaoImpl; import com.bookstore.service.BookService; import java.util.List; public class BookServiceImpl extends BookDaoImpl implements BookService { /** * 获取所有图书 * * @return */ @Override public List<Book> getBookList() { return super.getBookList(); } /** * 图书添加业务 * * @param book * @return */ @Override public boolean saveBookService(Book book) { int i = saveBook(book); if (i == 1) { return true; } else { return false; } } @Override public boolean deleteBookService(int bookId) { int res = deleteBook(bookId); if (res >= 1) { return true; } return false; } }
(3)Servlet与JSP层实现
在BookManagerServlet中实现方法deleteBook() → 添加图书的方法
- BookManagerServlet实现如下:
package com.bookstore.servlet; import com.bookstore.bean.Book; import com.bookstore.service.impl.BookServiceImpl; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; import java.util.List; @WebServlet(name = "BookManagerServlet", value = "/BookManagerServlet") public class BookManagerServlet extends BaseServlet { BookServiceImpl service = new BookServiceImpl(); protected void bookList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.获取请求参数【略】 // 2.调用service相应方法 List<Book> bookList = service.getBookList(); // 3.将数据共享到域中 request.setAttribute("bookList",bookList); // 4.路径跳转 request.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(request,response); } /** * 图书添加Servlet处理方法 * @param request * @param response * @throws ServletException * @throws IOException */ protected void addBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.获取请求参数 request.setCharacterEncoding("utf-8"); String title = request.getParameter("title"); String sPrice = request.getParameter("price"); double price = Double.parseDouble(sPrice); String author = request.getParameter("author"); String sSales = request.getParameter("sales"); int sales = Integer.parseInt(sSales); String sStock = request.getParameter("stock"); int stock = Integer.parseInt(sStock); Book book = new Book(); book.setTitle(title); book.setPrice(price); book.setAuthor(author); book.setSales(sales); book.setStock(stock); // 2.调用Service方法 boolean res = service.saveBookService(book); // 3.将数据共享到域中【略】 // 4.路径跳转【跳转回图书管理列表页面】 //直接重定向到jsp页面是错误的,因为还需要通过Servlet获取所有图书后再显示页面 // response.sendRedirect("/bookStore2/pages/manager/book_manager.jsp"); response.sendRedirect("/bookStore2/BookManagerServlet?method=bookList"); } /** * 图书删除Servlet方法 * @param request * @param response * @throws ServletException * @throws IOException */ protected void deleteBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.获取请求参数 String sBookId = request.getParameter("bookId"); int bookId = Integer.parseInt(sBookId); // 2.调用service方法 service.deleteBookService(bookId); // 3.将数据添加到域中 // 4.路径跳转 response.sendRedirect("/bookStore2/BookManagerServlet?method=bookList"); } }
- 修改
book_manager.jsp
文件,实现点击删除按钮,访问BookManagerServlet
(4)删除优化:删除前提示
修改book_manager.jsp
文件,实现当点击删除按钮时,弹窗提示是否确认删除。防止误操作
2.4 实现修改图书需求
- 如下图所示:在
后台图书管理页面
,点击修改按钮,会跳转到图书修改页面。而修改和添加图书使用的是同一个jsp文件book_edit.jsp
。为了方便讲解我们复制book_edit.jsp
为book_update.jsp
作为修改图书的页面。 - 所以修改图书的需求包含两个功能:
- 一个是点击修改按钮跳转到
book_update.jsp
页面,且需要将当前图书的信息回显到页面中。 - 另一个是在
book_update.jsp
页面点击提交后,将数据库中相应图书的信息更新
- 一个是点击修改按钮跳转到
2.4.1 实现图书信息回显
点击修改按钮,携带当前图书信息跳转到图书修改页面,并将图书信息回显到页面中
(1)Dao层实现
修改BookDao接口及实现类,并实现public Book getBookById(int bookId);
方法
- BookDao接口如下:
package com.bookstore.dao; import com.bookstore.bean.Book; import java.util.List; public interface BookDao { /** * 获取数据库中的所有book * @return List<Book> */ public List<Book> getBookList(); /** * 向数据库中插入一本图书 * @return */ public int saveBook(Book book); /** * 根据图书id删除图书 * @param bookId * @return */ public int deleteBook(int bookId); /** * 根据图书id查询图书 * @param bookId * @return */ public Book getBookById(int bookId); }
- BookDaoImpl类实现如下:
package com.bookstore.dao.impl; import com.bookstore.bean.Book; import com.bookstore.dao.BaseDao; import com.bookstore.dao.BookDao; import java.util.List; /** * 获取数据库中的所有book */ public class BookDaoImpl extends BaseDao<Book> implements BookDao { /** * 获取所有图书 * @return */ @Override public List<Book> getBookList() { String sql = "SELECT id,title,author,price,sales,stock,img_path as imgPath FROM books"; List<Book> bookList = getBeanList(Book.class, sql); return bookList; } /** * 向数据库中插入一本图书 * @return */ @Override public int saveBook(Book book) { String sql = "INSERT INTO books(title,price,author,sales,stock,img_path) VALUES(?,?,?,?,?,?)"; int res = update(sql, book.getTitle(), book.getPrice(), book.getAuthor(), book.getSales(), book.getStock(),book.getImgPath()); return res; } /** * 根据图书id删除图书 * @param bookId * @return */ @Override public int deleteBook(int bookId) { String sql = "DELETE FROM books WHERE id=?"; int res = update(sql, bookId); return res; } @Override public Book getBookById(int bookId) { String sql = "SELECT id,title,author,price,sales,stock FROM books WHERE id = ?"; Book bean = getBean(Book.class,sql, bookId); return bean; } }
(2)Servie层实现
修改BookService接口及实现类,实现public Book getBookById(int bookId); 根据图书的ID查询一本图书
方法
- BookService接口如下:
package com.bookstore.service; import com.bookstore.bean.Book; import java.util.List; public interface BookService { /** * 获取所有图书 * @return */ public List<Book> getBookList(); /** * 实现图书添加业务 * @return */ public boolean saveBookService(Book book); /** * 实现删除图书业务 * @param bookId * @return */ public boolean deleteBookService(int bookId); /** * 实现根据图书id查询图书业务 * @param bookId * @return */ public Book getBookByIdService(int bookId); }
- BookServiceImpl类实现如下:
package com.bookstore.service.impl; import com.bookstore.bean.Book; import com.bookstore.dao.impl.BookDaoImpl; import com.bookstore.service.BookService; import java.util.List; public class BookServiceImpl extends BookDaoImpl implements BookService { /** * 获取所有图书 * * @return */ @Override public List<Book> getBookList() { return super.getBookList(); } /** * 图书添加业务 * * @param book * @return */ @Override public boolean saveBookService(Book book) { int i = saveBook(book); if (i == 1) { return true; } else { return false; } } @Override public boolean deleteBookService(int bookId) { int res = deleteBook(bookId); if (res >= 1) { return true; } return false; } @Override public Book getBookByIdService(int bookId) { return getBookById(bookId); } }
(4)Servlet与JSP层实现
- 在BookManagerServlet中实现方法
getBook() →查询图书的方法
/** * 根据图书id查询图书Servclet方法 * @param request * @param response * @throws ServletException * @throws IOException */ protected void getBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.获取请求参数 String sBookId = request.getParameter("bookId"); int bookId = Integer.parseInt(sBookId); // 2.调用service方法 Book book = service.getBookByIdService(bookId); // 3.将数据添加到域中 request.setAttribute("book",book); // 4.路径跳转 request.getRequestDispatcher("/pages/manager/book_update.jsp").forward(request,response); }
- 修改
book_manager.jsp
文件,实现点击修改按钮,访问Servlet
- 修改
book_update.jsp
文件,实现将图书信息回显到页面<form action="BookManagerServlet" method="post"> <input type="hidden" name="method" value="updateBook"> <div class="form-item"> <div> <label>名称:</label> <input type="text" placeholder="请输入名称" name="title" value="${requestScope.book.title}"/> </div> <span class="errMess" id="titleErrMessage">请输入正确的名称</span> </div> <div class="form-item"> <div> <label>价格:</label> <input type="number" placeholder="请输入价格" name="price" value="${requestScope.book.price}"/> </div> <span class="errMess" id="priceErrMess">请输入正确数字</span> </div> <div class="form-item"> <div> <label>作者:</label> <input type="text" placeholder="请输入作者" name="author" value="${requestScope.book.author}"/> </div> <span class="errMess" id="authorErrMess">请输入正确作者</span> </div> <div class="form-item"> <div> <label>销量:</label> <input type="number" placeholder="请输入销量" name="sales" value="${requestScope.book.sales}"/> </div> <span class="errMess" id="salesErrMess">请输入正确销量</span> </div> <div class="form-item"> <div> <label>库存:</label> <input type="number" placeholder="请输入库存" name="stock" value="${requestScope.book.stock}"/> </div> <span class="errMess" id="stockErrMess">请输入正确库存</span> </div> <button class="btn" id="commit">提交</button> </form>
测试效果如下:
2.4.1 实现图书修改
在图书修改页面,修改信息并提交后,应将数据库中的数据也同步修改,并返回后台图书管理页面
(1)Dao层实现
修改BookDao接口及实现类,并实现public int updateBook(Book book); 更新一本图书;
方法
-
BookDao接口如下:
package com.bookstore.dao; import com.bookstore.bean.Book; import java.util.List; public interface BookDao { /** * 获取数据库中的所有book * @return List<Book> */ public List<Book> getBookList(); /** * 向数据库中插入一本图书 * @return */ public int saveBook(Book book); /** * 根据图书id删除图书 * @param bookId * @return */ public int deleteBook(int bookId); /** * 根据图书id查询图书 * @param bookId * @return */ public Book getBookById(int bookId); /** * 更新一本图书 * @param book * @return */ public int updateBook(Book book); }
-
BookDaoImpl类实现如下:
package com.bookstore.dao.impl; import com.bookstore.bean.Book; import com.bookstore.dao.BaseDao; import com.bookstore.dao.BookDao; import java.util.List; /** * 获取数据库中的所有book */ public class BookDaoImpl extends BaseDao<Book> implements BookDao { /** * 获取所有图书 * @return */ @Override public List<Book> getBookList() { String sql = "SELECT id,title,author,price,sales,stock,img_path as imgPath FROM books"; List<Book> bookList = getBeanList(Book.class, sql); return bookList; } /** * 向数据库中插入一本图书 * @return */ @Override public int saveBook(Book book) { String sql = "INSERT INTO books(title,price,author,sales,stock,img_path) VALUES(?,?,?,?,?,?)"; int res = update(sql, book.getTitle(), book.getPrice(), book.getAuthor(), book.getSales(), book.getStock(),book.getImgPath()); return res; } /** * 根据图书id删除图书 * @param bookId * @return */ @Override public int deleteBook(int bookId) { String sql = "DELETE FROM books WHERE id=?"; int res = update(sql, bookId); return res; } @Override public Book getBookById(int bookId) { String sql = "SELECT id,title,author,price,sales,stock FROM books WHERE id = ?"; Book bean = getBean(Book.class,sql, bookId); return bean; } @Override public int updateBook(Book book) { String sql = "UPDATE books SET title=?,author=?,price=?,sales=?,stock=? WHERE(id=?)"; int res = update(sql, book.getTitle(), book.getAuthor(), book.getPrice(), book.getSales(), book.getStock(), book.getId()); return res; } }
(2)Servie层实现
修改BookService接口及实现类,实现public int updateBookService(Book book); 更新一本图书
方法
- BookService接口如下:
package com.bookstore.service; import com.bookstore.bean.Book; import java.util.List; public interface BookService { /** * 获取所有图书 * @return */ public List<Book> getBookList(); /** * 实现图书添加业务 * @return */ public boolean saveBookService(Book book); /** * 实现删除图书业务 * @param bookId * @return */ public boolean deleteBookService(int bookId); /** * 实现根据图书id查询图书业务 * @param bookId * @return */ public Book getBookByIdService(int bookId); /** * 更新图书业务 * @param book * @return */ public int updateBookService(Book book); }
- BookServiceImpl类实现如下:
package com.bookstore.service.impl; import com.bookstore.bean.Book; import com.bookstore.dao.impl.BookDaoImpl; import com.bookstore.service.BookService; import java.util.List; public class BookServiceImpl extends BookDaoImpl implements BookService { /** * 获取所有图书 * * @return */ @Override public List<Book> getBookList() { return super.getBookList(); } /** * 图书添加业务 * * @param book * @return */ @Override public boolean saveBookService(Book book) { int i = saveBook(book); if (i == 1) { return true; } else { return false; } } @Override public boolean deleteBookService(int bookId) { int res = deleteBook(bookId); if (res >= 1) { return true; } return false; } @Override public Book getBookByIdService(int bookId) { return getBookById(bookId); } @Override public int updateBookService(Book book) { int res = updateBook(book); return res; } }
(4)Servlet与JSP层实现
- 在BookManagerServlet中实现方法
updateBook() →查询图书的方法
/** * 更新图书Servlet方法 * @param request * @param response * @throws ServletException * @throws IOException */ protected void updateBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.获取请求参数 String sBookId = request.getParameter("bookId"); int bookId = Integer.parseInt(sBookId); String title = request.getParameter("title"); String sPrice = request.getParameter("price"); double price = Double.parseDouble(sPrice); String author = request.getParameter("author"); String sSales = request.getParameter("sales"); int sales = Integer.parseInt(sSales); String sStock = request.getParameter("stock"); int stock = Integer.parseInt(sStock); Book book = new Book(); book.setTitle(title); book.setPrice(price); book.setAuthor(author); book.setSales(sales); book.setStock(stock); book.setId(bookId); // 2.调用service方法 service.updateBookService(book); // 3.将数据加入域中【略】 // 4.路径跳转 response.sendRedirect("/bookStore2/BookManagerServlet?method=bookList"); }
- 修改
book_update.jsp
文件<form action="BookManagerServlet" method="post"> <input type="hidden" name="method" value="updateBook"> <input type="hidden" name="bookId" value="${requestScope.book.id}"> <div class="form-item"> <div> <label>名称:</label> <input type="text" placeholder="请输入名称" name="title" value="${requestScope.book.title}"/> </div> <span class="errMess" id="titleErrMessage">请输入正确的名称</span> </div> <div class="form-item"> <div> <label>价格:</label> <input type="number" placeholder="请输入价格" name="price" value="${requestScope.book.price}"/> </div> <span class="errMess" id="priceErrMess">请输入正确数字</span> </div> <div class="form-item"> <div> <label>作者:</label> <input type="text" placeholder="请输入作者" name="author" value="${requestScope.book.author}"/> </div> <span class="errMess" id="authorErrMess">请输入正确作者</span> </div> <div class="form-item"> <div> <label>销量:</label> <input type="number" placeholder="请输入销量" name="sales" value="${requestScope.book.sales}"/> </div> <span class="errMess" id="salesErrMess">请输入正确销量</span> </div> <div class="form-item"> <div> <label>库存:</label> <input type="number" placeholder="请输入库存" name="stock" value="${requestScope.book.stock}"/> </div> <span class="errMess" id="stockErrMess">请输入正确库存</span> </div> <button class="btn" id="commit">提交</button> </form>