书城项目第五阶段-图书分页
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个:1,2,3的情况,页码范围是: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个,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: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个: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>
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);
}
}