举例详解用Java实现web分页功能的方法

发布于 2020-11-25|

复制链接

摘记: 分页问题是一个非常普遍的问题,开发者几乎都会遇到,这里不讨论具体如何分页,说明一下Web方式下分页的原理。首先是查询获得一个结果集(表现为查询数据库获得的结果),如果结果比较多我们一般都不会一下显示所有的数据,那么就会用分页的方式来显示某些数据(比如20条)。因为Http的无状态性,每一次提交都是当作一个新的请求来处理,即使是换页,上一次的结果对下一次 ..

分页问题是一个非常普遍的问题,开发者几乎都会遇到,这里不讨论具体如何分页,说明一下Web方式下分页的原理。首先是查询获得一个结果集(表现为查询数据库获得的结果),如果结果比较多我们一般都不会一下显示所有的数据,那么就会用分页的方式来显示某些数据(比如20条)。因为Http的无状态性,每一次提交都是当作一个新的请求来处理,即使是换页,上一次的结果对下一次是没有影响的。这里总结三种实现分页的方式,不知道还有没有别的!1.每次取查询结果的所有数据,然后根据页码显示指定的纪录。

2.根据页面只取一页数据,然后显示这一页,这里要构造sql语句。

3.取一定页数的数据,就是前面两种的折中。这里还要注意的是这些数据是放在request还是session中,这里一一讨论1.一般不会放在session中,因为会占用大量内存,所以要放在request里面。

优点:实现比较简单,查询速度比较快。

缺点:占用内存多一些,网络传输数据多。

对于数据量比较少的查询这种方法比较合适。这里有人把数据放在session中,这样换页的时候就不用重新查询,但是这样是极其不好的,强烈建议不要这样使用。2.肯定不会放在session中,因为放在session中没有意义。

优点:占用内存少。

缺点:比较麻烦,必须先获得查询结果的总数,因为要知道有多少纪录才知道有多少页。另外要构造分页查询语句,对于不同的数据库是不一样的。3.这种情况是肯定放在session中了,要不然我干吗取好几页呀,这样的实现是为了减少数据库查询的次数,比如我保存第1到10的纪录,那么换页的时候如果在1到10之间就可以直接从session获取。如果换到11页,我可以重新设置缓存11到

20页的数据(或者5到15页的数据),这样的话换10次才需要一次数据库查询操作。

优点:占用内存相对不多,提高平均查询速度。

缺点:实现起来更加复杂,可能存在脏数据,需要自己定义一个缓存集合。如果查询的数据量比较大,可以考虑采用这样方式。下面的设计每次只获取一页数据,每次都要重新设置查询总数,具体如何获得自己实现,这是一个比较通用的分页实现。这里设计一个接口:

```java

package treeroot.util;

import java.util.List;

/**

* 该接口用来实现分页功能,注意这里没有提供修改的功能。

* @author treerot

* @version 1.0

* @since 2004-9-30

*/

public interface Pageable

{

/**

* 获得数据结果

* @return

*/

public List getResult();

/**

* 获得查询总数

* @return

*/

public int getCount();

/**

* 获得每页纪录数

* @return

*/

public int getPageSize();

/**

* 获得当前页编号

* @return

*/

public int getCurrentPage();

/**

* 获得总页数

* @return

*/

public int getPages();

/**

* 每页默认显示纪录数

*/

public final static int DEFAULT_PAGESIZE=20;

}

```

这个接口非常简单,就是包括一个结果列表和一些分页的必要信息,这里注意几点:

1.这个接口的实现表示的是某一次查询的某一页数据,和上次查询无关

2.这个接口的实现应该是只读的,也就是说不可以修改的。

3.getPages()方法是冗余的,但是这里仍然提供这个方法。下面给出一个抽象实现:

```java

package treeroot.util;

import java.util.List;

/**

* @author treerot

* @version 1.0

* @since 2004-9-30

*/

public abstract class AbstractPage implements Pageable

{

private int currentPage;

private int pageSize;

private int pages;

protected int count;

protected List result;

/**

* 指定当前页

* @param currentPage

* @throws PageException

*/

public AbstractPage(int currentPage){

this(currentPage,Pageable.DEFAULT_PAGESIZE);

}

/**

* 指定当前页和页大小

* @param currentPage

* @param pageSize

* @throws PageException

*/

public AbstractPage(int currentPage,int pageSize) {

this.currentPage=currentPage;

this.pageSize=pageSize;

}

protected void checkPage(int currentPage) throws PageException{

if((currentPagethis.getPages()))

throw new PageException("页超出范围:总页数为"+this.getPages()+",当前页为"+currentPage);

}

/**

* 这个方法被子类重写用来初始化,也就是计算count值和result结果,在子类 的构造函数中调用。

*/

abstract protected void init() throws PageException;

public List getResult()

{

return result;

}

public int getCount()

{

return count;

}

public int getPageSize()

{

return pageSize;

}

public int getCurrentPage()

{

return currentPage;

}

public int getPages()

{

if(pages==0) this.pages=(count+pageSize-1)/pageSize;

return pages;

}

}

```

这个抽象类实现了接口中的所有方法,但是定义了一个抽象方法init(),在子类中必须实现这个方法。上面的一个接口和一个抽象类看起来比较简单,你可能会觉得好像什么都没有做,实现上确实没有做什么,但是却可以给开发带来很大的帮助。我们可以根据自己的需要要继承这个抽象类,而数据可以通过各种方式获得,比如直接通过一个List获得,或者通过JDBC,Hibernate等等,不过我们都需要把结果封装到一个List里面,通过Hibernate就显得特别方便了。PageException是自定义的一个异常

```java

package treeroot.util

/**

* @author treeroot

* @version 1.0

* @since 2004-9-30

*/

public class PageException extends Exception

{

public PageException(){

super();

}

public PageException(String message){

super(message);

}

}

```

java web几百万分页_举例详解用Java实现web分页功能的方法相关推荐

  1. python 中split函数的应用_举例详解Python中的split()函数的使用方法

    函数:split() python中有split()和os.path.split()两个函数,具体作用如下: split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(li ...

  2. java泛型实例化_java基础-泛型举例详解

    泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...

  3. java阴阳师抽卡算法_阴阳师详解新的抽卡机制 全图鉴和SP获取更加简单

    原标题:阴阳师详解新的抽卡机制 全图鉴和SP获取更加简单 阴阳师随着大岳丸活动的临近,马上大家就要再次进入抽卡的热潮中了,而这次的新SSR大岳丸的获取,又一次更新了新的抽卡机制,本次就带来新抽卡机制详 ...

  4. java控制mac录音代码_操作详解丨如何用 Cybery 控制 mac OS系统下的录音软件(DAW)...

    原标题:操作详解丨如何用 Cybery 控制 mac OS系统下的录音软件(DAW) Cybery可以在各主流平台/操作系统下实现MIDI控制功能:mac OS(可通过蓝牙.USB线或者借助其它硬件连 ...

  5. java五子棋代码详解_代码详解:Java和Valohai的深度学习之旅

    全文共10735字,预计学习时长22分钟或更长 有一款生命周期管理工具(也称云服务)叫做Valohai,它有着友好的用户界面和简洁的布局设计. 许多有关Valohai的案例和文档都是基于Python和 ...

  6. java中类似实例化顺序_由浅入深详解Java 类的实例化顺序

    文章目录 一.构造方法与代码块的先后顺序 1.1 构造方法 1.2 构造方法与普通代码块 1.3 构造方法与代码块 1.4 总结 二.变量的先后顺序 三.变量.构造方法与代码块 3.1 变量与构造方法 ...

  7. ios 模拟器沙盒_举例详解iOS开发过程中的沙盒机制与文件

    iOS沙盒机制 iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 每 ...

  8. Java多线程实现跑步比赛【比赛详解】

    文章目录 文章链接 实现要求 比赛详解 文章链接 Java多线程实现跑步比赛[比赛详解] Java多线程实现跑步比赛[基本设计] Java多线程实现跑步比赛[RunMap--地图映射类] Java多线 ...

  9. Java堆和栈的区别/联系详解

    Java堆和栈的区别/联系详解 关于Java中堆栈内存的知识,算是基础知识,和C语言中的指针有一些类似,面试中也经常会被问到,特别是跟Java和C都有关的开发工作. 一.堆栈的联系 在Java中,内存 ...

最新文章

  1. Openg-三角形绘制
  2. 利用逆矩阵解线性方程组_机器人学导论---第四章 操作臂逆运动学(一)4.1-4.11...
  3. JsonRequestBehavior.AllowGet 方便浏览器调试
  4. PetShop4.0--转载
  5. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)
  6. Halcon算子学习:get_sheet_of_light_result
  7. mac mail 删除邮件服务器,Mac邮件应用程序Mail设置
  8. 【Java】浅析八种基本类型
  9. qscoj:默契值(状压DP)
  10. manual 离线手册 韩顺平php_PHP - Manual: 手册的格式 (官方文档)
  11. 矢量绘图设计专业工具:Sketch 84 for mac
  12. K8S学习笔记之借助Minikube完成在windows环境下Kubernetes的单节点搭建-(超级简单)
  13. DP算法——打家劫舍系列
  14. android9支持的tf卡格式,老手机福音 三星安卓9.0测试存储卡装应用功能
  15. 实验三 图像空间域平滑与锐化(Python实现)
  16. Ceisum 计算向量夹角及垂足
  17. java 用户态_内核启动用户态的程序 - 但行好事 莫问前程 - JavaEye技术网站
  18. 电脑连上网络,浏览器上不了网?
  19. 多多情报通:拼多多什么软件可以看到大数据?拼多多大数据分析软件有哪些?
  20. 编程之美1:那些关于1的个数的经典面试题

热门文章

  1. PowerDesigner模型设计1
  2. 一个关于C++ Inline关键字的引发的一个错误
  3. 魔改部署自己专属的合成大西瓜(三:上线篇<踩坑篇>)
  4. qlineargradient线性渐变
  5. Emacs代码折叠/显示
  6. 单链表反转(递归和非递归)
  7. C++关键字 friend
  8. vscode之parcel清空dist目录
  9. python修复不了_python-如何修复cm.spectral(模块“ matplotlib.cm”...
  10. php+mysql案例含源码_[源码和文档分享]基于PHP和MYSQL数据库实现的失物招领系统...