`
sunjw
  • 浏览: 6470 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

在JSF中实现分页(二)

阅读更多
前面一篇直接使用了Myfaces中的两个Component完成了一个简单的分页,这里将会介绍一种On-demand loading的方法来进行分页,仅仅在需要数据的时候加载。<o:p></o:p>

     先来说一些题外话,为了实现这种方式的分页,公司里大约5-6个人做了半个多月的工作,扩展了dataTable,修改了dataScrollor,以及各种其他的方法,但是都不是很优雅。在上个月底的时候,在MyfacesMail List中也针对这个问题展开了一系列的讨论,最后有人总结了讨论中提出的比较好的方法,提出了以下的分页方法,也是目前实现的最为优雅的方法,也就是不对dataTabledataScrollor做任何修改,仅仅通过扩展DataModel来实现分页。<o:p></o:p>

     DataModel 是一个抽象类,用于封装各种类型的数据源和数据对象的访问,JSFdataTable中绑定的数据实际上被包装成了一个DataModel,以消除各种不同数据源和数据类型的复杂性,在前面一篇中我们访问数据库并拿到了一个List,交给dataTable,这时候,JSF会将这个List包装成 ListDataModel dataTable访问数据都是通过这个DataModel进行的,而不是直接使用List<o:p></o:p>

     接下来我们要将需要的页的数据封装到一个DataPage中去,这个类表示了我们需要的一页的数据,里面包含有三个元素:datasetSizestartRow,和一个用于表示具体数据的ListdatasetSize表示了这个记录集的总条数,查询数据的时候,使用同样的条件取count即可,startRow表示该页的起始行在数据库中所有记录集中的位置。

<o:p></o:p>

/** */ /**
 * A simple class that represents a "page" of data out of a longer set, ie a
 * list of objects together with info to indicate the starting row and the full
 * size of the dataset. EJBs can return instances of this type when returning
 * subsets of available data.
 
*/

public   class  DataPage
{
    
private   int  datasetSize;
    
private   int  startRow;
    
private  List data;

    
/** */ /**
     * Create an object representing a sublist of a dataset.
     * 
     * 
@param  datasetSize
     *            is the total number of matching rows available.
     * 
     * 
@param  startRow
     *            is the index within the complete dataset of the first element
     *            in the data list.
     * 
     * 
@param  data
     *            is a list of consecutive objects from the dataset.
     
*/

    
public  DataPage( int  datasetSize,  int  startRow, List data)
    
{
        
this .datasetSize  =  datasetSize;
        
this .startRow  =  startRow;
        
this .data  =  data;
    }


    
/** */ /**
     * Return the number of items in the full dataset.
     
*/

    
public   int  getDatasetSize()
    
{
        
return  datasetSize;
    }


    
/** */ /**
     * Return the offset within the full dataset of the first element in the
     * list held by this object.
     
*/

    
public   int  getStartRow()
    
{
        
return  startRow;
    }


    
/** */ /**
     * Return the list of objects held by this object, which is a continuous
     * subset of the full dataset.
     
*/

    
public  List getData()
    
{
        
return  data;
    }

}

     接下来,我们要对DataModel进行封装,达到我们分页的要求。该DataModel仅仅持有了一页的数据DataPage,并在适当的时候加载数据,读取我们需要页的数据。<o:p></o:p>


/** */ /**
 * A special type of JSF DataModel to allow a datatable and datascroller to page
 * through a large set of data without having to hold the entire set of data in
 * memory at once.
 * <p>
 * Any time a managed bean wants to avoid holding an entire dataset, the managed
 * bean should declare an inner class which extends this class and implements
 * the fetchData method. This method is called as needed when the table requires
 * data that isn't available in the current data page held by this object.
 * <p>
 * This does require the managed bean (and in general the business method that
 * the managed bean uses) to provide the data wrapped in a DataPage object that
 * provides info on the full size of the dataset.
 
*/

public   abstract   class  PagedListDataModel  extends  DataModel
{
    
int  pageSize;
    
int  rowIndex;
    DataPage page;

    
/** */ /**
     * Create a datamodel that pages through the data showing the specified
     * number of rows on each page.
     
*/

    
public  PagedListDataModel( int  pageSize)
    
{
        
super ();
        
this .pageSize  =  pageSize;
        
this .rowIndex  =   - 1 ;
        
this .page  =   null ;
    }


    
/** */ /**
     * Not used in this class; data is fetched via a callback to the fetchData
     * method rather than by explicitly assigning a list.
     
*/


    
public   void  setWrappedData(Object o)
    
{
        
if (o  instanceof  DataPage)
        
{
            
this .page  =  (DataPage) o;
        }

        
else
        
{
            
throw   new  UnsupportedOperationException( " setWrappedData " );
        }

    }


    
public   int  getRowIndex()
    
{
        
return  rowIndex;
    }


    
/** */ /**
     * Specify what the "current row" within the dataset is. Note that the
     * UIData component will repeatedly call this method followed by getRowData
     * to obtain the objects to render in the table.
     
*/


    
public   void  setRowIndex( int  index)
    
{
        rowIndex 
=  index;
    }


    
/** */ /**
     * Return the total number of rows of data available (not just the number of
     * rows in the current page!).
     
*/


    
public   int  getRowCount()
    
{
        
return  getPage().getDatasetSize();
    }


    
/** */ /**
     * Return a DataPage object; if one is not currently available then fetch
     * one. Note that this doesn't ensure that the datapage returned includes
     * the current rowIndex row; see getRowData.
     
*/

    
private  DataPage getPage()
    
{
        
if  (page  !=   null )
        
{
            
return  page;
        }


        
int  rowIndex  =  getRowIndex();
        
int  startRow  =  rowIndex;
        
if  (rowIndex  ==   - 1 )
        
分享到:
评论
1 楼 windywindy 2008-12-04  
怎么只有上文没有下文的??期待中......

相关推荐

    jsf分页 jsf分页 jsf分页

    虽然可以手动实现分页,但使用成熟的JSF组件库(如PrimeFaces、RichFaces等)可以使工作变得更加简单。以PrimeFaces为例,`p:dataTable`组件自带了分页功能,只需配置`rows`属性(每页记录数)和`paginator`属性...

    JSF分页实现,内含建表语句

    在本项目中,我们主要探讨的是如何利用JavaServer Faces (JSF) 框架实现分页功能,并结合MySQL数据库和SQL语句进行数据管理。JSF是一种用于构建Web应用程序的MVC(Model-View-Controller)框架,它提供了一种组件化...

    jsf自带分页

    在JSF中,处理大量数据时,分页功能是必不可少的,它可以提高用户体验,减少一次性加载过多数据对服务器和网络资源的压力。本文将深入探讨JSF自带的分页功能,并结合提供的博客链接进行讲解。 在JSF中,分页通常...

    JSF经典的js分页

    "JSF经典的js分页"是一个示例,展示了如何在JSF应用中实现纯JavaScript(js)的分页功能。这个例子,即PageDemo,旨在提供一个代码简洁、易于理解的分页解决方案。 首先,我们需要了解JSF的基本概念。JSF是一个用于...

    jsf 分页

    总之,在JSF中实现分页,我们可以选择利用第三方库如PrimeFaces提供的组件,或者自己编写逻辑处理分页。这两种方法都有其优缺点,具体选择取决于项目需求和个人喜好。无论哪种方式,关键在于理解分页的基本原理,...

    利用自定义渲染器实现JSF数据库表分页显示

    通过使用自定义渲染器实现分页功能,可以极大地提高JSF应用程序的性能和用户体验。这种方法不仅易于集成,而且可以根据具体需求进行高度定制。掌握了这一技术,就可以轻松应对各种复杂的分页需求,为JSF开发带来更多...

    JSF数据分页的简单实现

    JSF分页有不少的组件可以使用,但用起来都不是想象的那么简单,这里自己实现了一个简单的分页实现,以提供大家分享。 有更好的意见请留言。或者去...

    jsf 分页实例jsf 分页实例

    本实例将详细讲解如何在JSF中实现分页。 ### 1. 分页组件选择 在JSF中,可以使用开源库如PrimeFaces、RichFaces或ICEfaces等提供的分页组件。这里以PrimeFaces为例,因为它拥有广泛的应用和丰富的组件库。...

    JSF分页组件2

    在JSF中,我们可以使用各种分页组件来实现这一功能。本文将深入探讨JSF分页组件2的相关知识点,包括其原理、使用方法和最佳实践。 ### 1. 分页组件的基本概念 分页组件允许用户以有限的数量逐页查看数据,而不是一...

    JSF分页控件 ,支持大容量可查询分页

    在JSF中,分页通常通过自定义组件或利用现有的第三方库如PrimeFaces、RichFaces等实现。 "JSF分页控件" 可能是基于某个特定的JSF库,比如PrimeFaces中的`p:datascroller`或`p:paginator`,或者自定义的组件。这些...

    JSF中自定义分页呈现器(Render)的实现和应用

    为了解决这些问题,本文提出了一种结合JSF自定义呈现器组件技术实现分页查询的方法。 #### 自定义分页呈现器的设计原理 自定义分页呈现器的核心思想在于实现JSF中的自定义渲染器(Renderer),该渲染器负责绘制...

    JSF分页组件

    在JSF中,我们可以通过自定义组件或者使用现有的库如PrimeFaces或RichFaces来实现这些功能。 **2. 自定义JSF分页组件** 创建自定义分页组件涉及以下几个步骤: - **设计组件**: 首先,你需要设计一个UI组件,包含...

    JSF数据分页的简单例子(源码)

    2. **实现分页逻辑**:在Managed Bean中,我们需要编写方法来计算总页数,以及根据当前页码获取相应的数据子集。这通常涉及到对数据集合的切片操作。 3. **配置Data Table**:在JSF页面(通常是`.xhtml`文件)上,...

    jsf 动态分页 带jar包 解压直接导入eclipse即可,方便学习~

    4. **后台处理**:在Bean中实现分页逻辑,包括计算总页数、根据页码获取数据等。 5. **数据绑定**:将获取的数据集合绑定到UI组件,如`&lt;p:dataTable value="#{bean.dataList}" var="item"&gt;`。 **4. 示例代码** ```...

    jsf分页——详细源码 测试通过

    在JavaScript Server Faces (JSF) 中...总的来说,这个源码示例对于学习和理解如何在JSF项目中实现分页功能非常有帮助。开发者可以通过阅读和理解代码,掌握如何将分页集成到自己的应用中,提升项目的效率和用户体验。

    jsf增删改查分页例子

    JSF提供了诸如`p:paginator`(PrimeFaces库中的分页组件)这样的工具,配合数据源(如JPA的`List`或`Set`)实现分页效果。分页组件通常有上一页、下一页、跳转到指定页等功能。 6. **Entity类和DAO(Data Access ...

    struts和jsf分页

    在JSF中实现分页,可以使用内置的UI组件或者第三方库: 1. **UI组件**:JSF提供了一些内置的UI组件,如`p:paginator`(PrimeFaces扩展库)和`h:commandLink`,可以通过这些组件轻松创建分页界面。 2. **Managed ...

    JSF+Spring+Hibernate 分页显示

    在分页显示场景中,JSF可以通过`p:paginator`等组件帮助我们在前端实现分页导航。 **Spring框架** Spring是一个全面的后端开发框架,它支持依赖注入(DI)、AOP(面向切面编程)、MVC(模型-视图-控制器)模式等。在分页...

    JSF分页代码和学习文件1

    JSF提供了多种实现分页的方法,包括使用核心标签库(Core Tags)、自定义组件或者利用第三方库如PrimeFaces。 1. **j-jsf4comps**:这个文件可能包含了一些JSF自定义组件,自定义组件允许开发者扩展JSF的默认组件库...

Global site tag (gtag.js) - Google Analytics