1.模型分析

2.实现分析

点击页码,传递参数,跳转到Servlet程序,处理分页操作,web层接收参数,调用Service层方法,获取Page对象,保存到request域中,请求转发并回显信息。

Service层调用Dao层处理分页业务,Dao层用SQL语句操作数据库,获取图书信息。

Page对象:

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;

BookServlet:

protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求参数int pageNo = WebUtils.parseInt(req.getParameter("pageNo"), 1);int pageSize = WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);//调用bookServicePage<Book> page = bookService.page(pageNo,pageSize);//保存page对象到Request域中req.setAttribute("page",page);//请求转发req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);}

BookServiceImpl:

 @Overridepublic Page<Book> page(int pageNo, int pageSize) {Page<Book> page = new Page<Book>();// 设置每页显示的数量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;}

BookDaoImpl:

 @Overridepublic Integer queryForPageTotalCount() {String sql = "select count(*) from t_book";Number count = (Number) queryForSingleValue("sql");return count.intValue();}@Overridepublic 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);}

book_mananger.jsp:

接收域中信息,回显数据。

<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 class="deleteClass" href="manager/bookServlet?action=delete&id=${book.id}&pageNo=${requestScope.page.pageNo}">删除</a></td></tr>
</c:forEach>
<div id="page_nav"><a href="#">首页</a><a href="#">上一页</a><a href="#">3</a>【${requestScope.Page.pageNo}】<a href="#">5</a><a href="#">下一页</a><a href="#">末页</a>共${requestScope.Page.pageTotal}页,${requestScope.Page.pageTotalCount}条记录到第<input value="4" name="pn" id="pn_input"/>页<input type="button" value="确定">
</div>

首页,下一页,上一页:

<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="4" name="pn" id="pn_input"/>页<input type="button" value="确定"></div>

跳转到指定页码:

到第<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};--%><%--alert(pageTotal);--%>// javaScript语言中提供了一个location地址栏对象// 它有一个属性叫href.它可以获取浏览器地址栏中的地址// href属性可读,可写//赋值,页面跳转location.href = "${pageScope.basePath}${ requestScope.page.url }&pageNo=" + pageNo;});});</script>

数据边界:

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

分页模块中,页码 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

修改分页后,增加,删除,修改图书信息的回显页面:

在mananger_jsp页面中 向 book_edit页面传递信息

<!--传递当前页数参数 --><td><a href="manager/bookServlet?action=getBook&id=${book.id}&pageNo=${requestScope.page.pageNo}">修改</a></td><td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${book.id}&pageNo=${requestScope.page.pageNo}">删除</a></td>
<!--传递总页数参数 --><td><a href="pages/manager/book_edit.jsp?pageNo=${requestScope.page.pageTotal}">添加图书</a></td>

在book_edit页面点击提交时,提交给BookServlet,BookServlet调用对于方法处理请求

    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.addBook()保存图书bookService.addBook(book);
//        3、跳到图书列表页面
//                /manager/bookServlet?action=list
//        req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req, resp);//跳转到最后一页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=listresp.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=listresp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo="+ req.getParameter("pageNo"));}

首页 index.jsp 的跳转:

分页条的抽取:

抽取分页条中请求地址为 url 变量:

1.在 page 对象中添加 url 属性

// 分页条的请求地址
private String url;

2.在 Servlet 程序的 page 分页方法中设置 url 的分页请求地址

传递url值

在BookServlet中

page.setUrl("manager/bookServlet?action=page");

在ClientBookServlet中

page.setUrl("client/bookServlet?action=page");

3.修改分页条中请求地址为 url 变量输出,并抽取一个单独的 jsp 页面

在common中新建page_nav.jsp页面

接收url的值,作为跳转位置

%--分页条的开始--%>
<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: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: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: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: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}</a></c:if></c:forEach><%--页码输出的结束--%>

首页价格搜索:

ClientBookServlet  pageByPrice方法:

从index.jsp页面中获取请求参数,pageNo,pagaSize,min,max。调用bookService,查询并封装为page对象,并设置URL。再请求转发到index.jsp页面。page_nav.jsp页面接收url的值,作为页码跳转位置。page_nav.jsp页面接收page对象,遍历并显示数据。

/*** 处理分页功能* @param req* @param resp* @throws ServletException* @throws IOException*/protected void pageByPrice(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1 获取请求的参数 pageNo 和 pageSizeint 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);//设置URL地址的时候要带上价格区间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);}
}

查询价格区间并回显区间数据:

<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>

网上书城图书模块及首页分页相关推荐

  1. nodejs+vue+elementui网上书城 图书销售商城网站express

    在各行各业竞争日益激烈的今天,提高工作效率和工作质量是每个企业必须面临并且必须解决的重大课题.有了网上书店系统就不需要客户到书店手工查询需要的图书,而只需在自家的电脑前输入查询条件,或通过类别查询,快 ...

  2. jsp网上书城图书销售系统

    开发一个网上书店,让大家通过网络的渠道方便.廉价.高效地买到自己所需要的书籍. 2.图书分类显示:按图书的分类显示相应类别的所有图书的信息.显示信息包括:图书名称.作者.单价.图书简介. 3.购物车: ...

  3. SSM+网上书城系统 毕业设计-附源码180919

    目  录 摘要 1 绪论 1.1 研究意义 1.2开发背景 1.3论文结构与章节安排 2网上书城系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2. ...

  4. 计算机毕业设计PHP网上书城网站(源码+程序+VUE+lw+部署)

    该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程.欢迎交流 项目运行 环境配置: phpStudy+ Vscode + Mysql5.7 + HBuilderX+Navicat11+Vu ...

  5. [附源码]计算机毕业设计springboot网上书城网站

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  6. [附源码]计算机毕业设计网上书城网站Springboot程序

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  7. JAVA高级应用课程设计(网上书城系统——会员登陆模块的设计与实现)

    课程设计报告 课   程  名   称: JAVA高级应用课程设计 设   计  题   目:网上书城系统--会员登陆模块的设计与实现 目 录 一.开发背景. 1 (一)背景概述. 1 (二)发展前景 ...

  8. 尚硅谷JavaWeb笔记——书城项目(第五阶段:图书模块(课程精华!!!!))

    文章目录 第五阶段-图书模块 MVC说明 开发流程 Step1:编写图书模块的数据库表 Step2:编写图书模块的JavaBean对象 Step3:编写图书模块Dao和测试Dao 出现的问题:数据无法 ...

  9. 网上书城(功能模块四)

    目录 目标 entity 表结构(设计) 步骤 dao层 web层 页面 目标 1.使用自定义mvc编写模式+js通用左侧菜单栏+jsp页面c标签遍历 2.通过编码实现页面与数据库进行数据绑定 3.书 ...

最新文章

  1. NVIDIA Jetson Xavier NX安装torch和torchvision
  2. 模块化以及插件化开发个人设计思路
  3. win32汇编定时器简单Demo
  4. PHP中间件ICE,ICE的安装配置,ICE常见编译和运行(异常)错误(自测Php版本安装部分,因为php版本跟ice版本不一样失败)
  5. 用python写九九乘法口诀表左上角_python打出九九乘法口诀表
  6. 【M1兼容】阿里云盘小白羊版 Mac版(支持满速)
  7. 安卓案例:利用帧动画动态显示时间
  8. Oracle18C RPM安装介绍
  9. MySQL Semisync
  10. 我所知道的Javascript
  11. tcga数据下载_手把手教你用R下载TCGA数据:CGDSR包
  12. BZOJ3309 DZY Loves Math(莫比乌斯反演+线性筛)
  13. mysql日期教程_MySQL日期函数详解
  14. Dart中dynamic,var,object三者的区别
  15. 使用Jenkins自动化部署项目
  16. char *转为pansichar
  17. 【matlab 基础篇 01】快速开始第一个程序(详细图文+文末资源)
  18. js基于后台数据实现table行列合并
  19. Android Netd
  20. 关于 DRM 中 DUMB 和 PRIME 名字的由来

热门文章

  1. 爱你的人和你爱的人 你选哪个?
  2. 教你一招设计图纸不被外泄的方法
  3. linux音频子系统 - DAPM
  4. 聊聊ThoughtWorks面试(郑大版 社招)+ PS:应届生简单流程介绍
  5. pycharm的 crtl + r 使用正则表达式进行 request-header格式更改
  6. DEVC++第五人格V2.0
  7. 计算机错误代码0X000000be,电脑蓝屏0x000000be怎么解决
  8. JavaWeb开发基础:连接数据库的demo和数据库连接工具类DB.java
  9. ie6,ie7常见兼容性问题总结
  10. 最近流行剪刀手 ^_^