现在很多流行的框架,都可以很快的把分页效果做出来,但是作为一名程序员你必须得知道手写分页的流程:

场景效果:

一、分页的思路

首先我们得知道写分页代码的思路,保持思路清晰,才能行云流水的去写代码,其实不管是在写什么代码,思路,思想特别重要,先想好再动手,就会事半功倍!

先来分析SQL语句实现

Select * from product limit 0 ,5

Select * from product limit 5 ,5

Select * from product limit 10 ,5

Select * from product limit 15 ,5

#当前页 起始值 每页数据大小

1 0 5

2 5 5

3 10 5

4 15 5

结论:

(1)(当前页-1)*(每页数量)=起始值

(2)要想实现分页,向服务端发起请求的时候,必须传递当前页。

二、创建PageBean存放数据

这时候我们需要封装一个包装类,来封装我们的分页数据

package cn.itcast.store.domain;

import java.util.List;

/**

* 存放分页相关的数据

*

* @author yechengchao

*/

public class PageModel {

//基本属性

/**当前页数,由用户指定 */

private int currentPageNum;

/**每页显示的条数,可以由用户指定每页显示多少 */

private int pageSize =5;

/**总记录条数,数据库查出来的 */

private int totalRecords;

/**总页数,计算出来的 */

private int totalPageNum;

/**每页开始记录的索引,计算出来的 (当前页-1)*(每页数量)=起始值 */

private int startIndex;

/**上一页 */

private int prePageNum;

/**下一页 */

private int nextPageNum;

/**已经分好页的结果集,存放我们查出来的结果集*/

private List list;

/**扩展属性

一共每页显示9个页码按钮*/

/**开始页码*/

private int startPage;

/**结束页码*/

private int endPage;

/**完善属性*/

private String url;

/**要想使用我的分页,必须给我两个参数。一个是要看哪一页,另一个是总记录条数*/

public PageModel(int currentPageNum,int totalRecords,int pageSize){

this.currentPageNum = currentPageNum;

this.totalRecords = totalRecords;

this.pageSize=pageSize;

//计算查询记录的开始索引

startIndex = (currentPageNum-1)*pageSize;

//计算总页数

totalPageNum = totalRecords%pageSize==0?(totalRecords/pageSize):(totalRecords/pageSize+1);

//5

startPage = currentPageNum - 4;

//结束页码

endPage = currentPageNum + 4;

//看看总页数够不够9页

if(totalPageNum>9){

//超过了9页

if(startPage < 1){

startPage = 1;

endPage = startPage+8;

}

if(endPage>totalPageNum){

endPage = totalPageNum;

startPage = endPage-8;

}

}else{

//不够9页

startPage = 1;

endPage = totalPageNum;

}

}

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

public int getStartPage() {

return startPage;

}

public void setStartPage(int startPage) {

this.startPage = startPage;

}

public int getEndPage() {

return endPage;

}

public void setEndPage(int endPage) {

this.endPage = endPage;

}

public int getPrePageNum() {

prePageNum = currentPageNum-1;

if(prePageNum<1){

prePageNum = 1;

}

return prePageNum;

}

public int getNextPageNum() {

nextPageNum = currentPageNum+1;

if(nextPageNum>totalPageNum){

nextPageNum = totalPageNum;

}

return nextPageNum;

}

public int getCurrentPageNum() {

return currentPageNum;

}

public void setCurrentPageNum(int currentPageNum) {

this.currentPageNum = currentPageNum;

}

public int getPageSize() {

return pageSize;

}

public void setPageSize(int pageSize) {

this.pageSize = pageSize;

}

public int getTotalRecords() {

return totalRecords;

}

public void setTotalRecords(int totalRecords) {

this.totalRecords = totalRecords;

}

public int getTotalPageNum() {

return totalPageNum;

}

public void setTotalPageNum(int totalPageNum) {

this.totalPageNum = totalPageNum;

}

public int getStartIndex() {

return startIndex;

}

public void setStartIndex(int startIndex) {

this.startIndex = startIndex;

}

public void setPrePageNum(int prePageNum) {

this.prePageNum = prePageNum;

}

public void setNextPageNum(int nextPageNum) {

this.nextPageNum = nextPageNum;

}

public List getList() {

return list;

}

public void setList(List list) {

this.list = list;

}

}

三、在servlet编写控制代码

首先用户发送请求,带上当前页数,在这表调用业务层的代码,把以分页的形式查询商品,再把商品查询出来之后赋值给我们创建的pageModel对象,这时候把这个对象传到前端页面,就可以把值取出来,实现分页。

public String findProductByCidWithPage(HttpServletRequest request, HttpServletResponse response) throws Exception {

//获取cid,num

String cid=request.getParameter("cid");

int curNum=Integer.parseInt(request.getParameter("num"));

//调用业务层的功能:以分页的形式查询当前页类别下商品信息

//返回PageModel对象(1当前页商品信息2分页3 url)

ProductService productService=new ProductServiceImp();

PageModel pm=productService.findProductByCidWithPage(cid,curNum);

//将PageModel对象放入request

request.setAttribute("page", pm);

//转发到/jsp/product_list.jsp

return "/jsp/product_list.jsp";

}

四、业务层service编写业务逻辑代码

当调用业务层的业务逻辑的时候,在这边我们是通过Dao层把我们要查询的商品查询出来用一个list接收,再传给pageModel的属性list,这时候就把整个pageModel对象传回去,这边主要是调用Dao层查询和 关联集合,关联URL。

public PageModel findProductByCidWithPage(String cid, int curNum) throws Exception {

//1 创建pageModel对象 目的:计算分页参数

//统计当前分类下商品的个数 select count(*) from product where cid=?

int totalRecords=productDao.findtotalRecords(cid);

PageModel pageModel=new PageModel(curNum, totalRecords, 12);

//2.关联集合 select * form product where cid=? limit ?,?

List list=productDao.findProductByCidWithPage(cid,pageModel.getStartIndex(),pageModel.getPageSize());

pageModel.setList(list);

//3.关联url

pageModel.setUrl("ProductServlet?method=findProductByCidWithPage&cid="+cid);

return pageModel;

}

五、Dao层操作数据库

为什么我们要在最开始分析sql语句,最根源就是在这边查询数据库,我们需要把起始页和分页大小传进去。

public List findProductByCidWithPage(String cid, int startIndex, int pageSize) throws Exception {

String sql="select * from product where cid=? limit ?,?";

QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());

return qr.query(sql, new BeanListHandler(Product.class),cid,startIndex,pageSize);

}

六、前端页面,显示分页

共${page.totalPageNum}页/第${page.currentPageNum}页

首页

上一页

${pagenum}

下一页

末页

function jump(){

var totalpage = ${page.totalPageNum};

var pagenum = document.getElementById("pagenum").value;

//判断输入的是一个数字

var reg =/^[1-9][0-9]{0,1}$/;

if(!reg.test(pagenum)){

//不是一个有效数字

alert("请输入符合规定的数字");

return ;

}

//判断输入的数字不能大于总页数

if(parseInt(pagenum)>parseInt(totalpage)){

//超过了总页数

alert("不能大于总页数");

return;

}

//转向分页显示的Servlet

window.location.href="${pageContext.request.contextPath}/${page.url}&num=" rel="external nofollow" +pagenum;

}

因为将我们所有需要的数据都封装在了pageModel中,pageModel对象又在request域中,所以在jsp页面中,我们只需要拿到我们所需要的数据,进行显示即可,构造导航图需要注意的有一点,逻辑要搞清楚,想要显示什么不想显示什么,全屏自己控制了,只需要记得一点,在请求Servlet时,需要把请求的页码交给服务器。不然服务器不知道你要获得第几页的数据。

总结

其实分页也不太难,一个难点就是javaBean的构建,只要弄清楚pageModel里面需要哪些属性,各种属性的作用是什么,就会很清晰了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java手写一个分页的方法_java web手写实现分页功能相关推荐

  1. Java写一个excel工具类_Java中Excel写操作工具类--Java免费学习网

    核心提示:package com.common.excel;import com.common.excel.exception.WriteExcelException;import jxl.Workb ...

  2. java显示html乱码怎么解决方法_Java web解决各种乱码问题

    首先先明白一下Java web里涉及到编码的地方: 1.jsp编码jsp顶部有两处:charset和pageEncoding charset:服务器发往客户端展现时的编码; pageEncoding: ...

  3. [js] 手写一个trim()的方法

    [js] 手写一个trim()的方法 function trim(str) { if (str[0] === ' ' && str[str.length - 1] === ' ') { ...

  4. java怎么调用另一个类的方法_java如何调用另一个类的方法

    java调用另一个类的方法:1.类方法用static修饰,代码为[public static void sayStatic()]:2.没有static修饰的方法,代码为[ public void sa ...

  5. 给 IConfiguration 写一个 GetAppSetting 扩展方法

    给 IConfiguration 写一个 GetAppSetting 扩展方法 Intro 在 .net core 中,微软已经默认使用 appsettings.json 来代替 app.config ...

  6. appsetting mysql_给IConfiguration写一个GetAppSetting扩展方法(示例代码)

    给 IConfiguration 写一个 GetAppSetting 扩展方法 Intro 在 .net core 中,微软已经默认使用 appsettings.json 来代替 app.config ...

  7. java计算器如何实现运算_用java编写了一个模拟计算器的界面设计,怎么实现运算功能呢...

    用java编写了一个模拟计算器的界面设计,怎么实现运算功能呢 2020 - 9 - 16 TAG : view sourceprint?import java.awt.BorderLayout; im ...

  8. java怎么调用另一个类的方法_Java设计模式:十篇,代码小白必看

    Java设计模式(一)----单例模式 一.特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且 ...

  9. java多线程有几种实现方法_Java多线程之间实现通讯

    一.课程目标 多线程之间如何通讯 wait.notify.notifyAll()方法 lock 停止线程 守护线程 Join方法 优先级 Yield 二.多线程之间如何实现通讯 2.1 什么是多线程之 ...

最新文章

  1. 简单而易忽视的http 404
  2. ITK:使用最小最大曲率流平滑RGB图像
  3. VTK:可视化之AssignCellColorsFromLUT
  4. oauth基本流程和原理
  5. asterisk账号和拨号方案mysql存储(静态)
  6. Spring Cloud构建微服务架构:服务网关(基础)【Dalston版】
  7. 副本引发的问题corrupt data exception
  8. angular五大服务顺序_IATF16949五大工具介绍
  9. 智头条:智能家居出货量将超5亿台;美的发布智能家居操作系统;萤石DL31FS人脸锁AI卓越版发布;小米发布人脸识别智能门锁
  10. 利用Adobe Photoshop 2020导入和批量输出论文中的图片
  11. 移动光猫上插usb储存设备在终端系统中该如何设置才能共享里面的文件。新手,小白,求大神指点
  12. Dom4j报错之java.lang.NoClassDefFoundError: org/jaxen/JaxenException的解决方案
  13. Hadoop 启动 HDFS DataNode 时报错:Invalid dfs.datanode.data.dir
  14. ubuntu 桌面卡死,鼠标能动但是点击无效。
  15. 中国互联网老总的经典妙语语录
  16. 树莓使用CUPS服务搭建打印机服务器
  17. android视频添加字幕,视频加字幕手机app
  18. Excel无法响应,挂起,冻结或停止工作
  19. 逻辑运算(按位取反)
  20. 上海财经应用统计考python_2020上财应用统计432考研高分经验贴

热门文章

  1. 小孩子才做选择,成年人都要,linux各发行版畅玩,建议收藏!
  2. 关于毕业设计汇报PPT
  3. oracle12c加密ted,Oracle数据透明加密-TDE
  4. java抽象工厂模式实例_Java设计模式百例 - 抽象工厂模式
  5. Seeker的奇妙求职冒险(杰杰的字节笔试)
  6. 小明系列故事——师兄帮帮忙
  7. 5.6 创建钱包服务
  8. 基于SpringBoot的微信订餐业务(第一章框架搭建和基本查询)
  9. 阿里easyExcel使用—上(1.1.2-beta5版本)
  10. 怎么恢复服务器电脑删除的文件,windows系统中u盘上被删除的文件怎么恢复?_网站服务器运行维护,windows,u盘,删除,恢复...