Java全栈(四)web网页技术:15.书城项目实战四:管理端图书的增删改查(后台)

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.jspbook_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>
    
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值