书城项目第五阶段-图书分页

书城项目第五阶段-图书分页

2、图书分页

页面样式

请添加图片描述

1) 分页模块的分析

在这里插入图片描述

2) 分页模块Page的抽取

创建Page类 pojo包下

package com.atguigu.pojo;

import java.util.List;

/**
 * Page是分页的模型对象
 * @param <T>  具体的模块的Javabean类
 */
public class Page <T>{

    public static final Integer PAGE_SIZE =4;
    //当前页码
    private Integer pageNo;
    //总页码
    private Integer pageTotal;
    //当前显示数量
    private Integer pageSize= PAGE_SIZE;
    //总记录数
    private Integer pageTotalCount;
    //当前页数据
    private List<T> items;

    public Integer getPageNo() {
        return pageNo;
    }

    public void setPageNo(Integer pageNo) {
        this.pageNo = pageNo;
    }

    public Integer getPageTotal() {
        return pageTotal;
    }

    public void setPageTotal(Integer pageTotal) {
        this.pageTotal = pageTotal;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getPageTotalCount() {
        return pageTotalCount;
    }

    public void setPageTotalCount(Integer pageTotalCount) {
        this.pageTotalCount = pageTotalCount;
    }

    public List<T> getItems() {
        return items;
    }

    public void setItems(List<T> items) {
        this.items = items;
    }

    @Override
    public String toString() {
        return "Page{" +
                "pageNo=" + pageNo +
                ", pageTotal=" + pageTotal +
                ", pageSize=" + pageSize +
                ", pageTotalCount=" + pageTotalCount +
                ", items=" + items +
                '}';
    }
}

修改 manager_menu.jsp

<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/8/21
  Time: 下午 05:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div>
    <a href="manager/bookServlet?action=page">图书管理</a>
    <a href="order_manager.jsp">订单管理</a>
    <a href="../../index.jsp">返回商城</a>
</div>

3) 分页的初步实现

增加语句 BookServiceImpl

package com.atguigu.service.impl;

import com.atguigu.dao.BookDao;
import com.atguigu.dao.impl.BookDaoImpl;
import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import com.atguigu.service.BookService;

import java.util.List;

public class BookServiceImpl implements BookService {

    private BookDao bookDao=new BookDaoImpl();

    @Override
    public void addBook(Book book) {
        bookDao.addBook(book);
    }

    @Override
    public void deleteBookById(Integer id) {
        bookDao.deleteBook(id);
    }

    @Override
    public void updateBook(Book book) {
        bookDao.updateBook(book);
    }

    @Override
    public Book queryBookById(Integer id) {
        return bookDao.queryBookById(id);
    }

    @Override
    public List<Book> queryBooks() {
        return bookDao.queryBooks();
    }

    @Override
    public Page<Book> page(int pageNo, int pageSize) {
        Page<Book> page=new Page<>();
      
        //设置每页显示的数量
        page.setPageSize(pageSize);
        //求总记录数
        Integer pageTotalCount=bookDao.queryForPageTotalCount();//创建
        //设置总记录数
        page.setPageTotalCount(pageTotalCount);
        //求总页码
        Integer pageTotal=pageTotalCount/pageSize;
        if (pageTotalCount%pageSize>0){
            pageTotal+=1;
        }
        //设置总页码
        page.setPageTotal(pageTotal);
        
        //设置当前页面
        page.setPageNo(pageNo);
        
        //求当前页数据的开始索引
        int begin=(page.getPageNo()-1)*pageSize;
        //求当前页数据
        List<Book> items=bookDao.queryForPageItems(begin,pageSize);//创建
        //设置当前页数据
        page.setItems(items);
        return page;
    }

}

增加语句 BaseServlet

package com.atguigu.web;

import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import com.atguigu.utils.WebUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class BookServlet extends BaseServlet {

    private BookService bookService=new BookServiceImpl();

    /**
     * 处理分页功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1 获取请求的参数 pageNo 和 pageSize
        int pageNo=WebUtils.parseInt(req.getParameter("pageNo"),1);
        int pageSize=WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
        //2 调用BookService.page(pageNo, pageSize): Page对象
        Page<Book> page=bookService.page(pageNo,pageSize);//创建方法page
        //3 保存Page对象到Request域中
        req.setAttribute("page",page);
        //4 请求转发到pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
    }

    protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


//        1、获取请求的参数==封装成为Book对象
        Book book= WebUtils.copyParamToBean(req.getParameterMap(),new Book());
//        2、调用BookService.addBook0保存图书
        bookService.addBook(book);
//        3、跳到图书列表页面
//        /manager/bookServlet?action=list

//        req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);//请求转发有bug
        resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");//重定向

    }
    protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1、获取请求的参数id,图书编程
      int id=WebUtils.parseInt(req.getParameter("id"),0);
//        2、调用bookService.deleteBookById();删除图书
        bookService.deleteBookById(id);
//        3、重定向回图书列表管理页西
//                /book/manager/bookServlet?action=list
        resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");

    }
    protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//        1、获取请求的参数==封装成为Book对象
        Book book=WebUtils.copyParamToBean(req.getParameterMap(),new Book());
//        2、调用BookService.updateBook( book);修改图书
        bookService.updateBook(book);
//        3、重定向回图书列表管理页面
//              地址:/工程名/manager/bookServlet?action=list
        resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");

    }

    protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1获取请求的参数图书编号
        int id=WebUtils.parseInt(req.getParameter("id"),0);
        //2调用bookService.queryBookById查询图书
        Book book= bookService.queryBookById(id);
        //3保存到图书到Request域中
        req.setAttribute("book",book);
        //4请求转发到。pages/manager/book_edit.jsp页面
        req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req,resp);
    }

    protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1  通过BookService 查询全部图书
        List<Book> books = bookService.queryBooks();
        //2  把全部图书保存到Request域中
        req.setAttribute("books",books);
        //3  请求转发到/pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
    }
}

增加语句 BookDaoImpl

package com.atguigu.dao.impl;

import com.atguigu.dao.BookDao;
import com.atguigu.pojo.Book;

import java.util.List;

public class BookDaoImpl extends BaseDao implements BookDao {
    @Override
    public int addBook(Book book) {

        String sql="insert into t_book(name,author,price,sales,stock,img_path) values(?,?,?,?,?,?)";

        return update(sql,book.getName(),book.getAuthor(),book.getPrice(),book.getSales(),book.getStock(),book.getImgPath());

    }

    @Override
    public int deleteBook(Integer id) {
        String sql="delete from t_book where id=?";
        return update(sql,id);
    }

    @Override
    public int updateBook(Book book) {
        String sql ="update t_book set name=?,author=?,price=?,sales=?,stock=?,img_path=? where id=?";
        return update(sql,book.getName(),book.getAuthor(),book.getPrice(),book.getSales(),book.getStock(),book.getImgPath(),book.getId());
    }

    @Override
    public Book queryBookById(Integer id) {
        String sql="select id,name,author,price,sales,stock,img_path imgPath from t_book where id=?";
        return queryForOne(Book.class,sql,id);
    }

    @Override
    public List<Book> queryBooks() {
        String sql="select id,name,author,price,sales,stock,img_path imgPath from t_book";
        return queryForList(Book.class,sql);
    }

    @Override
    public Integer queryForPageTotalCount() {
        String sql="select count(*) from t_book";
        Number count= (Number) queryForSingleValue(sql);
        return count.intValue();
    }

    @Override
    public List<Book> queryForPageItems(int begin, int pageSize) {
        String sql="select id,name,author,price,sales,stock,img_path imgPath from t_book limit ?,?";
        return queryForList(Book.class,sql,begin,pageSize);
    }
}

增加语句 BookDaoTest

package com.atguigu.test;

import com.atguigu.dao.BookDao;
import com.atguigu.dao.impl.BookDaoImpl;
import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import org.junit.Test;

import java.math.BigDecimal;


public class BookDaoTest {

    private BookDao bookDao=new BookDaoImpl();

    @Test
    public void addBook() {
        bookDao.addBook(new Book(null,"我为什么这么帅!","191125",new BigDecimal(9999),1100000,0,null));
    }

    //最后测试
    @Test
    public void deleteBook() {
        bookDao.deleteBook(4);
    }

    @Test
    public void updateBook() {
        bookDao.updateBook(new Book(4,"我们都很帅!","191125",new BigDecimal(9999),1100000,0,null));
    }

    @Test
    public void queryBookById() {
        System.out.println(bookDao.queryBookById(4));
    }

    @Test
    public void queryBooks() {
        for (Book queryBook: bookDao.queryBooks()) {
            System.out.println(queryBook);
        }
    }

    @Test
    public void testQueryForPageTotalCount() {
        System.out.println(bookDao.queryForPageTotalCount());
    }

    @Test
    public void testQueryForPageItems() {
        for (Book book:bookDao.queryForPageItems(0, Page.PAGE_SIZE)){
            System.out.println(book);
        }

    }
}

增加语句 BookServiceTest

package com.atguigu.test;

import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import org.junit.Test;

import java.math.BigDecimal;

public class BookServiceTest {

    private BookService bookService=new BookServiceImpl();

    @Test
    public void addBook() {
        bookService.addBook(new Book(null,"天下我有!","1125",new BigDecimal(999),10000,0,null));
    }

    //最后测试
    @Test
    public void deleteBookById() {
        bookService.deleteBookById(5);
    }

    @Test
    public void updateBook() {
        bookService.updateBook(new Book(5,"天下都有!","1125",new BigDecimal(999),10,9999,null));
    }

    @Test
    public void queryBookById() {
        System.out.println(bookService.queryBookById(5));
    }

    @Test
    public void queryBooks() {
        for (Book queryBook:bookService.queryBooks()) {
            System.out.println(queryBook);
        }
    }

    @Test
    public void page(){
        System.out.println((bookService.page(1, Page.PAGE_SIZE)));
    }

}

4)首页、上一页、下一页、末页的实现

5)分页模块中跳转到指定页数功能实现

数据有效边界检查 修改 Page

package com.atguigu.pojo;

import java.util.List;

/**
 * Page是分页的模型对象
 * @param <T>  具体的模块的Javabean类
 */
public class Page <T>{

    public static final Integer PAGE_SIZE =4;
    //当前页码
    private Integer pageNo;
    //总页码
    private Integer pageTotal;
    //当前显示数量
    private Integer pageSize= PAGE_SIZE;
    //总记录数
    private Integer pageTotalCount;
    //当前页数据
    private List<T> items;

    public Integer getPageNo() {
        return pageNo;
    }

    public void setPageNo(Integer pageNo) {
    	/*数据边界的有效检查*/
        if (pageNo<1){
            pageNo=1;
        }

        if (pageNo>pageTotal){
            pageNo=pageTotal;
        }

        this.pageNo = pageNo;
    }

    public Integer getPageTotal() {
        return pageTotal;
    }

    public void setPageTotal(Integer pageTotal) {
        this.pageTotal = pageTotal;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getPageTotalCount() {
        return pageTotalCount;
    }

    public void setPageTotalCount(Integer pageTotalCount) {
        this.pageTotalCount = pageTotalCount;
    }

    public List<T> getItems() {
        return items;
    }

    public void setItems(List<T> items) {
        this.items = items;
    }

    @Override
    public String toString() {
        return "Page{" +
                "pageNo=" + pageNo +
                ", pageTotal=" + pageTotal +
                ", pageSize=" + pageSize +
                ", pageTotalCount=" + pageTotalCount +
                ", items=" + items +
                '}';
    }
}

增加语句 head.jsp

<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/8/21
  Time: 下午 03:59
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath=request.getScheme()
            +"://"
            +request.getServerName()
            +":"
            +request.getServerPort()
            +request.getContextPath()
            +"/";

    pageContext.setAttribute("basePath",basePath);

%>

<!--写base标签,永远固定相对路径跳转的结果-->
<base href="<%=basePath%>">
<link type="text/css" rel="stylesheet" href="static/css/style.css">

<script type="text/javascript" src="static/script/jquery.js"></script>

修改 book_manager.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/8/21
  Time: 下午 02:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>图书管理</title>

    <%--静态包含 base标签,css样式,jquery文件 --%>
    <%@ include file="/pages/common/head.jsp"%>
    <script type="text/javascript">
        //给删除的a标签绑定单击事件,用于删除的确认提示操作
        $(function (){
            $("a.deleteClass").click(function (){
                // 在事件的fuction函数中,有一个this对象。这个this对象,是当前正在响应事件的dom对象。
                /**
                 * confirm是确认提示框函数
                 * 参数是它的提示内容
                 * 他有两个按钮,一个确认,一个是取消。
                 * 返回true表示点击了,确认,返回false表示点击取消。
                 */
                return confirm("你确定要删除【"+$(this).parent().parent().find("td:first").text()+"】?");

                // return false;//阻止元素的默认行为===不提交请求
            });

        });


    </script>

</head>
<body>
    <div id="header">
        <img class="logo_img" alt="" src="../../static/img/logo.gif">  <span class="wel_word">图书管理系统</span>

        <%-- 静态包含manager 管理模块的菜单       --%>
        <%@ include file="/pages/common/manager_menu.jsp"%>


    </div>
    <div id="main">
        <table>
            <tr>
                <td>名称</td>
                <td>价格</td>
                <td>作者</td>
                <td>销量</td>
                <td>库存</td>
                <td colspan="2">操作</td>
            </tr>
          <c:forEach items="${requestScope.page.items}" var="book">
              <tr>
                  <td>${book.name}</td>
                  <td>${book.price}</td>
                  <td>${book.author}</td>
                  <td>${book.sales}</td>
                  <td>${book.stock}</td>
                  <td><a href="manager/bookServlet?action=getBook&id=${book.id}">修改</a> </td>
<%--                  <td><a href="manager/bookServlet?action=getBook&id=${book.id}&method=update">修改</a> </td>   <!---方案一 --->  --%>
                  <td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${book.id}">删除</a> </td>
              </tr>

          </c:forEach>


            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td><a href="pages/manager/book_edit.jsp">添加图书</a> </td>
<%--                <td><a href="pages/manager/book_edit.jsp?method=add">添加图书</a> </td>    <!---方案一 --->  --%>
          </tr>
        </table>
        <div id="page_nav">
            <%-- 大于首页,才显示--%>
            <c:if test="${requestScope.page.pageNo >1 }">
                <a href="manager/bookServlet?action=page&pageNo=1">首页</a>
                <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageNo-1}">上一页</a>
            </c:if>
            <a href="#">3</a>
            【${requestScope.page.pageNo}】
            <a href="#">5</a>
                <%-- 如果已经是末页,不显示下一页,末页--%>
            <c:if test="${requestScope.page.pageNo < requestScope.page.pageTotal}">
                 <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageNo+1}">下一页</a>
                 <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageTotal}">末页</a>
             </c:if>
            共${requestScope.page.pageTotal}页,${requestScope.page.pageTotalCount}条记录
            到第<input value="${param.pageNo}" name="pn" id="pn_input"/><input id="searchPageBtn" type="button" value="确定">
                <script type="text/javascript">
                    $(function (){
                        //跳到指定的页码
                        $("#searchPageBtn").click(function (){
                            var pageNo = $("#pn_input").val();

                            var pageTotal=${requestScope.page.pageTotal};

                            if(pageNo<1||pageNo>pageTotal){
                                alert("请输入正确的页码");
                            }else {
                                //javaScript语言中提供了一个location地址栏对象
                                //它有一个属性叫href ,它可以获取浏览器地址栏中的地址
                                //href属性可读,可写
                                location.href="${pageScope.basePath}manager/bookServlet?action=page&pageNo="+pageNo;
                            }
                        });
                    });
                </script>

        </div>
    </div>


    <%--静态包含页脚内容--%>
    <%@include file="/pages/common/footer.jsp"%>


</body>
</html>

6) 分页模块中,页面 1,2,[3],4,5 的显示,要显示5个页码,并且页码可以点击跳转

需求:要显示5个页码,并且当前页码在中间。除了当前页码之外,每个页码可以点击跳转指定页。

情况1:如果总页码小于等于5的情况,页码的范围是:1-总页码

1页	1
2页	1,2
3页	1,2,3
4页	1,2,3,4
5页	1,2,3,4,5

情况2:如果总页码大于5的情况。假设一共10页

小情况1:当前页码为前面3个:1,2,3的情况,页码范围是:1-5.
[1],  2 ,  3 ,    4, 5  
 1,  [2],  3 ,    4,  5 
 1,   2 , [3],   4, 5
小情况2:当前页码为最后3个,8,9,10,页码范围是:总页码减4-总页码
6,  7, [8],  9 ,  10 
6, 7,  8 , [9],   10 
6,  7,  8 ,   9 , [10]
小情况3:4,5,6,7,页码范围是:当前页码减2-当前页码加2

2,3,4,5,6
3,4,5,6,7
4,5,6,7,8
5,6,7,8,9

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/8/21
  Time: 下午 02:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>图书管理</title>

    <%--静态包含 base标签,css样式,jquery文件 --%>
    <%@ include file="/pages/common/head.jsp"%>
    <script type="text/javascript">
        //给删除的a标签绑定单击事件,用于删除的确认提示操作
        $(function (){
            $("a.deleteClass").click(function (){
                // 在事件的fuction函数中,有一个this对象。这个this对象,是当前正在响应事件的dom对象。
                /**
                 * confirm是确认提示框函数
                 * 参数是它的提示内容
                 * 他有两个按钮,一个确认,一个是取消。
                 * 返回true表示点击了,确认,返回false表示点击取消。
                 */
                return confirm("你确定要删除【"+$(this).parent().parent().find("td:first").text()+"】?");

                // return false;//阻止元素的默认行为===不提交请求
            });

        });


    </script>

</head>
<body>
    <div id="header">
        <img class="logo_img" alt="" src="../../static/img/logo.gif">  <span class="wel_word">图书管理系统</span>

        <%-- 静态包含manager 管理模块的菜单       --%>
        <%@ include file="/pages/common/manager_menu.jsp"%>


    </div>
    <div id="main">
        <table>
            <tr>
                <td>名称</td>
                <td>价格</td>
                <td>作者</td>
                <td>销量</td>
                <td>库存</td>
                <td colspan="2">操作</td>
            </tr>
          <c:forEach items="${requestScope.page.items}" var="book">
              <tr>
                  <td>${book.name}</td>
                  <td>${book.price}</td>
                  <td>${book.author}</td>
                  <td>${book.sales}</td>
                  <td>${book.stock}</td>
                  <td><a href="manager/bookServlet?action=getBook&id=${book.id}">修改</a> </td>
<%--                  <td><a href="manager/bookServlet?action=getBook&id=${book.id}&method=update">修改</a> </td>   <!---方案一 --->  --%>
                  <td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${book.id}">删除</a> </td>
              </tr>

          </c:forEach>


            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td><a href="pages/manager/book_edit.jsp">添加图书</a> </td>
<%--                <td><a href="pages/manager/book_edit.jsp?method=add">添加图书</a> </td>    <!---方案一 --->  --%>
          </tr>
        </table>
        <div id="page_nav">
            <%-- 大于首页,才显示--%>
            <c:if test="${requestScope.page.pageNo >1 }">
                <a href="manager/bookServlet?action=page&pageNo=1">首页</a>
                <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageNo-1}">上一页</a>
            </c:if>

            <%--  页码输出的开始   --%>
            <%-- 情况1:如果总页码小于等于5的情况,页码的范围是:1-总页码--%>
            <c:choose>
                <c:when test="${requestScope.page.pageTotal <=5}">
                    <c:forEach begin="1" end="${requestScope.page.pageTotal}" var="i">
                        <c:if test="${i==requestScope.page.pageNo}">
                            【${i}</c:if>
                        <c:if test="${i!=requestScope.page.pageNo}">
                            <a href="manager/bookServlet?action=page&pageNo=i">${i}
                         </c:if>
                    </c:forEach>
                </c:when>
                <%-- 情况2:如果总页码大于5的情况。--%>
                <c:when test="${requestScope.page.pageTotal >5}">
                    <c:choose>
                          <%-- 小情况1:当前页码为前面3:123的情况,页码范围是:1-5.--%>
                          <c:when test="${requestScope.page.pageNo >=3}">
                                <c:set var="begin" value="1"/>
                                <c:set var="end" value="${requestScope.page.pageTotal}"/>
                                <%--
                                <c:forEach begin="1" end="${requestScope.page.pageTotal}" var="i">
                                    <c:if test="${i==requestScope.page.pageNo}">
                                        【${i}</c:if>
                                    <c:if test="${i!=requestScope.page.pageNo}">
                                        <a href="manager/bookServlet?action=page&pageNo=i">${i}
                                    </c:if>
                                </c:forEach>
                                --%>
                          </c:when>
                          <%-- 小情况2:当前页码为最后3个,8910,页码范围是:总页码减4-总页码.--%>
                          <c:when test="${requestScope.page.pageNo > requestScope.page.pageTotal-3}">
                                <c:set var="begin" value="${requestScope.page.pageTotal-4}"/>
                                <c:set var="end" value="${requestScope.page.pageTotal}"/>
<%--
                                <c:forEach begin="${requestScope.page.pageTotal-4}" end="${requestScope.page.pageTotal}" var="i">
                                     <c:if test="${i==requestScope.page.pageNo}">
                                            【${i}</c:if>
                                     <c:if test="${i!=requestScope.page.pageNo}">
                                            <a href="manager/bookServlet?action=page&pageNo=i">${i}
                                      </c:if>
                                </c:forEach>
--%>
                          </c:when>
                           <%-- 小情况3:4567,页码范围是:当前页码减2-当前页码加2  --%>
                          <c:when test="${requestScope.page.pageNo > requestScope.page.pageTotal-3}">
                                 <c:set var="begin" value="${requestScope.page.pageNo-2}"/>
                                 <c:set var="end" value="${requestScope.page.pageNo+2}"/>
<%--
                                 <c:forEach begin="${requestScope.page.pageNo-2}" end="${requestScope.page.pageNo+2}" var="i">
                                      <c:if test="${i==requestScope.page.pageNo}">
                                                【${i}</c:if>
                                      <c:if test="${i!=requestScope.page.pageNo}">
                                                <a href="manager/bookServlet?action=page&pageNo=i">${i}
                                      </c:if>
                                 </c:forEach>
--%>
                          </c:when>

                    </c:choose>
                </c:when>
            </c:choose>



            <%--  页码输出的结束   --%>

            <c:forEach begin="${begin}" end="${end}" var="i">
                  <c:if test="${i==requestScope.page.pageNo}">
                        【${i}</c:if>
                  <c:if test="${i!=requestScope.page.pageNo}">
                         <a href="manager/bookServlet?action=page&pageNo=i">${i}
                  </c:if>
            </c:forEach>



            <%-- 如果已经是末页,不显示下一页,末页--%>
            <c:if test="${requestScope.page.pageNo < requestScope.page.pageTotal}">
                 <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageNo+1}">下一页</a>
                 <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageTotal}">末页</a>
             </c:if>
            共${requestScope.page.pageTotal}页,${requestScope.page.pageTotalCount}条记录
            到第<input value="${param.pageNo}" name="pn" id="pn_input"/><input id="searchPageBtn" type="button" value="确定">
                <script type="text/javascript">
                    $(function (){
                        //跳到指定的页码
                        $("#searchPageBtn").click(function (){
                            var pageNo = $("#pn_input").val();

                            var pageTotal=${requestScope.page.pageTotal};

                            if(pageNo<1||pageNo>pageTotal){
                                alert("请输入正确的页码");
                            }else {
                                //javaScript语言中提供了一个location地址栏对象
                                //它有一个属性叫href ,它可以获取浏览器地址栏中的地址
                                //href属性可读,可写
                                location.href="${pageScope.basePath}manager/bookServlet?action=page&pageNo="+pageNo;
                            }
                        });
                    });
                </script>

        </div>
    </div>


    <%--静态包含页脚内容--%>
    <%@include file="/pages/common/footer.jsp"%>


</body>
</html>

修改 book_manager.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/8/21
  Time: 下午 02:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>图书管理</title>

    <%--静态包含 base标签,css样式,jquery文件 --%>
    <%@ include file="/pages/common/head.jsp"%>
    <script type="text/javascript">
        //给删除的a标签绑定单击事件,用于删除的确认提示操作
        $(function (){
            $("a.deleteClass").click(function (){
                // 在事件的fuction函数中,有一个this对象。这个this对象,是当前正在响应事件的dom对象。
                /**
                 * confirm是确认提示框函数
                 * 参数是它的提示内容
                 * 他有两个按钮,一个确认,一个是取消。
                 * 返回true表示点击了,确认,返回false表示点击取消。
                 */
                return confirm("你确定要删除【"+$(this).parent().parent().find("td:first").text()+"】?");

                // return false;//阻止元素的默认行为===不提交请求
            });

        });


    </script>

</head>
<body>
    <div id="header">
        <img class="logo_img" alt="" src="../../static/img/logo.gif">  <span class="wel_word">图书管理系统</span>

        <%-- 静态包含manager 管理模块的菜单       --%>
        <%@ include file="/pages/common/manager_menu.jsp"%>


    </div>
    <div id="main">
        <table>
            <tr>
                <td>名称</td>
                <td>价格</td>
                <td>作者</td>
                <td>销量</td>
                <td>库存</td>
                <td colspan="2">操作</td>
            </tr>
          <c:forEach items="${requestScope.page.items}" var="book">
              <tr>
                  <td>${book.name}</td>
                  <td>${book.price}</td>
                  <td>${book.author}</td>
                  <td>${book.sales}</td>
                  <td>${book.stock}</td>
                  <td><a href="manager/bookServlet?action=getBook&id=${book.id}">修改</a> </td>
<%--                  <td><a href="manager/bookServlet?action=getBook&id=${book.id}&method=update">修改</a> </td>   <!---方案一 --->  --%>
                  <td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${book.id}">删除</a> </td>
              </tr>

          </c:forEach>


            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td><a href="pages/manager/book_edit.jsp">添加图书</a> </td>
<%--                <td><a href="pages/manager/book_edit.jsp?method=add">添加图书</a> </td>    <!---方案一 --->  --%>
          </tr>
        </table>
        <div id="page_nav">
            <%-- 大于首页,才显示--%>
            <c:if test="${requestScope.page.pageNo >1 }">
                <a href="manager/bookServlet?action=page&pageNo=1">首页</a>
                <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageNo-1}">上一页</a>
            </c:if>

            <%--  页码输出的开始   --%>
            <c:choose>
                <%-- 情况1:如果总页码小于等于5的情况,页码的范围是:1-总页码--%>
                <c:when test="${requestScope.page.pageTotal <=5}">
                    <c:set var="begin" value="1"/>
                    <c:set var="end" value="${requestScope.page.pageTotal}"/>

<%--
                    <c:forEach begin="1" end="${requestScope.page.pageTotal}" var="i">
                        <c:if test="${i==requestScope.page.pageNo}">
                            【${i}</c:if>
                        <c:if test="${i!=requestScope.page.pageNo}">
                            <a href="manager/bookServlet?action=page&pageNo=i">${i}
                         </c:if>
                    </c:forEach>
--%>
                </c:when>
                <%-- 情况2:如果总页码大于5的情况。--%>
                <c:when test="${requestScope.page.pageTotal >5}">
                    <c:choose>
                          <%-- 小情况1:当前页码为前面3:123的情况,页码范围是:1-5.--%>
                          <c:when test="${requestScope.page.pageNo <=3}">
                                <c:set var="begin" value="1"/>
                                <c:set var="end" value="5"/>
                                <%--
                                <c:forEach begin="1" end="${requestScope.page.pageTotal}" var="i">
                                    <c:if test="${i==requestScope.page.pageNo}">
                                        【${i}</c:if>
                                    <c:if test="${i!=requestScope.page.pageNo}">
                                        <a href="manager/bookServlet?action=page&pageNo=i">${i}
                                    </c:if>
                                </c:forEach>
                                --%>
                          </c:when>
                          <%-- 小情况2:当前页码为最后3个,8910,页码范围是:总页码减4-总页码.--%>
                          <c:when test="${requestScope.page.pageNo > requestScope.page.pageTotal-3}">
                                <c:set var="begin" value="${requestScope.page.pageTotal-4}"/>
                                <c:set var="end" value="${requestScope.page.pageTotal}"/>
<%--
                                <c:forEach begin="${requestScope.page.pageTotal-4}" end="${requestScope.page.pageTotal}" var="i">
                                     <c:if test="${i==requestScope.page.pageNo}">
                                            【${i}</c:if>
                                     <c:if test="${i!=requestScope.page.pageNo}">
                                            <a href="manager/bookServlet?action=page&pageNo=i">${i}
                                      </c:if>
                                </c:forEach>
--%>
                          </c:when>
                           <%-- 小情况3:4567,页码范围是:当前页码减2-当前页码加2  --%>
                          <c:otherwise>
                                 <c:set var="begin" value="${requestScope.page.pageNo-2}"/>
                                 <c:set var="end" value="${requestScope.page.pageNo+2}"/>
<%--
                                 <c:forEach begin="${requestScope.page.pageNo-2}" end="${requestScope.page.pageNo+2}" var="i">
                                      <c:if test="${i==requestScope.page.pageNo}">
                                                【${i}</c:if>
                                      <c:if test="${i!=requestScope.page.pageNo}">
                                                <a href="manager/bookServlet?action=page&pageNo=i">${i}
                                      </c:if>
                                 </c:forEach>
--%>
                          </c:otherwise>

                    </c:choose>
                </c:when>
            </c:choose>



            <%--  页码输出的结束   --%>

            <c:forEach begin="${begin}" end="${end}" var="i">
                  <c:if test="${i==requestScope.page.pageNo}">
                        【${i}</c:if>
                  <c:if test="${i!=requestScope.page.pageNo}">
                         <a href="manager/bookServlet?action=page&pageNo=${i}">${i}
                  </c:if>
            </c:forEach>



            <%-- 如果已经是末页,不显示下一页,末页--%>
            <c:if test="${requestScope.page.pageNo < requestScope.page.pageTotal}">
                 <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageNo+1}">下一页</a>
                 <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageTotal}">末页</a>
             </c:if>
            共${requestScope.page.pageTotal}页,${requestScope.page.pageTotalCount}条记录
            到第<input value="${param.pageNo}" name="pn" id="pn_input"/><input id="searchPageBtn" type="button" value="确定">
                <script type="text/javascript">
                    $(function (){
                        //跳到指定的页码
                        $("#searchPageBtn").click(function (){
                            var pageNo = $("#pn_input").val();

                            var pageTotal=${requestScope.page.pageTotal};

                            if(pageNo<1||pageNo>pageTotal){
                                alert("请输入正确的页码");
                            }else {
                                //javaScript语言中提供了一个location地址栏对象
                                //它有一个属性叫href ,它可以获取浏览器地址栏中的地址
                                //href属性可读,可写
                                location.href="${pageScope.basePath}manager/bookServlet?action=page&pageNo="+pageNo;
                            }
                        });
                    });
                </script>

        </div>
    </div>


    <%--静态包含页脚内容--%>
    <%@include file="/pages/common/footer.jsp"%>


</body>
</html>

7)修改分页对原来,添加、删除、修改的影响

修改 book_manager.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/8/21
  Time: 下午 02:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>图书管理</title>

    <%--静态包含 base标签,css样式,jquery文件 --%>
    <%@ include file="/pages/common/head.jsp"%>
    <script type="text/javascript">
        //给删除的a标签绑定单击事件,用于删除的确认提示操作
        $(function (){
            $("a.deleteClass").click(function (){
                // 在事件的fuction函数中,有一个this对象。这个this对象,是当前正在响应事件的dom对象。
                /**
                 * confirm是确认提示框函数
                 * 参数是它的提示内容
                 * 他有两个按钮,一个确认,一个是取消。
                 * 返回true表示点击了,确认,返回false表示点击取消。
                 */
                return confirm("你确定要删除【"+$(this).parent().parent().find("td:first").text()+"】?");

                // return false;//阻止元素的默认行为===不提交请求
            });

        });


    </script>

</head>
<body>
    <div id="header">
        <img class="logo_img" alt="" src="../../static/img/logo.gif">  <span class="wel_word">图书管理系统</span>

        <%-- 静态包含manager 管理模块的菜单       --%>
        <%@ include file="/pages/common/manager_menu.jsp"%>


    </div>
    <div id="main">
        <table>
            <tr>
                <td>名称</td>
                <td>价格</td>
                <td>作者</td>
                <td>销量</td>
                <td>库存</td>
                <td colspan="2">操作</td>
            </tr>
          <c:forEach items="${requestScope.page.items}" var="book">
              <tr>
                  <td>${book.name}</td>
                  <td>${book.price}</td>
                  <td>${book.author}</td>
                  <td>${book.sales}</td>
                  <td>${book.stock}</td>
                  <td><a href="manager/bookServlet?action=getBook&id=${book.id}&pageNo=${requestScope.page.pageNo}">修改</a> </td>
<%--                  <td><a href="manager/bookServlet?action=getBook&id=${book.id}&method=update">修改</a> </td>   <!---方案一 --->  --%>
                  <td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${book.id}&pageNo=${requestScope.page.pageNo}">删除</a> </td>
              </tr>

          </c:forEach>


            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td><a href="pages/manager/book_edit.jsp?pageNo=${requestScope.page.pageNo}">添加图书</a> </td>
<%--                <td><a href="pages/manager/book_edit.jsp?method=add">添加图书</a> </td>    <!---方案一 --->  --%>
          </tr>
        </table>
        <div id="page_nav">
            <%-- 大于首页,才显示--%>
            <c:if test="${requestScope.page.pageNo >1 }">
                <a href="manager/bookServlet?action=page&pageNo=1">首页</a>
                <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageNo-1}">上一页</a>
            </c:if>

            <%--  页码输出的开始   --%>
            <c:choose>
                <%-- 情况1:如果总页码小于等于5的情况,页码的范围是:1-总页码--%>
                <c:when test="${requestScope.page.pageTotal <=5}">
                    <c:set var="begin" value="1"/>
                    <c:set var="end" value="${requestScope.page.pageTotal}"/>

<%--
                    <c:forEach begin="1" end="${requestScope.page.pageTotal}" var="i">
                        <c:if test="${i==requestScope.page.pageNo}">
                            【${i}】
                        </c:if>
                        <c:if test="${i!=requestScope.page.pageNo}">
                            <a href="manager/bookServlet?action=page&pageNo=i">${i}
                         </c:if>
                    </c:forEach>
--%>
                </c:when>
                <%-- 情况2:如果总页码大于5的情况。--%>
                <c:when test="${requestScope.page.pageTotal >5}">
                    <c:choose>
                          <%-- 小情况1:当前页码为前面3个:1,2,3的情况,页码范围是:1-5.--%>
                          <c:when test="${requestScope.page.pageNo <=3}">
                                <c:set var="begin" value="1"/>
                                <c:set var="end" value="5"/>
                                <%--
                                <c:forEach begin="1" end="${requestScope.page.pageTotal}" var="i">
                                    <c:if test="${i==requestScope.page.pageNo}">
                                        【${i}】
                                    </c:if>
                                    <c:if test="${i!=requestScope.page.pageNo}">
                                        <a href="manager/bookServlet?action=page&pageNo=i">${i}
                                    </c:if>
                                </c:forEach>
                                --%>
                          </c:when>
                          <%-- 小情况2:当前页码为最后3个,8,9,10,页码范围是:总页码减4-总页码.--%>
                          <c:when test="${requestScope.page.pageNo > requestScope.page.pageTotal-3}">
                                <c:set var="begin" value="${requestScope.page.pageTotal-4}"/>
                                <c:set var="end" value="${requestScope.page.pageTotal}"/>
<%--
                                <c:forEach begin="${requestScope.page.pageTotal-4}" end="${requestScope.page.pageTotal}" var="i">
                                     <c:if test="${i==requestScope.page.pageNo}">
                                            【${i}】
                                     </c:if>
                                     <c:if test="${i!=requestScope.page.pageNo}">
                                            <a href="manager/bookServlet?action=page&pageNo=i">${i}
                                      </c:if>
                                </c:forEach>
--%>
                          </c:when>
                           <%-- 小情况3:4,5,6,7,页码范围是:当前页码减2-当前页码加2  --%>
                          <c:otherwise>
                                 <c:set var="begin" value="${requestScope.page.pageNo-2}"/>
                                 <c:set var="end" value="${requestScope.page.pageNo+2}"/>
<%--
                                 <c:forEach begin="${requestScope.page.pageNo-2}" end="${requestScope.page.pageNo+2}" var="i">
                                      <c:if test="${i==requestScope.page.pageNo}">
                                                【${i}】
                                      </c:if>
                                      <c:if test="${i!=requestScope.page.pageNo}">
                                                <a href="manager/bookServlet?action=page&pageNo=i">${i}
                                      </c:if>
                                 </c:forEach>
--%>
                          </c:otherwise>

                    </c:choose>
                </c:when>
            </c:choose>



            <%--  页码输出的结束   --%>

            <c:forEach begin="${begin}" end="${end}" var="i">
                  <c:if test="${i==requestScope.page.pageNo}">
                        【${i}】
                  </c:if>
                  <c:if test="${i!=requestScope.page.pageNo}">
                         <a href="manager/bookServlet?action=page&pageNo=${i}">${i}
                  </c:if>
            </c:forEach>



            <%-- 如果已经是末页,不显示下一页,末页--%>
            <c:if test="${requestScope.page.pageNo < requestScope.page.pageTotal}">
                 <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageNo+1}">下一页</a>
                 <a href="manager/bookServlet?action=page&pageNo=${requestScope.page.pageTotal}">末页</a>
             </c:if>
            共${requestScope.page.pageTotal}页,${requestScope.page.pageTotalCount}条记录
            到第<input value="${param.pageNo}" name="pn" id="pn_input"/><input id="searchPageBtn" type="button" value="确定">
                <script type="text/javascript">
                    $(function (){
                        //跳到指定的页码
                        $("#searchPageBtn").click(function (){
                            var pageNo = $("#pn_input").val();

                            var pageTotal=${requestScope.page.pageTotal};

                            if(pageNo<1||pageNo>pageTotal){
                                alert("请输入正确的页码");
                            }else {
                                //javaScript语言中提供了一个location地址栏对象
                                //它有一个属性叫href ,它可以获取浏览器地址栏中的地址
                                //href属性可读,可写
                                location.href="${pageScope.basePath}manager/bookServlet?action=page&pageNo="+pageNo;
                            }
                        });
                    });
                </script>

        </div>
    </div>


    <%--静态包含页脚内容--%>
    <%@include file="/pages/common/footer.jsp"%>


</body>
</html>

修改 book_edit.jsp

<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/8/21
  Time: 下午 02:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>编辑图书</title>

    <%--静态包含 base标签,css样式,jquery文件 --%>
    <%@ include file="/pages/common/head.jsp"%>


    <style type="text/css">
        h1 {
            text-align: center;
            margin-top: 200px;
        }
        h1 a{
            color:red;
        }
        input {
            text-align: center;

        }
    </style>
<body>

<%--    是否添加操作:${empty param.id?"add":"update"}  <!---方案二 ---> --%>
<%--    是否添加操作:${empty requestScope.book?"add":"update"}  <!---方案三 --->  --%>
    <div id="header">
        <img class="logo_ing" alt="" arc="../../static/1mg/logo.gif">
        <span class="wel_word">编辑图书</span>

        <%-- 静态包含manager 管理模块的菜单       --%>
        <%@ include file="/pages/common/manager_menu.jsp"%>


    </div>

    <div id="main">
        <form action="manager/bookServlet" method="get">
            <input type="hidden" name="pageNo" value="${param.pageNo}">
<%--            <input type="hidden" name="action" value="add"/>  --%>
<%--                    <input type="hidden" name="action" value="${param.method}"/>  <!---方案一 --->    --%>

<%--            <input type="hidden" name="action" value="${empty param.id?"add":"update"}"/>  <!---方案二 --->     --%>
            <input type="hidden" name="action" value="${empty requestScope.book?"add":"update"}"/><!---方案三 --->
            <input type="hidden" name="id" value="${requestScope.book.id}"/>
    <table>
                <tr>
                    <td>名称</td>
                    <td>价格</td>
                    <td>作者</td>
                    <td>销量</td>
                    <td>库存</td>
                    <td colspan="2">操作</td>
                </tr>
                <tr>
                    <td><input name="name"  type="text" value="${requestScope.book.name}"/></td>
                    <td><input name="price" type="text"  value="${requestScope.book.price}"/></td>
                    <td><input name="author" type="text" value="${requestScope.book.author}"/></td>
                    <td><input name="sales"  type="text" value="${requestScope.book.sales}"/></td>
                    <td><input name="stock" type="text" value="${requestScope.book.stock}"/></td>
                    <td><input type= "submit" value="提交"/></td>
                </tr>
            </table>
        </form>
    </div>

    <%--静态包含页脚内容--%>
    <%@include file="/pages/common/footer.jsp"%>

</body>
</html>

修改 BookServlet

package com.atguigu.web;

import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import com.atguigu.utils.WebUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class BookServlet extends BaseServlet {

    private BookService bookService=new BookServiceImpl();

    /**
     * 处理分页功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1 获取请求的参数 pageNo 和 pageSize
        int pageNo=WebUtils.parseInt(req.getParameter("pageNo"),1);
        int pageSize=WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);

        //2 调用BookService.page(pageNo, pageSize): Page对象
        Page<Book> page=bookService.page(pageNo,pageSize);//创建方法page
        //3 保存Page对象到Request域中
        req.setAttribute("page",page);
        //4 请求转发到pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
    }

    protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int pageNo=WebUtils.parseInt(req.getParameter("pageNo"),0);
        pageNo+=1;

//        1、获取请求的参数==封装成为Book对象
        Book book= WebUtils.copyParamToBean(req.getParameterMap(),new Book());
//        2、调用BookService.addBook0保存图书
        bookService.addBook(book);
//        3、跳到图书列表页面
//        /manager/bookServlet?action=list

//        req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);//请求转发有bug
        resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=page&pageNo="+pageNo);//重定向

    }
    protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1、获取请求的参数id,图书编程
      int id=WebUtils.parseInt(req.getParameter("id"),0);
//        2、调用bookService.deleteBookById();删除图书
        bookService.deleteBookById(id);
//        3、重定向回图书列表管理页西
//                /book/manager/bookServlet?action=list
        resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=page&pageNo="+req.getParameter("pageNo"));

    }
    protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//        1、获取请求的参数==封装成为Book对象
        Book book=WebUtils.copyParamToBean(req.getParameterMap(),new Book());
//        2、调用BookService.updateBook( book);修改图书
        bookService.updateBook(book);
//        3、重定向回图书列表管理页面
//              地址:/工程名/manager/bookServlet?action=list
        resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=page&pageNo="+req.getParameter("pageNo"));

    }

    protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1获取请求的参数图书编号
        int id=WebUtils.parseInt(req.getParameter("id"),0);
        //2调用bookService.queryBookById查询图书
        Book book= bookService.queryBookById(id);
        //3保存到图书到Request域中
        req.setAttribute("book",book);
        //4请求转发到。pages/manager/book_edit.jsp页面
        req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req,resp);
    }

    protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1  通过BookService 查询全部图书
        List<Book> books = bookService.queryBooks();
        //2  把全部图书保存到Request域中
        req.setAttribute("books",books);
        //3  请求转发到/pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
    }
}

3、首页index.jsp的跳转

8) 前台分页的初步实现

在这里插入图片描述

pages下新建client包,复制 index.jsp 到包下

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书城首页</title>

    <%--静态包含 base标签,css样式,jquery文件 --%>
    <%@ include file="/pages/common/head.jsp"%>

</head>
<body>

    <div id="header">

        <img class="logo_ing"  alt=""  src="static/img/logo.gif">
        <span class= "wel_word">网上书城</span>
        <div>
            <a href="pages/user/login.jsp">登录</a>
            <a href="pages/user/regist.jsp">注册</a>
            <a href="pages/cart/cart.jsp">购物车</a>
            <a href="pages/manager/manager.jsp">后台管理</a>
        </div>

        <div id="main">
            <div id="book">
                <div class="book_cond">
                    <form action="" method="get">
                    价格:<input id="min" type="text"  name="min" value="">-
                        <input id="max" type="text" name="max" value=""><input type="submit" value="查询"/>
                    </form>
                </div>
                <div style="...">
                    <span>您的购物车中有3件商品</span>
                    <div>
                        您刚刚将<span style="...">时间简史</span>加入到了购物车中
                    </div>
                </div>
                <div class="b_list">
                    <div class="img_div">
                        <img class="book_img" alt="static/img/default.jpg"/>
                    </div>
                    <div class="book_info">
                        <div class="book_name">
                            <span class="sp1">书名:</span>
                            <span class="sp2">时间简史</span>
                        </div>
                        <div class="book_author">
                            <span class="sp1">作者:</span>
                            <span class="sp2">霍金</span>
                        </div>
                        <div class= "book_price">
                            <span class="sp1">价格:</span>
                            <span class="sp2">30.00</span>
                        </div>
                        <div class="book_sales">
                            <span class="sp1">销量:</span>
                            <span class="sp2">230</span>
                        </div>
                        <div class="book_amount">
                            <span class="sp1">库存:</span>
                            <span class="sp2">1000</span>
                        </div>
                        <div class="book_add">
                            <button>加入购物车:</button>
                        </div>
                    </div>

                </div>
            </div>

            <div id="page_nav">
                <a href="#">首页</a>
                <a href="#">上一页</a>
                <a href="">3</a>4<a href="#">5</a>
                <a href="#">下一页</a>
                <a href="#">末页</a>10页,30条记录 到第<input value="4" name="pn" id="pn_input"/><input type="button" value="确定">

            </div>

        </div>

    </div>

    <%--静态包含页脚内容--%>
    <%@include file="/pages/common/footer.jsp"%>


</body>
</html>

修改 web下index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--只负责请求转发--%>
<jsp:forward page="/client/bookServlet?action=page"></jsp:forward>

新建 ClientBookServlet web包下

package com.atguigu.web;

import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import com.atguigu.utils.WebUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ClientBookServlet extends BaseServlet{

    private BookService bookService=new BookServiceImpl();

    /**
     * 处理分页功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // System.out.println("经过了前台的ClientBookServlet程序");
        //1 获取请求的参数 pageNo 和 pageSize
        int pageNo= WebUtils.parseInt(req.getParameter("pageNo"),1);
        int pageSize=WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);

        //2 调用BookService.page(pageNo, pageSize): Page对象
        Page<Book> page=bookService.page(pageNo,pageSize);//创建方法page
        //3 保存Page对象到Request域中
        req.setAttribute("page",page);
        //4 请求转发到pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/client/index.jsp").forward(req,resp);
    }

}

配置web.xml

 <servlet>
        <servlet-name>ClientBookServlet</servlet-name>
        <servlet-class>com.atguigu.web.ClientBookServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ClientBookServlet</servlet-name>
        <url-pattern>/client/bookServlet</url-pattern>
    </servlet-mapping>

4、分页条的抽取

4.1、抽取分页请求地址

4.1.1 在page对象下添加url属性

修改 Page
package com.atguigu.pojo;

import java.util.List;

/**
 * Page是分页的模型对象
 * @param <T>  具体的模块的Javabean类
 */
public class Page <T>{

    public static final Integer PAGE_SIZE =4;
    //当前页码
    private Integer pageNo;
    //总页码
    private Integer pageTotal;
    //当前显示数量
    private Integer pageSize= PAGE_SIZE;
    //总记录数
    private Integer pageTotalCount;
    //当前页数据
    private List<T> items;
    //分页条的请求地址
    private String url;
    public Integer getPageNo() {
        return pageNo;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setPageNo(Integer pageNo) {
        /*数据边界的有效检查*/
        if (pageNo<1){
            pageNo=1;
        }

        if (pageNo>pageTotal){
            pageNo=pageTotal;
        }

        this.pageNo = pageNo;
    }

    public Integer getPageTotal() {
        return pageTotal;
    }

    public void setPageTotal(Integer pageTotal) {
        this.pageTotal = pageTotal;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getPageTotalCount() {
        return pageTotalCount;
    }

    public void setPageTotalCount(Integer pageTotalCount) {
        this.pageTotalCount = pageTotalCount;
    }

    public List<T> getItems() {
        return items;
    }

    public void setItems(List<T> items) {
        this.items = items;
    }

    @Override
    public String toString() {
        return "Page{" +
                "pageNo=" + pageNo +
                ", pageTotal=" + pageTotal +
                ", pageSize=" + pageSize +
                ", pageTotalCount=" + pageTotalCount +
                ", items=" + items +
                ", url='" + url + '\'' +
                '}';
    }
}

4.1.2、在Servlet程序的page下修改

修改 BookServlet
package com.atguigu.web;

import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import com.atguigu.utils.WebUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class BookServlet extends BaseServlet {

    private BookService bookService=new BookServiceImpl();

    /**
     * 处理分页功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1 获取请求的参数 pageNo 和 pageSize
        int pageNo=WebUtils.parseInt(req.getParameter("pageNo"),1);
        int pageSize=WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);

        //2 调用BookService.page(pageNo, pageSize): Page对象
        Page<Book> page=bookService.page(pageNo,pageSize);//创建方法page
        page.setUrl("manager/bookServlet?action=page");
        //3 保存Page对象到Request域中
        req.setAttribute("page",page);
        //4 请求转发到pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
    }

    protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int pageNo=WebUtils.parseInt(req.getParameter("pageNo"),0);
        pageNo+=1;

//        1、获取请求的参数==封装成为Book对象
        Book book= WebUtils.copyParamToBean(req.getParameterMap(),new Book());
//        2、调用BookService.addBook0保存图书
        bookService.addBook(book);

//        3、跳到图书列表页面
//        /manager/bookServlet?action=list

//        req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);//请求转发有bug
        resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=page&pageNo="+pageNo);//重定向

    }
    protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1、获取请求的参数id,图书编程
      int id=WebUtils.parseInt(req.getParameter("id"),0);
//        2、调用bookService.deleteBookById();删除图书
        bookService.deleteBookById(id);
//        3、重定向回图书列表管理页西
//                /book/manager/bookServlet?action=list
        resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=page&pageNo="+req.getParameter("pageNo"));

    }
    protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//        1、获取请求的参数==封装成为Book对象
        Book book=WebUtils.copyParamToBean(req.getParameterMap(),new Book());
//        2、调用BookService.updateBook( book);修改图书
        bookService.updateBook(book);
//        3、重定向回图书列表管理页面
//              地址:/工程名/manager/bookServlet?action=list
        resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=page&pageNo="+req.getParameter("pageNo"));

    }

    protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1获取请求的参数图书编号
        int id=WebUtils.parseInt(req.getParameter("id"),0);
        //2调用bookService.queryBookById查询图书
        Book book= bookService.queryBookById(id);
        //3保存到图书到Request域中
        req.setAttribute("book",book);
        //4请求转发到。pages/manager/book_edit.jsp页面
        req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req,resp);
    }

    protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1  通过BookService 查询全部图书
        List<Book> books = bookService.queryBooks();
        //2  把全部图书保存到Request域中
        req.setAttribute("books",books);
        //3  请求转发到/pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
    }
}

修改 ClientBookServlet
package com.atguigu.web;

import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import com.atguigu.utils.WebUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ClientBookServlet extends BaseServlet{

    private BookService bookService=new BookServiceImpl();

    /**
     * 处理分页功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("经过了前台的ClientBookServlet程序");
        //1 获取请求的参数 pageNo 和 pageSize
        int pageNo= WebUtils.parseInt(req.getParameter("pageNo"),1);
        int pageSize=WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
        //2 调用BookService.page(pageNo, pageSize): Page对象
        Page<Book> page=bookService.page(pageNo,pageSize);//创建方法page
        page.setUrl("client/bookServlet?action=page");
        //3 保存Page对象到Request域中
        req.setAttribute("page",page);
        //4 请求转发到pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/client/index.jsp").forward(req,resp);
    }

}

创建 page_nav.jsp common包下
<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/8/24
  Time: 上午 10:16
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--  分页条的开始--%>
<div id="page_nav">
    <%-- 大于首页,才显示--%>
    <c:if test="${requestScope.page.pageNo >1 }">
        <a href="${requestScope.page.url}&pageNo=1">首页</a>
        <a href="${requestScope.page.url}&pageNo=${requestScope.page.pageNo-1}">上一页</a>
    </c:if>

    <%--  页码输出的开始   --%>
    <c:choose>
        <%-- 情况1:如果总页码小于等于5的情况,页码的范围是:1-总页码--%>
        <c:when test="${requestScope.page.pageTotal <=5}">
            <c:set var="begin" value="1"/>
            <c:set var="end" value="${requestScope.page.pageTotal}"/>

            <%--
                                <c:forEach begin="1" end="${requestScope.page.pageTotal}" var="i">
                                    <c:if test="${i==requestScope.page.pageNo}">
                                        【${i}】
                                    </c:if>
                                    <c:if test="${i!=requestScope.page.pageNo}">
                                        <a href="${requestScope.page.Url}&pageNo=i">${i}
                                     </c:if>
                                </c:forEach>
            --%>
        </c:when>
        <%-- 情况2:如果总页码大于5的情况。--%>
        <c:when test="${requestScope.page.pageTotal >5}">
            <c:choose>
                <%-- 小情况1:当前页码为前面3个:1,2,3的情况,页码范围是:1-5.--%>
                <c:when test="${requestScope.page.pageNo <=3}">
                    <c:set var="begin" value="1"/>
                    <c:set var="end" value="5"/>
                    <%--
                    <c:forEach begin="1" end="${requestScope.page.pageTotal}" var="i">
                        <c:if test="${i==requestScope.page.pageNo}">
                            【${i}】
                        </c:if>
                        <c:if test="${i!=requestScope.page.pageNo}">
                            <a href="manager/bookServlet?action=page&pageNo=i">${i}
                        </c:if>
                    </c:forEach>
                    --%>
                </c:when>
                <%-- 小情况2:当前页码为最后3个,8,9,10,页码范围是:总页码减4-总页码.--%>
                <c:when test="${requestScope.page.pageNo > requestScope.page.pageTotal-3}">
                    <c:set var="begin" value="${requestScope.page.pageTotal-4}"/>
                    <c:set var="end" value="${requestScope.page.pageTotal}"/>
                    <%--
                                                    <c:forEach begin="${requestScope.page.pageTotal-4}" end="${requestScope.page.pageTotal}" var="i">
                                                         <c:if test="${i==requestScope.page.pageNo}">
                                                                【${i}】
                                                         </c:if>
                                                         <c:if test="${i!=requestScope.page.pageNo}">
                                                                <a href="manager/bookServlet?action=page&pageNo=i">${i}
                                                          </c:if>
                                                    </c:forEach>
                    --%>
                </c:when>
                <%-- 小情况3:4,5,6,7,页码范围是:当前页码减2-当前页码加2  --%>
                <c:otherwise>
                    <c:set var="begin" value="${requestScope.page.pageNo-2}"/>
                    <c:set var="end" value="${requestScope.page.pageNo+2}"/>
                    <%--
                                                     <c:forEach begin="${requestScope.page.pageNo-2}" end="${requestScope.page.pageNo+2}" var="i">
                                                          <c:if test="${i==requestScope.page.pageNo}">
                                                                    【${i}】
                                                          </c:if>
                                                          <c:if test="${i!=requestScope.page.pageNo}">
                                                                    <a href="manager/bookServlet?action=page&pageNo=i">${i}
                                                          </c:if>
                                                     </c:forEach>
                    --%>
                </c:otherwise>

            </c:choose>
        </c:when>
    </c:choose>



    <%--  页码输出的结束   --%>

    <c:forEach begin="${begin}" end="${end}" var="i">
    <c:if test="${i==requestScope.page.pageNo}">
        【${i}】
    </c:if>
    <c:if test="${i!=requestScope.page.pageNo}">
    <a href="${requestScope.page.url}&pageNo=${i}">${i}
        </c:if>
        </c:forEach>



        <%-- 如果已经是末页,不显示下一页,末页--%>
        <c:if test="${requestScope.page.pageNo < requestScope.page.pageTotal}">
        <a href="${requestScope.page.url}&pageNo=${requestScope.page.pageNo+1}">下一页</a>
        <a href="${requestScope.page.url}&pageNo=${requestScope.page.pageTotal}">末页</a>
        </c:if>
        共${requestScope.page.pageTotal}页,${requestScope.page.pageTotalCount}条记录
        到第<input value="${param.pageNo}" name="pn" id="pn_input"/><input id="searchPageBtn" type="button" value="确定">
        <script type="text/javascript">
            $(function (){
                //跳到指定的页码
                $("#searchPageBtn").click(function (){
                    var pageNo = $("#pn_input").val();

                    var pageTotal=${requestScope.page.pageTotal};

                    if(pageNo<1||pageNo>pageTotal){
                        alert("请输入正确的页码");
                    }else {
                        //javaScript语言中提供了一个location地址栏对象
                        //它有一个属性叫href ,它可以获取浏览器地址栏中的地址
                        //href属性可读,可写
                        location.href="${pageScope.basePath}${requestScope.page.url}&pageNo="+pageNo;
                    }
                });
            });
        </script>

</div>
<%--  分页条的开始 --%>

4.1.3、修改分页条的请求

修改 manager_menu.jsp
<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/8/21
  Time: 下午 05:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div>
    <a href="manager/bookServlet?action=page">图书管理</a>
    <a href="order_manager.jsp">订单管理</a>
    <a href="index.jsp">返回商城</a>
</div>

修改 client/index.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书城首页</title>

    <%--静态包含 base标签,css样式,jquery文件 --%>
    <%@ include file="/pages/common/head.jsp"%>

</head>
<body>

    <div id="header">

        <img class="logo_ing"  alt=""  src="static/img/logo.gif">
        <span class= "wel_word">网上书城</span>
        <div>
            <a href="pages/user/login.jsp">登录</a>
            <a href="pages/user/regist.jsp">注册</a>
            <a href="pages/cart/cart.jsp">购物车</a>
            <a href="pages/manager/manager.jsp">后台管理</a>
        </div>

        <div id="main">
            <div id="book">
                <div class="book_cond">
                    <form action="" method="get">
                    价格:<input id="min" type="text"  name="min" value="">元-
                        <input id="max" type="text" name="max" value=""><input type="submit" value="查询"/>
                    </form>
                </div>
                <div style="...">
                    <span>您的购物车中有3件商品</span>
                    <div>
                        您刚刚将<span style="...">时间简史</span>加入到了购物车中
                    </div>
                </div>


                <div>
                <c:forEach items="${requestScope.page.items}" var="book">
                    <div class="b_list">
                        <div class="img_div">
                            <img class="book_img" alt="${book.imgPath}"/>
                        </div>
                        <div class="book_info">
                            <div class="book_name">
                                <span class="sp1">书名:</span>
                                <span class="sp2">${book.name}</span>
                            </div>
                            <div class="book_author">
                                <span class="sp1">作者:</span>
                                <span class="sp2">${book.author}</span>
                            </div>
                            <div class= "book_price">
                                <span class="sp1">价格:</span>
                                <span class="sp2">¥${book.price}</span>
                            </div>
                            <div class="book_sales">
                                <span class="sp1">销量:</span>
                                <span class="sp2">${book.sales}</span>
                            </div>
                            <div class="book_amount">
                                <span class="sp1">库存:</span>
                                <span class="sp2">${book.stock}</span>
                            </div>
                            <div class="book_add">
                                <button>加入购物车:</button>
                        </div>
                        </div>
                    </div>
                </c:forEach>
                </div>
            </div>

            <%-- 静态包含分页条    --%>
          <%@include file="/pages/common/page_nav.jsp"%>


        </div>

    </div>

    <%--静态包含页脚内容--%>
    <%@include file="/pages/common/footer.jsp"%>


</body>
</html>
修改 book_manager.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/8/21
  Time: 下午 02:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>图书管理</title>

    <%--静态包含 base标签,css样式,jquery文件 --%>
    <%@ include file="/pages/common/head.jsp"%>
    <script type="text/javascript">
        //给删除的a标签绑定单击事件,用于删除的确认提示操作
        $(function (){
            $("a.deleteClass").click(function (){
                // 在事件的fuction函数中,有一个this对象。这个this对象,是当前正在响应事件的dom对象。
                /**
                 * confirm是确认提示框函数
                 * 参数是它的提示内容
                 * 他有两个按钮,一个确认,一个是取消。
                 * 返回true表示点击了,确认,返回false表示点击取消。
                 */
                return confirm("你确定要删除【"+$(this).parent().parent().find("td:first").text()+"】?");

                // return false;//阻止元素的默认行为===不提交请求
            });

        });


    </script>

</head>
<body>
    <div id="header">
        <img class="logo_img" alt="" src="../../static/img/logo.gif">  <span class="wel_word">图书管理系统</span>

        <%-- 静态包含manager 管理模块的菜单       --%>
        <%@ include file="/pages/common/manager_menu.jsp"%>


    </div>
    <div id="main">
        <table>
            <tr>
                <td>名称</td>
                <td>价格</td>
                <td>作者</td>
                <td>销量</td>
                <td>库存</td>
                <td colspan="2">操作</td>
            </tr>
          <c:forEach items="${requestScope.page.items}" var="book">
              <tr>
                  <td>${book.name}</td>
                  <td>${book.price}</td>
                  <td>${book.author}</td>
                  <td>${book.sales}</td>
                  <td>${book.stock}</td>
                  <td><a href="manager/bookServlet?action=getBook&id=${book.id}&pageNo=${requestScope.page.pageNo}">修改</a> </td>
<%--                  <td><a href="manager/bookServlet?action=getBook&id=${book.id}&method=update">修改</a> </td>   <!---方案一 --->  --%>
                  <td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${book.id}&pageNo=${requestScope.page.pageNo}">删除</a> </td>
              </tr>

          </c:forEach>


            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td><a href="pages/manager/book_edit.jsp?pageNo=${requestScope.page.pageNo}">添加图书</a> </td>
<%--                <td><a href="pages/manager/book_edit.jsp?method=add">添加图书</a> </td>    <!---方案一 --->  --%>
          </tr>
        </table>

        <%-- 静态包含分页条    --%>
        <%@include file="/pages/common/page_nav.jsp"%>

    </div>



    <%--静态包含页脚内容--%>
    <%@include file="/pages/common/footer.jsp"%>


</body>
</html>

5、首页价格搜索

在这里插入图片描述

5.1、价格区间搜索并分页功能的实现

修改client/index.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书城首页</title>

    <%--静态包含 base标签,css样式,jquery文件 --%>
    <%@ include file="/pages/common/head.jsp"%>

</head>
<body>

    <div id="header">

        <img class="logo_ing"  alt=""  src="static/img/logo.gif">
        <span class= "wel_word">网上书城</span>
        <div>
            <a href="pages/user/login.jsp">登录</a>
            <a href="pages/user/regist.jsp">注册</a>
            <a href="pages/cart/cart.jsp">购物车</a>
            <a href="pages/manager/manager.jsp">后台管理</a>
        </div>

        <div id="main">
            <div id="book">
                <div class="book_cond">
                    <form action="client/bookServlet" method="get">
                    <input type="hidden" name="action" value="pageByPrice">
                    价格:<input id="min" type="text"  name="min" value="">元 -
                        <input id="max" type="text" name="max" value=""><input type="submit" value="查询"/>
                    </form>
                </div>
                <div style="...">
                    <span>您的购物车中有3件商品</span>
                    <div>
                        您刚刚将<span style="...">时间简史</span>加入到了购物车中
                    </div>
                </div>


                <div>
                <c:forEach items="${requestScope.page.items}" var="book">
                    <div class="b_list">
                        <div class="img_div">
                            <img class="book_img" alt="${book.imgPath}"/>
                        </div>
                        <div class="book_info">
                            <div class="book_name">
                                <span class="sp1">书名:</span>
                                <span class="sp2">${book.name}</span>
                            </div>
                            <div class="book_author">
                                <span class="sp1">作者:</span>
                                <span class="sp2">${book.author}</span>
                            </div>
                            <div class= "book_price">
                                <span class="sp1">价格:</span>
                                <span class="sp2">¥${book.price}</span>
                            </div>
                            <div class="book_sales">
                                <span class="sp1">销量:</span>
                                <span class="sp2">${book.sales}</span>
                            </div>
                            <div class="book_amount">
                                <span class="sp1">库存:</span>
                                <span class="sp2">${book.stock}</span>
                            </div>
                            <div class="book_add">
                                <button>加入购物车:</button>
                        </div>
                        </div>
                    </div>
                </c:forEach>
                </div>
            </div>

            <%-- 静态包含分页条    --%>
          <%@include file="/pages/common/page_nav.jsp"%>


        </div>

    </div>

    <%--静态包含页脚内容--%>
    <%@include file="/pages/common/footer.jsp"%>


</body>
</html>

修改 ClientBookServlet

package com.atguigu.web;

import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import com.atguigu.utils.WebUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ClientBookServlet extends BaseServlet{

    private BookService bookService=new BookServiceImpl();

    /**
     * 处理分页功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("经过了前台的ClientBookServlet程序");
        //1 获取请求的参数 pageNo 和 pageSize
        int pageNo= WebUtils.parseInt(req.getParameter("pageNo"),1);
        int pageSize=WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
        //2 调用BookService.page(pageNo, pageSize): Page对象
        Page<Book> page=bookService.page(pageNo,pageSize);//创建方法page
        page.setUrl("client/bookServlet?action=page");
        //3 保存Page对象到Request域中
        req.setAttribute("page",page);
        //4 请求转发到pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/client/index.jsp").forward(req,resp);
    }

    /**
     * 处理分页功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void pageByPrice(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("经过了前台的ClientBookServlet程序");
        //1 获取请求的参数 pageNo 和 pageSize
        int pageNo= WebUtils.parseInt(req.getParameter("pageNo"),1);
        int pageSize=WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
        int min=WebUtils.parseInt(req.getParameter("min"),0);
        int max=WebUtils.parseInt(req.getParameter("max"),Integer.MAX_VALUE);
        //2 调用BookService.page(pageNo, pageSize): Page对象
        Page<Book> page=bookService.pageByPrice(pageNo,pageSize,min,max);//创建方法pageByPrice
        page.setUrl("client/bookServlet?action=pageByPrice");
        //3 保存Page对象到Request域中
        req.setAttribute("page",page);
        //4 请求转发到pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/client/index.jsp").forward(req,resp);
    }
}

修改 BookServiceImpl

package com.atguigu.service.impl;

import com.atguigu.dao.BookDao;
import com.atguigu.dao.impl.BookDaoImpl;
import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import com.atguigu.service.BookService;

import java.util.List;

public class BookServiceImpl implements BookService {

    private BookDao bookDao=new BookDaoImpl();

    @Override
    public void addBook(Book book) {
        bookDao.addBook(book);
    }

    @Override
    public void deleteBookById(Integer id) {
        bookDao.deleteBook(id);
    }

    @Override
    public void updateBook(Book book) {
        bookDao.updateBook(book);
    }

    @Override
    public Book queryBookById(Integer id) {
        return bookDao.queryBookById(id);
    }

    @Override
    public List<Book> queryBooks() {
        return bookDao.queryBooks();
    }

    @Override
    public Page<Book> page(int pageNo, int pageSize) {
        Page<Book> page=new Page<>();

        //设置每页显示的数量
        page.setPageSize(pageSize);
        //求总记录数
        Integer pageTotalCount=bookDao.queryForPageTotalCount();//创建
        //设置总记录数
        page.setPageTotalCount(pageTotalCount);
        //求总页码
        Integer pageTotal=pageTotalCount/pageSize;
        if (pageTotalCount%pageSize>0){
            pageTotal+=1;
        }
        //设置总页码
        page.setPageTotal(pageTotal);

        //设置当前页码
        page.setPageNo(pageNo);//必须在setPageTotal之后

        //求当前页数据的开始索引
        int begin=(page.getPageNo()-1)*pageSize;
        //求当前页数据
        List<Book> items=bookDao.queryForPageItems(begin,pageSize);//创建
        //设置当前页数据
        page.setItems(items);
        return page;
    }

    //Ctrl+I
    @Override
    public Page<Book> pageByPrice(int pageNo, int pageSize, int min, int max) {
        Page<Book> page=new Page<>();

        //设置每页显示的数量
        page.setPageSize(pageSize);
        //求总记录数
        Integer pageTotalCount=bookDao.queryForPageTotalCountByPrice(min,max);//创建
        //设置总记录数
        page.setPageTotalCount(pageTotalCount);
        //求总页码
        Integer pageTotal=pageTotalCount/pageSize;
        if (pageTotalCount%pageSize>0){
            pageTotal+=1;
        }
        //设置总页码
        page.setPageTotal(pageTotal);

        //设置当前页码
        page.setPageNo(pageNo);//必须在setPageTotal之后

        //求当前页数据的开始索引
        int begin=(page.getPageNo()-1)*pageSize;
        //求当前页数据
        List<Book> items=bookDao.queryForPageItemsByPrice(begin,pageSize,min,max);//创建
        //设置当前页数据
        page.setItems(items);
        return page;
    }
}

修改 BookDaoImpl

package com.atguigu.dao.impl;

import com.atguigu.dao.BookDao;
import com.atguigu.pojo.Book;

import java.util.List;

public class BookDaoImpl extends BaseDao implements BookDao {
    @Override
    public int addBook(Book book) {

        String sql="insert into t_book(name,author,price,sales,stock,img_path) values(?,?,?,?,?,?)";

        return update(sql,book.getName(),book.getAuthor(),book.getPrice(),book.getSales(),book.getStock(),book.getImgPath());

    }

    @Override
    public int deleteBook(Integer id) {
        String sql="delete from t_book where id=?";
        return update(sql,id);
    }

    @Override
    public int updateBook(Book book) {
        String sql ="update t_book set name=?,author=?,price=?,sales=?,stock=?,img_path=? where id=?";
        return update(sql,book.getName(),book.getAuthor(),book.getPrice(),book.getSales(),book.getStock(),book.getImgPath(),book.getId());
    }

    @Override
    public Book queryBookById(Integer id) {
        String sql="select id,name,author,price,sales,stock,img_path imgPath from t_book where id=?";
        return queryForOne(Book.class,sql,id);
    }

    @Override
    public List<Book> queryBooks() {
        String sql="select id,name,author,price,sales,stock,img_path imgPath from t_book";
        return queryForList(Book.class,sql);
    }

    @Override
    public Integer queryForPageTotalCount() {
        String sql="select count(*) from t_book";
        Number count= (Number) queryForSingleValue(sql);
        return count.intValue();
    }

    @Override
    public List<Book> queryForPageItems(int begin, int pageSize) {
        String sql="select id,name,author,price,sales,stock,img_path imgPath from t_book limit ?,?";
        return queryForList(Book.class,sql,begin,pageSize);
    }

    //Ctrl+I
    @Override
    public Integer queryForPageTotalCountByPrice(int min, int max) {
        String sql="select count(*) from t_book where price between ? and ?";
        Number count= (Number) queryForSingleValue(sql,min,max);
        return count.intValue();
    }

    @Override
    public List<Book> queryForPageItemsByPrice(int begin, int pageSize, int min, int max) {
        String sql="select id,name,author,price,sales,stock,img_path imgPath" +
                " from t_book where price between ? and ? order by price limit ?,?";
        return queryForList(Book.class,sql,min,max,begin,pageSize);
    }
}

测试 BookDaoTest

package com.atguigu.test;

import com.atguigu.dao.BookDao;
import com.atguigu.dao.impl.BookDaoImpl;
import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import org.junit.Test;

import java.math.BigDecimal;


public class BookDaoTest {

    private BookDao bookDao=new BookDaoImpl();

    @Test
    public void addBook() {
        bookDao.addBook(new Book(null,"我为什么这么帅!","191125",new BigDecimal(9999),1100000,0,null));
    }

    //最后测试
    @Test
    public void deleteBook() {
        bookDao.deleteBook(4);
    }

    @Test
    public void updateBook() {
        bookDao.updateBook(new Book(4,"我们都很帅!","191125",new BigDecimal(9999),1100000,0,null));
    }

    @Test
    public void queryBookById() {
        System.out.println(bookDao.queryBookById(4));
    }

    @Test
    public void queryBooks() {
        for (Book queryBook: bookDao.queryBooks()) {
            System.out.println(queryBook);
        }
    }

    @Test
    public void testQueryForPageTotalCount() {
        System.out.println(bookDao.queryForPageTotalCount());
    }

    @Test
    public void testQueryForPageItems() {
        for (Book book:bookDao.queryForPageItems(0, Page.PAGE_SIZE)){
            System.out.println(book);
        }

    }

    @Test
    public void testQueryForPageTotalCountByPrice() {
        System.out.println(bookDao.queryForPageTotalCountByPrice(10,50));
    }

    @Test
    public void testQueryForPageItemsByPrice() {
        for (Book book:bookDao.queryForPageItemsByPrice(0, Page.PAGE_SIZE,10,50)){
            System.out.println(book);
        }

    }
}

测试 BookServiceTest

package com.atguigu.test;

import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import org.junit.Test;

import java.math.BigDecimal;

public class BookServiceTest {

    private BookService bookService=new BookServiceImpl();

    @Test
    public void addBook() {
        bookService.addBook(new Book(null,"天下我有!","1125",new BigDecimal(999),10000,0,null));
    }

    //最后测试
    @Test
    public void deleteBookById() {
        bookService.deleteBookById(5);
    }

    @Test
    public void updateBook() {
        bookService.updateBook(new Book(5,"天下都有!","1125",new BigDecimal(999),10,9999,null));
    }

    @Test
    public void queryBookById() {
        System.out.println(bookService.queryBookById(5));
    }

    @Test
    public void queryBooks() {
        for (Book queryBook:bookService.queryBooks()) {
            System.out.println(queryBook);
        }
    }

    @Test
    public void page(){
        System.out.println((bookService.page(1, Page.PAGE_SIZE)));
    }

    @Test
    public void pageByPrice(){
        System.out.println((bookService.pageByPrice(1, Page.PAGE_SIZE,10,50)));
    }
}

5.2、搜索价格区间的回显

修改 client/index

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书城首页</title>

    <%--静态包含 base标签,css样式,jquery文件 --%>
    <%@ include file="/pages/common/head.jsp"%>

</head>
<body>

    <div id="header">

        <img class="logo_ing"  alt=""  src="static/img/logo.gif">
        <span class= "wel_word">网上书城</span>
        <div>
            <a href="pages/user/login.jsp">登录</a>
            <a href="pages/user/regist.jsp">注册</a>
            <a href="pages/cart/cart.jsp">购物车</a>
            <a href="pages/manager/manager.jsp">后台管理</a>
        </div>

        <div id="main">
            <div id="book">
                <div class="book_cond">
                    <form action="client/bookServlet" method="get">
                    <input type="hidden" name="action" value="pageByPrice">
                    价格:<input id="min" type="text"  name="min" value="${param.min}">-
                        <input id="max" type="text" name="max" value="${param.max}"><input type="submit" value="查询"/>
                    </form>
                </div>
                <div style="...">
                    <span>您的购物车中有3件商品</span>
                    <div>
                        您刚刚将<span style="...">时间简史</span>加入到了购物车中
                    </div>
                </div>


                <div>
                <c:forEach items="${requestScope.page.items}" var="book">
                    <div class="b_list">
                        <div class="img_div">
                            <img class="book_img" alt="${book.imgPath}"/>
                        </div>
                        <div class="book_info">
                            <div class="book_name">
                                <span class="sp1">书名:</span>
                                <span class="sp2">${book.name}</span>
                            </div>
                            <div class="book_author">
                                <span class="sp1">作者:</span>
                                <span class="sp2">${book.author}</span>
                            </div>
                            <div class= "book_price">
                                <span class="sp1">价格:</span>
                                <span class="sp2">¥${book.price}</span>
                            </div>
                            <div class="book_sales">
                                <span class="sp1">销量:</span>
                                <span class="sp2">${book.sales}</span>
                            </div>
                            <div class="book_amount">
                                <span class="sp1">库存:</span>
                                <span class="sp2">${book.stock}</span>
                            </div>
                            <div class="book_add">
                                <button>加入购物车:</button>
                        </div>
                        </div>
                    </div>
                </c:forEach>
                </div>
            </div>

            <%-- 静态包含分页条    --%>
          <%@include file="/pages/common/page_nav.jsp"%>


        </div>

    </div>

    <%--静态包含页脚内容--%>
    <%@include file="/pages/common/footer.jsp"%>


</body>
</html>

5.3、解决分页条中不带价格区间的bug

增加语句 ClientBookServlet

package com.atguigu.web;

import com.atguigu.pojo.Book;
import com.atguigu.pojo.Page;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import com.atguigu.utils.WebUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ClientBookServlet extends BaseServlet{

    private BookService bookService=new BookServiceImpl();

    /**
     * 处理分页功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("经过了前台的ClientBookServlet程序");
        //1 获取请求的参数 pageNo 和 pageSize
        int pageNo= WebUtils.parseInt(req.getParameter("pageNo"),1);
        int pageSize=WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
        //2 调用BookService.page(pageNo, pageSize): Page对象
        Page<Book> page=bookService.page(pageNo,pageSize);//创建方法page
        page.setUrl("client/bookServlet?action=page");
        //3 保存Page对象到Request域中
        req.setAttribute("page",page);
        //4 请求转发到pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/client/index.jsp").forward(req,resp);
    }

    /**
     * 处理分页功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void pageByPrice(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("经过了前台的ClientBookServlet程序");
        //1 获取请求的参数 pageNo 和 pageSize
        int pageNo= WebUtils.parseInt(req.getParameter("pageNo"),1);
        int pageSize=WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
        int min=WebUtils.parseInt(req.getParameter("min"),0);
        int max=WebUtils.parseInt(req.getParameter("max"),Integer.MAX_VALUE);
        //2 调用BookService.page(pageNo, pageSize): Page对象
        Page<Book> page=bookService.pageByPrice(pageNo,pageSize,min,max);//创建方法pageByPrice
        StringBuilder sb=new StringBuilder("client/bookServlet?action=pageByPrice");
        // 如果有最小价格的参数,追加到分页条的地址参数中
        if (req.getParameter("min")!=null){
            sb.append("&min=").append(req.getParameter("min"));
        }
        if (req.getParameter("max")!=null){
            sb.append("&max=").append(req.getParameter("max"));
        }
        page.setUrl(sb.toString());
        //3 保存Page对象到Request域中
        req.setAttribute("page",page);
        //4 请求转发到pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/client/index.jsp").forward(req,resp);
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日星月云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值