- 浏览: 137902 次
文章分类
最新评论
-
qiaolevip:
求源码:qiaole@vip.qq.com
使用JAVA中的动态代理实现数据库连接池 -
qiaolevip:
使用JAVA中的动态代理实现数据库连接池 -
qiaolevip:
:ro ll:
使用JAVA中的动态代理实现数据库连接池 -
qp7711:
那这里是在哪里传参的?
通用分页实现及其OO设计探讨——转载 -
yaoaijia:
源码怎么都没有啊?
使用JAVA中的动态代理实现数据库连接池
分页是一种常用的页面数据显示技术,分页能够通过减少页面数据处理量从而提高了系统的性能。分页应该是做WEB开发必须掌握的一个小技术。而分页却是复杂的,倒不是它的技术有多复杂;而是有太多的重复代码,这些代码都难以重用。能不能实现一个通用的分页框架?每次只需要去覆写一两个方法,通过少量的代码就能实现分页的功能?
一、一般分页应该要具有的功能有:
1. 灵活的设置分页大小。可以动态的设置分页大小,而不是写死到代码中。
2. 自动计算总页数。根据分页大小和总记录数自动计算总页数。
3. 获得当前页的页号。
4. 获得当前页的总记录数。一般是最后一页的时候可能会小于分页大小。
5. 判断当前页是否为第一页。
6. 判断当前页是否为最后一页。
7. 判断当前页是否有上一页。
8. 判断当前页是否有下一页。
9. 获得当前页的数据列表。
10. 获得当前页的第一条记录的索引号
11. 获得当前页的最后一条记录的索引号。
二、常用的分页技术
目前常用的分页技术有两种:
1. 第一次访问是读取所有记录,放入session中,然后每次从session对象中读取当前页的数据
2. 每次都访问数据库,从数据库中读取当前页的记录。
这两种方法都各有优缺点,当数据量比较少时,第一种方法无疑是要快一些,因为减少与数据库的连接访问。而当数据量比较大时,比如查询结果可能会是上万条,那么内存的开销是十分大的,放到session中还有一个问题是能不能及时的清除无用的对象。而且这么大数据量在网络中传输也会使系统变得很慢。
第二种方法就是专门解决这个问题的,它每次访问数据库,只读取当前页所需的记录,大大的减少网络传输量;它不会把页数据放到session中,大大提高服务器的性能。
所以第二种方式要优于第一种方法。Session不要乱用,要用也仅仅是存放一些公共变量,相对于占用空间比较少的对象。不适合存放大量的数据,否则在很多个用户同时访问时那么系统会很慢,因为服务器内存被销耗的很厉害。
作为一个通用分页框架,
1.应该不依赖于任何其它框架
2.应该支持多种数据库
3.应该可以应用于任何web框架中,如:struts,spring等。
4.应该把数据访问的具体实现留给用户去实现。
5.应该实现关键的算法和过程,如:计算总页数,所需的实始化动作。
6.应该减化Contrller控制器的代码,以往的分页技术在Contrller中存在太多的 if…else代码。十分难懂,应该由一个辅助类来实现。
7.应该减化jsp页面的代码,页面应该没有任何与分页相关的计算。应该由分页对象来实现。
8.应该支持两种分页方式,采用session或不采用session由用户控制。
- ViewPage.java
- /**
- * 分页接口
- */
- public interface ViewPage {
- /**
- * 获取总页数
- * @return 总页数
- */
- public int getPageCount();
- /**
- * 获得页面大小
- * @return 页面大小
- */
- public int getPageSize();
- /**
- * 设置页面大小
- * @param size
- */
- public void setPageSize(int size);
- /**
- * 获得当前页数据
- * @return 数据列表
- */
- public List getPageData();
- /**
- * 获得当前页索引号
- * @return 当前页索引号
- */
- public int getPageIndex();
- /**
- * 获得当前页记录总数
- * @return 当前页记录总数
- */
- public int getPageRows();
- /**
- * 是否有下一页
- * @return
- */
- public boolean getHashNextPage();
- /**
- * 是否有上一页
- * @return
- */
- public boolean getHashPreviousPage();
- /**
- * 转到尾页
- *
- */
- public void gotoLastPage();
- /**
- * 转到首页
- *
- */
- public void gotoFirstPage();
- /**
- * 是否首页
- * @return
- */
- public boolean isFirstPage();
- /**
- * 是否尾页
- * @return
- */
- public boolean isLastPage();
- /**
- * 转到上一页
- *
- */
- public void gotoPreviousPage();
- /**
- * 转到下一页
- *
- */
- public void gotoNextPage();
- /**
- * 转到指定页面,pageIndex小于1时,转到第一页;pageIndex大于总页数时,转到最尾页
- * @param pageIndex 指定的页号
- */
- public void gotoPage(int pageIndex);
- /**
- * 获取当前页第一条记录的记录号
- * @return int 当前页第一条记录的记录号
- */
- public int getPageFirstRecord();
- /**
- * 获取当前页最后一条记录的记录号
- * @return int 当前页最后一条记录的记录号
- */
- public int getPageLastRecord();
- }
- AbstractViewPage.java
- /**
- * 分页默认抽象实现
- * 初始时,分页类有下列默认值:
- * 分页大小为-1,为不分页;
- * 总页数为1页
- * 当前页为第一页
- * 总记录数为0条
- * 当前页数据列表为没有任何记录的列表
- *
- */
- public abstract class AbstractViewPage implements ViewPage {
- //-----------------------------------------
- //私有静态常量
- //-----------------------------------------
- private static final int DEFAULT_PAGE_INDEX = 1;
- private static final int DEFALT_PAGE_COUNT = 1;
- private static final int DEFAULT_PAGE_SIZE = -1;
- private static final int DEFAULT_ROWS = 0;
- //-----------------------------------------
- //私有成员变量
- //-----------------------------------------
- /**当前页索引号**/
- private int pageIndex = DEFAULT_PAGE_INDEX;
- /**总页数**/
- private int pageCount =DEFALT_PAGE_COUNT;
- /**分页大小**/
- private int pageSize = DEFAULT_PAGE_SIZE ;
- /**数据总记录数**/
- private int rows = DEFAULT_ROWS;
- //------------------------------------------
- //本地成员变量getter,setter方法
- //------------------------------------------
- /**
- * 设置新页号,只有大于等于1而且小于等于总页数并且不为当前页时,才允许设置
- * @param pageIndex The pageIndex to set.
- */
- private void setPageIndex(int newPageIndex) {
- if( newPageIndex >= this.DEFAULT_PAGE_INDEX && newPageIndex <= this.getPageCount() && newPageIndex != this.pageIndex) {
- this.pageIndex = newPageIndex;
- }
- }
- /**
- * @return Returns the rows.
- */
- private int getRows() {
- return rows;
- }
- /**
- * @param rows The rows to set.
- */
- private void setRows(int rows) {
- this.rows = rows;
- }
- /**
- * @param pageCount The pageCount to set.
- */
- private void setPageCount(int pageCount) {
- this.pageCount = pageCount;
- }
- //--------------------------------------
- //实现Page接口方法
- //--------------------------------------
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageData()
- */
- public List getPageData() {
- List pageList =null;
- //获得当前页数据
- pageList = this.pageList(this.getPageFirstRecord(), this.getPageRows());
- //保证不返回null
- if(pageList == null) {
- pageList =new ArrayList();
- }
- return pageList;
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageIndex()
- */
- public int getPageIndex() {
- return this.pageIndex;
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#isFirstPage()
- */
- public boolean isFirstPage() {
- return this.DEFAULT_PAGE_INDEX ==this.pageIndex;
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#isLastPage()
- */
- public boolean isLastPage() {
- //当前页索引为总页数时为最后一页
- return this.pageIndex == this.pageCount;
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getHashNextPage()
- */
- public boolean getHashNextPage() {
- //当前页索引号小于总页数
- return this.pageIndex < this.pageCount ;
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getHashPreviousPage()
- */
- public boolean getHashPreviousPage() {
- //当前页索引号大于默认的初始页号,这里为1
- return this.pageIndex > this.DEFAULT_PAGE_INDEX ;
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageCount()
- */
- public int getPageCount() {
- return this.pageCount;
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageSize()
- */
- public int getPageSize() {
- return this.pageSize;
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageRows()
- */
- public int getPageRows() {
- //当页面大小为-1 时,返回总记录数
- if(this.DEFAULT_PAGE_SIZE == this.pageSize ) {
- return this.rows;
- }
- //不为最后一页时,返回pageSize
- if(!this.isLastPage()) {
- return this.pageSize;
- }
- //最后一页时
- return this.rows - (this.pageSize * (this.pageCount -1));
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageFirstRecord()
- */
- public int getPageFirstRecord() {
- //页大小为-1 时
- if(this.DEFAULT_PAGE_SIZE== this.pageSize ) {
- return 0;
- }
- return (this.pageIndex -1)* this.pageSize;
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#getPageLastRecord()
- */
- public int getPageLastRecord() {
- //页大小为-1时,返回总记录数
- if(this.DEFAULT_PAGE_SIZE == this.pageSize) {
- return this.rows;
- }
- return this.getPageFirstRecord() + this.getPageRows() ;
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#gotoFirstPage()
- */
- public void gotoFirstPage() {
- this.gotoPage(this.DEFAULT_PAGE_INDEX);
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#gotoLastPage()
- */
- public void gotoLastPage() {
- this.gotoPage(this.getPageCount());
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#gotoPreviousPage()
- */
- public void gotoPreviousPage() {
- this.gotoPage(this.getPageIndex() -1);
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#gotoNextPage()
- */
- public void gotoNextPage() {
- this.gotoPage(this.getPageIndex() + 1);
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#gotoPage(int)
- */
- public void gotoPage(int newPageIndex) {
- if( newPageIndex >= this.DEFAULT_PAGE_INDEX && newPageIndex <= this.getPageCount() ) {
- this.setPageIndex(newPageIndex);
- }
- }
- /**
- * @see com.palic.elis.pos.junit.counter.web.mvc.ViewPage#setPageSize(int)
- */
- public void setPageSize(int size) {
- if(size < 1) {
- size = 1;
- }
- this.pageSize = size;
- //进行初始化
- this.doInit();
- }
- //-----------------------------------
- //辅助方法
- //-----------------------------------
- /**
- * 分页初始化方法,为了保证总是能正确的初始化,所以声明为final ,为了让子类可以调用声明为protected
- *
- */
- protected final void doInit() {
- int rows = 0;
- //获得总记录数
- rows= totalRows();
- //设置总记录数
- this.setRows(rows);
- //设置新的总页数
- //计算并设置总页数
- int pages = calculatePageCount();
- this.setPageCount(pages);
- //转到第一页
- this.gotoPage(this.DEFAULT_PAGE_INDEX);
- onInit();
- }
- /**
- * 记算总页数
- * @return 总页数
- */
- private int calculatePageCount() {
- //总记录数为0条,则返回的总页数为1
- if(this.getRows() == 0) {
- return this.DEFALT_PAGE_COUNT;
- }
- //如果页面大小为-1,则返回的总页数为1
- if(this.DEFAULT_PAGE_SIZE == this.getPageSize() ) {
- return this.DEFALT_PAGE_COUNT;
- }
- return this.getRows() / this.getPageSize() + ( this.getRows() % this.getPageSize() ==0 ? 0 :1);
- }
- /**
- * 获得总记录数,调用queryTotalRows(),将异常封装为non-checked 异常
- * @return 总记录数
- * @throws ApplicationRuntimeException
- */
- private int totalRows() throws ApplicationRuntimeException{
- try{
- return queryTotalRows();
- }
- catch(Exception ex){
- throw new ApplicationRuntimeException(ex);
- }
- }
- /**
- * 获得当前页数据,调用queryPageList()方法,将异常封装为non-checked异常
- * @param startRow 开始记录号
- * @param rowCount 记录总数
- * @return 当前页数据
- * @throws ApplicationRuntimeException
- */
- private List pageList(int startRow, int rowCount) throws ApplicationRuntimeException{
- try{
- return queryPageList(startRow, rowCount);
- }catch(Exception ex){
- throw new ApplicationRuntimeException(ex);
- }
- }
- //-----------------------------------------
- //子类实现的方法
- //-----------------------------------------
- /**
- * 初始化附加方法,由子类扩展
- */
- protected void onInit() {
- }
- /**
- * 查询获得总记录数,由子类具体实现
- * @return 总记录数
- * @throws Exception
- */
- protected abstract int queryTotalRows() throws Exception;
- /**
- * 查询当前页数据,从startRow 开始的rowCount条记录
- * @param startRow 开始记录号
- * @param rowCount 记录总数
- * @return 当前页数据
- * @throws Exception
- */
- protected abstract List queryPageList(int startRow, int rowCount) throws Exception;
- }
发表评论
-
FileUtils_下载小应用
2009-06-15 13:09 1296FileExportUtils import java.io ... -
Javaz统计中英文个数__解决技巧[20070924]
2009-02-22 21:04 1265import java.util.ArrayList; imp ... -
JAVA模式--看守者模式的小应用
2008-12-03 14:50 1151好久没写了,随便写点东西,不然脑袋都得大掉,还希望 ... -
POI操作excel示例工具类
2008-07-04 09:29 2988由于近期项目要用到excel来转存页面中的表单数据,对poi操 ... -
JAXP解析XML+XSL转换过程
2007-11-21 19:36 15721. 在解析的过程中,此版本用dom4j解析 ... -
EJB入门
2007-10-29 18:50 1310java 代码 package com.test ... -
String与StringBuffer
2007-10-29 11:11 1504String的创建 String s = "he ... -
linux下安装jdk和eclipse之java环境
2007-10-18 10:34 41571、去http://java.sun.com/j2se/1.4 ... -
使用JAVA中的动态代理实现数据库连接池
2007-08-16 13:40 1405级别: 初级 刘冬 (winter.lau@163.com), ... -
利用Java动态编译计算数学表达式
2007-08-09 16:03 10255前几天要做一个计算数学表达式的题目,本来计划使用解析表达式的方 ... -
for循环的效率疑问
2007-07-18 13:29 2508编写代码的时候,突然想到 java 代码 java 代码 ...
相关推荐
本话题将深入探讨“通用分页实现及其OO设计”,结合给定的“Paginaction.jsp”文件,我们可以进一步了解在Java Web开发中如何有效地实现分页功能。 首先,我们需要理解分页的基本概念。分页是将大量数据分割成多个...
Java 通用分页详解 Java 通用分页是指在Java编程中对大量数据进行分页处理,以提高系统效率和性能。下面对Java通用分页的知识点进行详细说明: 1. 分页的必要性 在实际项目中,数据量可能非常大,直接查询所有...
本压缩包“超强php分页打包 通用分页 万能分页 ajax分页 google分页”提供了一系列的分页解决方案,包括了基本的PHP分页、通用的分页实现、以及结合AJAX技术的动态分页,旨在满足各种项目需求。下面将详细介绍这些...
sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程
这个"java通用分页代码实例"应该包含了上述概念的实现,你可以通过解压"page"文件查看具体代码,学习如何将这些理论应用到实践中。通过学习和理解这个实例,你可以更好地掌握Java中的分页技术,并将其应用于自己的...
在这个项目中,"SSM实现通用分页"指的是通过这三个框架来实现数据的分页展示功能,这在大数据量的网页展示中尤为重要,可以有效提升用户体验并减轻服务器压力。 首先,Struts2作为MVC框架,负责处理HTTP请求和响应...
使用SQL语句实现通用分页查询,支持模糊查询等。
本文将详细探讨"JAVA写的通用分页"这一主题,结合描述中的"通用高效分页存储过程实现",我们将深入理解Java分页的原理、实现方式以及优化策略。 首先,分页的基本概念是将大量数据分块展示,而不是一次性加载所有...
总结,通用分页方法接口的设计与实现是软件开发中的重要组成部分,它能够提高代码的复用性和可维护性,同时提供高效、灵活的数据展示方式。通过理解并熟练运用这种接口,开发者可以更好地应对大数据量的挑战,提升...
Mybatis通用分页插件是Java开发中广泛使用的ORM(对象关系映射)框架扩展,主要针对Mybatis进行优化,提供了高效便捷的分页功能。这个插件的目的是简化在数据库查询时的分页操作,使得开发者能够更专注于业务逻辑,...
"封装通用的Spring3+Struts2+JPA的CRUD 通用分页实现"是一个典型的Java Web开发实践,它结合了Spring框架的依赖注入、Struts2的MVC模式以及JPA(Java Persistence API)的数据持久层处理,来实现数据的创建、读取、...
SSH分页 分页 通用分页 struts2分页
本DEMO主要展示了如何实现一个通用的分页功能,覆盖了后台和前台的处理逻辑。以下是对这个主题的详细阐述: 一、分页原理 分页的核心原理是通过限制每次查询的数据量,只获取用户当前需要查看的一部分数据,同时...
综上所述,Java实现分页通用代码主要包括创建Page对象、处理分页参数、编写分页SQL、填充Page对象及提供相关辅助方法。在实际项目中,这些组件可以抽象成一个通用的分页工具类或者服务,以提高代码复用性和可维护性...
描述中没有提供具体信息,但我们可以推测这个压缩包可能包含了一个示例项目或者代码库,用于演示如何在C#和ASP.NET中实现通用的分页功能。这可能包括一个数据库查询、数据绑定到分页控件,以及相关的用户界面设计。 ...
hibernate_mysql_struts2 实现的通用分页类.欢迎指正
在本文中,我们将深入探讨如何使用Swiper这个流行的JavaScript滑动插件来自定义分页器,特别是将其设计成时间轴的样式。Swiper是一个强大的触摸滑动库,广泛应用于网页和移动应用中,用于创建幻灯片、产品滑块和其他...
ASP通用分页代码是网页开发中的一个重要组成部分,特别是在处理大量数据需要分页显示的场景下。这个代码模块的目的是为了提高开发效率,实现代码的复用,并确保用户在浏览多页内容时能轻松导航。以下将详细介绍这个...