举例详解用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. hive 使用技巧笔记
  2. centos重启网络失败Job for network.service failed,ping不通网络
  3. 批处理-取年月日、时分秒毫秒
  4. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | ActivityThread 后续分析 | Application 替换位置 )
  5. 移动应用ios和网页应用_如何在iOS上一次移动多个应用
  6. Android之解决布局文件图片太大同步放缩后挤掉其它布局的问题
  7. WCF学习之旅—实现支持REST客户端应用(二十四)
  8. win8.1 windows无法在此计算机上设置家庭组,【求助】Windows无法从该家庭组中删除你的计算机...
  9. linux服务器如何访问,如何连接一个Linux服务器
  10. supervessel-免费云镜像︱GPU加速的Caffe深度学习开发环境
  11. docker--强制删除none的image镜像
  12. hutool-all 导入Excel 文件 学习笔记
  13. linux7.4邮件服务器,Centos7.4搭建邮件收发服务器(部署篇)
  14. matlab 200阶乘怎么表示,matlab阶乘怎么表示
  15. vue对table的某一行的数据进行编辑,删除,查看详情操作
  16. 001-markdown简介,插件的下载和导出
  17. php给发qq消息,PHP 模拟QQ登录及发送消息实现方法
  18. 【NOIP 费用流】JZOJ_3029 观光公交
  19. Renesas_based_intro
  20. JAVA对接短信通知接口

热门文章

  1. perf 函数调用性能(函数流程图)
  2. BZOJ 1599: [Usaco2008 Oct]笨重的石子( 枚举 )
  3. POJ 1330:Nearest Common Ancestors【lca】
  4. MySQL 数据库笔记
  5. Silverlight中动画的性能浅析
  6. 暑假集训第四场选拔赛 解题报告
  7. 快应用实现网络测速功能_网络阅卷系统应用系统功能实现情况
  8. FFmpeg的编解码(二)
  9. android sepolicy报错解决
  10. github README.md使用