在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;
}
}
}
分享到:
相关推荐
下面我们将深入探讨JSF中的分页实现。 首先,我们需要理解JSF的核心组件和分页相关的API。JSF是一个MVC(模型-视图-控制器)框架,其中UIComponent和ManagedBean是关键组成部分。分页通常涉及到两个主要部分:前端...
综上所述,这个JSF分页实现项目涵盖了Web开发中的多个重要方面,包括前端界面的组件化设计、后端数据的分页处理、数据库操作以及Java的高级特性运用。通过学习和理解这个案例,开发者可以深化对JSF框架、SQL查询和...
JSF 提供了多种方式来创建分页UI,例如使用h:commandLink或p:commandButton来表示翻页操作,使用h:outputText或p:outputLabel显示当前页码和总页数。你可以在自定义组件或者现有的JSF库(如PrimeFaces)中找到专门...
JSF分页有不少的组件可以使用,但用起来都不是想象的那么简单,这里自己实现了一个简单的分页实现,以提供大家分享。 有更好的意见请留言。或者去...
"JSF经典的js分页"是一个示例,展示了如何在JSF应用中实现纯JavaScript(js)的分页功能。这个例子,即PageDemo,旨在提供一个代码简洁、易于理解的分页解决方案。 首先,我们需要了解JSF的基本概念。JSF是一个用于...
JSF分页实例通过结合PrimeFaces的组件和后端数据处理,实现了高效且用户友好的分页功能。理解并掌握这些步骤,将有助于在实际项目中创建更加流畅的用户交互体验。记得根据项目需求调整分页组件的配置和数据加载策略...
在这个简单的例子中,我们关注的是如何在JSF应用中实现数据分页。 **数据分页**是一种在大量数据展示时优化用户体验的技术,它允许用户逐步加载和查看数据,而不是一次性加载所有内容,这可以提高页面加载速度,...
**JSF动态分页技术详解** JavaServer Faces (JSF)...通过这样的方式,你可以轻松地在JSF应用中实现高效且用户友好的数据分页功能。记住,实践是检验真理的唯一标准,动手操作并不断调整优化,才能更好地掌握这项技术。
本篇将深入探讨JSF中的分页实现。 首先,我们需要理解分页的基本概念。分页是将大量数据分为多个较小的部分,每次只加载一部分到页面上,用户可以通过导航按钮在不同页面之间切换。在JSF中,我们可以利用组件库如...
JSF分页组件的实现方式 #### 2.1 基于UIComponent的自定义组件 JSF允许开发者创建自定义组件,以满足特定需求。你可以通过继承`UIComponent`并实现必要的生命周期方法来构建一个分页组件。这个组件可以包含页码...
本文将深入探讨JSF分页控件的关键知识点,以及如何实现大容量数据的可查询分页。 首先,理解JSF(JavaServer Faces)框架的基础是必要的。JSF是一种用于构建Web应用程序的Java标准,它提供了一种模型-视图-控制器...
**JSF分页组件详解** JSF(JavaServer Faces)是一种用于构建Web应用程序的Java EE框架,它提供了用户界面组件和事件处理模型,简化了开发过程。在大型数据展示时,分页是必不可少的功能,可以帮助用户更有效地浏览...
这个"jsf分页——详细源码 测试通过"的压缩包文件提供了一个实现JSF分页功能的详细源代码,且经过了测试验证其有效性和可靠性。 JSF是一种Java web应用程序的组件模型框架,它允许开发人员使用可重用的UI组件来构建...
### 使用自定义渲染器实现JSF数据库表分页显示 #### 概述 在JavaServer Faces (JSF) 应用程序中处理大量的数据时,分页是一个非常实用且必要的功能。通过合理地分页展示数据,不仅可以提高用户体验,还可以减少...
### JSF中自定义分页呈现器的实现与应用 #### 概述 JavaServer Faces(简称JSF)作为一项强大的Web应用开发框架,为Java开发者提供了构建动态Web应用程序的有效手段。JSF的一个显著特点在于它能够实现业务逻辑与...
在“JSF分页代码和学习文件1”这个压缩包中,我们可以找到一些关于JSF分页功能的示例和学习资料。分页是Web应用中常见的功能,特别是在数据量较大的时候,为了提高用户体验,通常会将大量数据分成多个页面显示。JSF...
Struts和JSF是两种广泛使用的Java Web框架,它们各自有着独特的特性和优点,而“分页”则是Web开发中的一个重要概念...在实际应用中,开发者可以根据项目的规模、性能要求以及团队的技术栈来选择最适合的分页实现方式。
在“jsf增删改查分页例子”这个项目中,我们可以看到JSF如何被用来实现一个基本的CRUD(创建、读取、更新和删除)功能,以及数据的分页展示。以下是关于这些知识点的详细解释: 1. **JSF组件库**:JSF包含了一系列...