分页的总体思想:

分页包含什么:

1.当前页,每页显示的记录数,总的记录数,总的页码,集合List存放的是JavaBean,首页, 尾页,上一页,下一页

传递的參数:当前页,每页显示的记录数.这两个本来就是有的。

数据库中查询的:总的记录数,集合List存放的是JavaBean。这两个是从数据库中查询的。

通过已知的属性计算:首页,
尾页,上一页,下一页,总的页码 这些是通过计算得到了。

因此javaBean Page能够写成:

package com.itheima.domain;

import java.util.List;

public class Page {
private int thispage;//当前页
private int rowperpage;//每页显示的记录数
private int countrow;//总的记录数
private int countpage;//总的页数
private int firstpage;//首页
private int lastpage;//尾页
private int prepage;//上一页
private int nextpage;//下一页
private List<Customer> list;
public int getThispage() {
return thispage;
}
public void setThispage(int thispage) {
this.thispage = thispage;
}
public int getRowperpage() {
return rowperpage;
}
public void setRowperpage(int rowperpage) {
this.rowperpage = rowperpage;
}
public int getCountrow() {
return countrow;
}
public void setCountrow(int countrow) {
this.countrow = countrow;
}
public int getCountpage() {
return countpage;
}
public void setCountpage(int countpage) {
this.countpage = countpage;
}
public int getFirstpage() {
return firstpage;
}
public void setFirstpage(int firstpage) {
this.firstpage = firstpage;
}
public int getLastpage() {
return lastpage;
}
public void setLastpage(int lastpage) {
this.lastpage = lastpage;
}
public int getPrepage() {
return prepage;
}
public void setPrepage(int prepage) {
this.prepage = prepage;
}
public int getNextpage() {
return nextpage;
}
public void setNextpage(int nextpage) {
this.nextpage = nextpage;
}
public List<Customer> getList() {
return list;
}
public void setList(List<Customer> list) {
this.list = list;
}
}

2.首先要进行分页须要在cn.itheima.web包中写一个分页的Servlet,PageCustomerServlet

这个类的主要步骤是:

(1).得到传递的參数默认是首页

(2).每页显示的记录数,这里默认的是5

(3).调用service中分页的函数返回Page

(4).将Page放到request域中

(5).重定向到要实现分页的jsp进行显示分页

package com.itheima.web;

import java.io.IOException;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.itheima.domain.Customer;
import com.itheima.domain.Page;
import com.itheima.factory.BasicFactory;
import com.itheima.service.CustomerService; public class PageCustomerServlet extends HttpServlet {
CustomerService service =BasicFactory.getFactory().getInstance(CustomerService.class);
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获取当前页每页显示的记录
int thispage=Integer.parseInt(request.getParameter("thispage"));
int rowperpage=5;
//2.调用service的方法
Page page=service.findCustomerByPage(thispage,rowperpage);
request.setAttribute("page", page);
//3.请求转发到pageList.jsp
request.getRequestDispatcher("/pageList.jsp").forward(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

3.service实现类代码主要完毕的功能:

计算Page中的属性,设置到Page中

public Page findCustomerByPage(int thispage, int rowperpage) {
Page page=new Page();
//设置当前页
page.setThispage(thispage);
//每页显示的记录数 默认是5条
page.setRowperpage(rowperpage);
//查询数据库一共同拥有多少行
int countrow=dao.getCount();
page.setCountrow(countrow);
//一共同拥有多少页
int countpage=(countrow-1)/rowperpage+1;
page.setCountpage(countpage);
//设置首页
page.setFirstpage(1);
//设置尾页
page.setLastpage(countpage);
//前一页
page.setPrepage(thispage==1?1:thispage-1);
//下一页
page.setNextpage(thispage==countpage?countpage:thispage+1);
//
List<Customer> list=dao.getCustomerByPage((thispage-1)*rowperpage,rowperpage);
page.setList(list);
return page;
}

4.数据库中使用limitkeyword进行查询

public List<Customer> getCustomerByPage(int from, int count) {
String sql="select * from customer limit ?,?";
QueryRunner runner=new QueryRunner(DataSourceUtil.getSource());
try {
return runner.query(sql, new BeanListHandler<Customer>(Customer.class),from,count);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException();
}
}

5.jsp页面中显示:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type="text/javascript">
function selectAll(all){
var del=document.getElementsByName("del");
for(var i=0;i<del.length;i++){
del[i].checked=all.checked;
}
}
</script>
<title></title> <meta http-equiv=" pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0"> </head> <body style="text-align: center">
<h1>客户管理系统_显示列表</h1><hr>
<div align="center">
<form action="${pageContext.request.contextPath }/servlet/FindCustomerByConditionServlet" method="post">
姓名:<input type="text" name="name" value="${param.name }"/>
性别:<input type="radio" name="gender" value="男"
<c:if test="${param.gender=='男'}">checked="checked"</c:if>
/>男
<input type="radio" name="gender" value="女"
<c:if test="${param.gender=='女'}">checked="checked"</c:if>
/>女
客户类型:
<select name="type">
<option value=""/>
<option value="钻石用户"
<c:if test="${param.type=='钻石用户'}">selected="selected"</c:if>
>钻石用户</option>
<option value="黄金用户"
<c:if test="${param.type=='黄金用户'}">selected="selected"</c:if>
>黄金用户</option>
<option value="普通用户"
<c:if test="${param.type=='普通用户'}">selected="selected"</c:if>
>普通用户</option>
</select>
<input type="submit" value="条件查询">
</form>
<form action="${pageContext.request.contextPath}/servlet/BatchDeleteCustomer" method="post">
<table border="1" width="100%" cellpadding="0" cellspacing="0" style="text-align: center">
<tr>
<th><input type="checkbox" onclick="selectAll(this)">全选</th>
<th>客户姓名</th>
<th>客户性别</th>
<th>客户生日</th>
<th>客户电话</th>
<th>电子邮箱</th>
<th>客户爱好</th>
<th>客户类型</th>
<th>具体描写叙述</th>
<th colspan="2">操作类型</th>
</tr>
<c:forEach items="${requestScope.page.list}" var="li">
<tr>
<td><input type="checkbox" name="del" value="${li.id}"/></td>
<td><c:out value="${li.name}"></c:out></td>
<td><c:out value="${li.gender}"></c:out></td>
<td><c:out value="${li.birthday }"></c:out></td>
<td><c:out value="${li.cellphone }"></c:out></td>
<td><c:out value="${li.email }"></c:out></td>
<td><c:out value="${li.preference }"></c:out></td>
<td><c:out value="${li.type }"></c:out></td>
<td><c:out value="${li.description }"></c:out></td>
<td><a href="${pageContext.request.contextPath }/servlet/CustomerInfoServlet?id=${li.id}">改动</a></td>
<td><a href="${pageContext.request.contextPath }/servlet/DeleteCustomerServlet?id=${li.id}">删除</a></td>
</tr>
</c:forEach>
</table>
<input type="submit" value="批量删除"/>
</form>
</div>
${requestScope.page.countrow }条数据
共${requestScope.page.countpage} 页 <a href="${pageContext.request.contextPath }/servlet/PageCustomerServlet?thispage=${page.firstpage}">首页</a>
<a href="${pageContext.request.contextPath }/servlet/PageCustomerServlet?thispage=${page.prepage}">上一页</a>
<!-- 分页逻辑 -->
<c:if test="${page.countpage<=5}">
<c:set var="begin" value="1" scope="page"></c:set>
<c:set var="end" value="${page.countpage}" scope="page"></c:set>
</c:if> <c:if test="${page.countpage>5}">
<c:choose>
<c:when test="${page.thispage<=3}">
<c:set var="begin" value="1" scope="page"></c:set>
<c:set var="end" value="5" scope="page"></c:set>
</c:when>
<c:when test="${page.thispage>=page.countpage-2}">
<c:set var="begin" value="${page.countpage-4}" scope="page"></c:set>
<c:set var="end" value="${page.countpage}" scope="page"></c:set>
</c:when>
<c:otherwise>
<c:set var="begin" value="${page.thispage-2}" scope="page"></c:set>
<c:set var="end" value="${page.thispage+2}" scope="page"></c:set>
</c:otherwise>
</c:choose>
</c:if> <c:forEach begin="${begin}" end="${end}" step="1" var="i">
<c:if test="${i==page.thispage}"><!-- 当前页就不是超链接 -->
<font color="black">${i}</font>
</c:if>
<c:if test="${i!=page.thispage}"><!-- 非当前页就是超链接 -->
<a href="${pageContext.request.contextPath }/servlet/PageCustomerServlet? thispage=${i}"><font color="red">${i}</font></a>
</c:if>
</c:forEach>
<!-- 分页逻辑结束 -->
<a href="${pageContext.request.contextPath }/servlet/PageCustomerServlet?thispage=${page.nextpage}">下一页</a>
<a href="${pageContext.request.contextPath }/servlet/PageCustomerServlet?thispage=${page.lastpage}">尾页</a>
</body><br>
<a href="${pageContext.request.contextPath }/">返回到主页</a>
</html>

分页伪代码:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

6.分页展示:

黑马day13 分页思路&amp;实现的更多相关文章

  1. hbase分页应用场景及分页思路与代码实现

    转自:http://www.aboutyun.com/forum.php?mod=viewthread&tid=7030&extra=page=1 可以带着下面问题来阅读1.hbase ...

  2. php分页思路

    <?php class page{ public $nowPage=1; public $perPage=10; public $showPage=10; public $totalPage; ...

  3. 记录--java 分页 思路 (hibernate关键代码)

    有时会脑袋蒙圈,记录下分页的思路 下面代码是hibernate的分页,其分页就是从第几条数据为起点,取几条数据.比如在mysql中的limit(5,10)取的就是第6条到第10条 在下面代码中的pag ...

  4. redis缓存分页思路

    传统分页一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点.如缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了.比如像微博这样的场景,微博下面现在有一个顶次数的排 ...

  5. Python 简单分页思路

    一: li = [] for i in range(1000): li.append(i) while True: p = input('input page: ') p = int(p) start ...

  6. [MySQL] 分页优化

    在传统的分页思路影响下,很多人都形成了对于分页的固定理解,也就是给出select语句,先用count()函数计算出总的条目,除与每个页面大小pagesize,然后用ceil取整,得出总的页数,用lim ...

  7. SQL Server中的分页

    sqlserver2000时的分页思路 .分页查询时,首先将数据排序 select * from MyStudent order by fid desc .取第一页数据 * from MyStuden ...

  8. SQLServer分页

    1.为什么要分页? 当显示数据的时候,我们不会一下子把所有的数据都显示出来,比如说表中有一万条数据,难道我们要把一万条数据都一次性的显示出来吗?!即便显示给用户了,用户也看不过来.因此,不论是从效率的 ...

  9. RE: Javascript分页处理

    背景: 调用PHP后端给的接口,以实现分页的功能.由于我是没造轮子的能力,所以翻了不少技术博客,经过整合才算完成整个分页功能.从一番查阅中,不难看出大概分为两种不同的分页: 一种是纯前端的,就是在一次 ...

随机推荐

  1. du查看文件大小

    du+文件名就可以查看文件大小 du+ -h + 文件名也是查看文件大小,只是-h会将文件大小转换成M,G等格式

  2. 微信小程序------微信支付模块

    最近项目涉及到小程序开发:需要进行微信支付模块,接下来通过叙述,记录一下微信小程序中微信支付模块的开发,以便日后翻阅和使用. 学习指南----------微信支付开发文档:https://pay.we ...

  3. JavaSE-23 注解

    学习要点 注解的概念 注解分类 读取注解信息 注解概述 1  元数据 定义 描述数据的数据. 用处 文档编制.编译器检查.代码分析等 2  Java注解 Annotation in JDK5.0——将 ...

  4. [Python3网络爬虫开发实战] 1.2.4-GeckoDriver的安装

    上一节中,我们了解了ChromeDriver的配置方法,配置完成之后便可以用Selenium驱动Chrome浏览器来做相应网页的抓取. 那么对于Firefox来说,也可以使用同样的方式完成Seleni ...

  5. linux 批量修改文件名 文件名只保留部分,去掉部分

    问题:linux系统中文件名包含中文,导致页面访问不了文件.就是上条博客中的解决方法二遗留问题. 文件名中有以下格式:TC2_诺而达铜管(中山)有限公司.pdf ,要改为TC2.pdf,去掉中文部分 ...

  6. 在移动端H5开发中(关于安卓端position:fixed和position:absolute;和虚拟键盘冲突的问题,以及解决方案)

    一.在开发移动端webapp时,我们经常会遇到这样的问题,当我们需要在页面底部固定一个logo或者说明时,往往会采用position:fixed进行固定定位或者absolute定位到最底部 这是一个很 ...

  7. Vue页面骨架屏(一)

    在开发webapp的时候总是会受到首屏加载时间过长的影响,主流的解决方法是在载入完成之前显示loading图效果,而一些大公司会配置一套服务端渲染的架构来解决这个问题.考虑到ssr所要解决的一系列问题 ...

  8. 圆角计算 Shader

    圆角的计算 在Shader中,我们使用UV坐标来计算需要显示的部分和不需要显示的部分,使用透明来处理显示与不显示.UV坐标如下图1,我们将坐标平移到图2位置,面片的UV坐标原点在面片中心,UV坐标范围 ...

  9. python 去掉html中其他属性,只保留href 和 src

    https://segmentfault.com/q/1010000010845573 import re #reg=r'\s+[^(href)]*=\"[^<>]+\" ...

  10. C51 定时器/计数器 个人笔记

    C51的周期 结构图 两个功能寄存器 51单片机定时/计数器的工作由两个特殊功能寄存器控制.TMOD用于设置其工作方式:TCON用于控制其启动和中断申请. 工作方式寄存器TMOD 其中方式一和方式二常 ...