`

JSF中分页的实现方式

    博客分类:
  • Jsf
阅读更多
在Web应用中如果遇到大数据集要处理时,分页显示往往是一个很好的解决方法。但是在JSF中没有直接实现分页显示的组件。但在Myfaces里的分页组件dataScroller如果直接显示的话,必须一次性的比所有要显示的记录都要检索出来,如果有10000条记录的话,一次性把这些记录全部检索出来的话,那么所消耗的内存是不敢想像的。所以我们应该做的是需要一页就检索一页。我最近在http://wiki.apache.org/myfaces/WorkingWithLargeTables上页看到的一篇文章就实现了我所实现的功能。下面是我应用此方法所实现的一个分页显示:

 

 

 

首先得写一个用来包装一个页面数据的类:

 

 

 

package doorban.business;

 

import java.util.List;

 

public class DataPage {
 private int datasetSize; //数据集的记录总数

 

 private int startRow;    //从哪一条记录开始取数据

 

 private List data;       //一个页面的记录集

 

  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的类

 

 

 

package doorban.business;

 

import javax.faces.model.DataModel;

 

/**
 * 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.

 

 * 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.

 

 * 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) {
   // even when no row is selected, we still need a page
   // object so that we know the amount of data available.
   startRow = 0;
  }
  // invoke method on enclosing class
  page = fetchPage(startRow, pageSize);
  return page;
 }

 

 /**
  * Return the object corresponding to the current rowIndex. If the DataPage
  * object currently cached doesn\'t include that index then fetchPage is
  * called to retrieve the appropriate page.
  */
 public Object getRowData() {
  if (rowIndex < 0) {
   throw new IllegalArgumentException(
     "Invalid rowIndex for PagedListDataModel; not within page");
  }
  // ensure page exists; if rowIndex is beyond dataset size, then
  // we should still get back a DataPage object with the dataset size
  // in it if (page == null)
  {
   page = fetchPage(rowIndex, pageSize);
  }
  int datasetSize = page.getDatasetSize();
  int startRow = page.getStartRow();
  int nRows = page.getData().size();
  int endRow = startRow + nRows;
  if (rowIndex >= datasetSize) {
   throw new IllegalArgumentException("Invalid rowIndex");
  }
  if (rowIndex < startRow) {
   page = fetchPage(rowIndex, pageSize);
   startRow = page.getStartRow();
  } else if (rowIndex >= endRow) {
   page = fetchPage(rowIndex, pageSize);
   startRow = page.getStartRow();
  }
  return page.getData().get(rowIndex - startRow);
 }

 

 public Object getWrappedData() {
  return page.getData();
 }

 

 /**
  * Return true if the rowIndex value is currently set to a value that
  * matches some element in the dataset. Note that it may match a row that is
  * not in the currently cached DataPage; if so then when getRowData is
  * called the required DataPage will be fetched by calling fetchData.
  */
 public boolean isRowAvailable() {
  DataPage page = getPage();
  if (page == null) {
   return false;
  }
  int rowIndex = getRowIndex();
  if (rowIndex < 0) {
   return false;
  } else if (rowIndex >= page.getDatasetSize()) {
   return false;
  } else {
   return true;
  }
 }

 

 /**
  * 这个方法在每一个业务里里必须要被实现

 

  * startRow 每页的第一条记录在数据集里的位置

 

  * pageSize 每页的记录数

 

  */
 public abstract DataPage fetchPage(int startRow, int pageSize);

 

}

 

接着就应该来写一个具体的业务类

 

package doorban.business;

 

import java.util.ArrayList;
import java.util.List;

 

import javax.faces.model.DataModel;

 

import doorban.dao.hb.TempCardActionHB;

 

public class TCB {

 

 private DataModel dataModel = null;

 

private int dataSetSize;

 

 // dataSetSize = actionHB.getTotal();

 

 TempCardActionHB actionHB = new TempCardActionHB();

 

 public DataModel getDataModel() {
  if (dataModel == null) {
   dataModel = new LocalDataModel(5);
  }

 

  return dataModel;
 }

 

 private class LocalDataModel extends PagedListDataModel {

 

  public LocalDataModel(int pageSize) {
   super(pageSize);
   try {
    dataSetSize = actionHB.getTotal();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }

 

  public DataPage fetchPage(int startRow, int pageSize) {

 

   TempCardActionHB actionHB = new TempCardActionHB();
   List list = new ArrayList();
   try {
    list = actionHB.getTempCards(startRow, pageSize);
   } catch (Exception e) {
    e.printStackTrace();
   }
   DataPage dataPage = null;
   try {
    dataPage = new DataPage(dataSetSize, startRow, list);
   } catch (Exception e) {
    e.printStackTrace();
   }
   return dataPage;
  }
 }
}
分享到:
评论
1 楼 nforce_com 2011-03-21  

相关推荐

    jsf分页 jsf分页 jsf分页

    下面我们将深入探讨JSF中的分页实现。 首先,我们需要理解JSF的核心组件和分页相关的API。JSF是一个MVC(模型-视图-控制器)框架,其中UIComponent和ManagedBean是关键组成部分。分页通常涉及到两个主要部分:前端...

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

    综上所述,这个JSF分页实现项目涵盖了Web开发中的多个重要方面,包括前端界面的组件化设计、后端数据的分页处理、数据库操作以及Java的高级特性运用。通过学习和理解这个案例,开发者可以深化对JSF框架、SQL查询和...

    jsf自带分页

    JSF 提供了多种方式来创建分页UI,例如使用h:commandLink或p:commandButton来表示翻页操作,使用h:outputText或p:outputLabel显示当前页码和总页数。你可以在自定义组件或者现有的JSF库(如PrimeFaces)中找到专门...

    JSF数据分页的简单实现

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

    JSF经典的js分页

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

    jsf 分页实例jsf 分页实例

    JSF分页实例通过结合PrimeFaces的组件和后端数据处理,实现了高效且用户友好的分页功能。理解并掌握这些步骤,将有助于在实际项目中创建更加流畅的用户交互体验。记得根据项目需求调整分页组件的配置和数据加载策略...

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

    在这个简单的例子中,我们关注的是如何在JSF应用中实现数据分页。 **数据分页**是一种在大量数据展示时优化用户体验的技术,它允许用户逐步加载和查看数据,而不是一次性加载所有内容,这可以提高页面加载速度,...

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

    **JSF动态分页技术详解** JavaServer Faces (JSF)...通过这样的方式,你可以轻松地在JSF应用中实现高效且用户友好的数据分页功能。记住,实践是检验真理的唯一标准,动手操作并不断调整优化,才能更好地掌握这项技术。

    jsf 分页

    本篇将深入探讨JSF中的分页实现。 首先,我们需要理解分页的基本概念。分页是将大量数据分为多个较小的部分,每次只加载一部分到页面上,用户可以通过导航按钮在不同页面之间切换。在JSF中,我们可以利用组件库如...

    JSF分页组件2

    JSF分页组件的实现方式 #### 2.1 基于UIComponent的自定义组件 JSF允许开发者创建自定义组件,以满足特定需求。你可以通过继承`UIComponent`并实现必要的生命周期方法来构建一个分页组件。这个组件可以包含页码...

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

    本文将深入探讨JSF分页控件的关键知识点,以及如何实现大容量数据的可查询分页。 首先,理解JSF(JavaServer Faces)框架的基础是必要的。JSF是一种用于构建Web应用程序的Java标准,它提供了一种模型-视图-控制器...

    JSF分页组件

    **JSF分页组件详解** JSF(JavaServer Faces)是一种用于构建Web应用程序的Java EE框架,它提供了用户界面组件和事件处理模型,简化了开发过程。在大型数据展示时,分页是必不可少的功能,可以帮助用户更有效地浏览...

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

    这个"jsf分页——详细源码 测试通过"的压缩包文件提供了一个实现JSF分页功能的详细源代码,且经过了测试验证其有效性和可靠性。 JSF是一种Java web应用程序的组件模型框架,它允许开发人员使用可重用的UI组件来构建...

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

    ### 使用自定义渲染器实现JSF数据库表分页显示 #### 概述 在JavaServer Faces (JSF) 应用程序中处理大量的数据时,分页是一个非常实用且必要的功能。通过合理地分页展示数据,不仅可以提高用户体验,还可以减少...

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

    ### JSF中自定义分页呈现器的实现与应用 #### 概述 JavaServer Faces(简称JSF)作为一项强大的Web应用开发框架,为Java开发者提供了构建动态Web应用程序的有效手段。JSF的一个显著特点在于它能够实现业务逻辑与...

    JSF分页代码和学习文件1

    在“JSF分页代码和学习文件1”这个压缩包中,我们可以找到一些关于JSF分页功能的示例和学习资料。分页是Web应用中常见的功能,特别是在数据量较大的时候,为了提高用户体验,通常会将大量数据分成多个页面显示。JSF...

    struts和jsf分页

    Struts和JSF是两种广泛使用的Java Web框架,它们各自有着独特的特性和优点,而“分页”则是Web开发中的一个重要概念...在实际应用中,开发者可以根据项目的规模、性能要求以及团队的技术栈来选择最适合的分页实现方式。

    jsf增删改查分页例子

    在“jsf增删改查分页例子”这个项目中,我们可以看到JSF如何被用来实现一个基本的CRUD(创建、读取、更新和删除)功能,以及数据的分页展示。以下是关于这些知识点的详细解释: 1. **JSF组件库**:JSF包含了一系列...

Global site tag (gtag.js) - Google Analytics