- 浏览: 1397071 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (328)
- JSF (27)
- 生活 (12)
- Ajax (26)
- Maven (6)
- CSS (1)
- Shale (3)
- SiteMesh (1)
- Ext (15)
- JMX (2)
- Windows技巧 (7)
- 工作感悟 (18)
- SVN (2)
- SVG (0)
- GoogleGear (0)
- RAP (2)
- SOA与WebService (3)
- 笔记本技术研究 (1)
- Microsoft (2)
- 英语学习 (3)
- PHP (7)
- web 2.0 (6)
- 语义Web (1)
- IT史话 (3)
- iText (3)
- JVM (1)
- PropertiesEditor (1)
- J2SE (33)
- Spring (2)
- Java Batch (1)
- log (2)
- Struts2 (2)
- DWR (0)
- JAAS (3)
- EJB3 (4)
- Flex (8)
- JFreeChart (1)
- WAS (0)
- 数据库 (2)
- 摄影 (0)
- SQL (1)
- Google App Engine (1)
- linux (5)
- Eclipse plugin (10)
- Testing (0)
- Portal (0)
- 移动互联网 (0)
- SWTBot (1)
最新评论
-
江奇缘:
不错!!!!!!
web.xml里<filter-mapping>中的<dispatcher>作用 -
yy8093:
commonj 第三步,那个调用的方法要在哪里调?servle ...
JAVA中多种计时器的比较与分析 -
di1984HIT:
学习了,不错~
web.xml里<filter-mapping>中的<dispatcher>作用 -
penkee:
com.lowagie.text.DocumentExcept ...
iText中输出 中文 -
氵壞男亼乀:
我想请问下 你哪个html里面引入的几个js文件没看懂!你 ...
DWR入门教程之HelloWorld
WorkingWithLargeTables
本文转自http://wiki.apache.org/myfaces/WorkingWithLargeTables,由于该文最后一部分没有jsp代码部分,所有又加上了一些jsp代码。
Components t:dataModel and t:dataScroller work together nicely to allow a user to "page" through a set of a few dozen to a few hundred records. However the implementation does assume that the entire set of available records are in memory and wrapped up inside a ListDataModel or ArrayDataModel.
When the available dataset is quite large, and the application can have many users, this can lead to memory usage problems.
This page contains discussions on how to handle this scenario.
On-demand loading
A custom DataModel can be used to allow data to be loaded "on demand".
First, a class needs to be defined which your "business methods" (eg EJBs) can use to pass "pages" of data back to the UI. This class needs to be defined in your project, as the "business" level shouldn't be extending MyFaces classes:
- package example;
- import java.util.List;
- /**
- * 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<t></t> {
- private int datasetSize;
- private int startRow;
- private List<t></t> 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<t></t> 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<t></t> getData() {
- return data;
- }
- }
Now a custom DataModel can use this DataPage stuff. Again, it is recommended that you copy this code into your project and change the package name appropriately. This class can't go in the MyFaces libraries as it depends on DataPage, and as noted above, DataPage is accessed by your business level code so it really can't be in the MyFaces libs:
- package example;
- import javax.faces.model.DataModel;
- import example.DataPage;
- /**
- * 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<t></t> extends DataModel {
- int pageSize;
- int rowIndex;
- DataPage<t></t> 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.
- */
- @Override
- public void setWrappedData(Object o) {
- throw new UnsupportedOperationException("setWrappedData");
- }
- @Override
- 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.
- */
- @Override
- 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!).
- */
- @Override
- 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<t></t> 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.
- */
- @Override
- 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);
- }
- // Check if rowIndex is equal to startRow,
- // useful for dynamic sorting on pages
- if (rowIndex == page.getStartRow()){
- 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);
- }
- @Override
- 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.
- */
- @Override
- public boolean isRowAvailable() {
- DataPage<t></t> 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;
- }
- }
- /**
- * Method which must be implemented in cooperation with the
- * managed bean class to fetch data on demand.
- */
- public abstract DataPage<t></t> fetchPage(int startRow, int pageSize);
- }
Finally, the managed bean needs to provide a simple inner class that provides the fetchPage implementation:
- public SomeManagedBean {
- ....
- private DataPage<somerowobject></somerowobject> getDataPage(int startRow, int pageSize) {
- // access database here, or call EJB to do so
- }
- public DataModel getDataModel() {
- if (dataModel == null) {
- dataModel = new LocalDataModel(getRowsPerPage());
- }
- return dataModel;
- }
- private class LocalDataModel extends PagedListDataModel {
- public LocalDataModel(int pageSize) {
- super(pageSize);
- }
- public DataPage<somerowobject></somerowobject> fetchPage(int startRow, int pageSize) {
- // call enclosing managed bean method to fetch the data
- return getDataPage(startRow, pageSize);
- }
- }
The jsp pages should be like this:
- public class PagedTableListBean {
- private DataModel pagedDataModel;
- private TableListBean listBean;
- /**
- *
- */
- public PagedTableListBean() {
- }
- /**
- * @return the itemList
- */
- public DataModel getItemList() {
- if (pagedDataModel == null) {
- pagedDataModel = new LocalDataModel(15);
- }
- return pagedDataModel;
- }
- /**
- * @return the pagedDataModel
- */
- public DataModel getPagedDataModel() {
- return pagedDataModel;
- }
- /**
- * @param pagedDataModel
- * the pagedDataModel to set
- */
- public void setPagedDataModel(DataModel pagedDataModel) {
- this.pagedDataModel = pagedDataModel;
- }
- /**
- * @return the listBean
- */
- public TableListBean getListBean() {
- return listBean;
- }
- /**
- * @param listBean
- * the listBean to set
- */
- public void setListBean(TableListBean listBean) {
- this.listBean = listBean;
- }
- // local class
- private class LocalDataModel extends PagedListDataModel {
- public LocalDataModel(int pageSize) {
- super(pageSize);
- }
- public DataPage fetchPage(int startRow, int pageSize) {
- // call enclosing managed bean method to fetch the data
- return getDataPage(startRow, pageSize);
- }
- }
- // get datePage from DAO
- private DataPage getDataPage(int startRow, int pageSize) {
- // access database here, or call EJB to do so
- List subList = listBean.getTableList(startRow, pageSize);
- DataPage dataPage = new DataPage(listBean.getTotal(), startRow, subList);
- return dataPage;
- }
- }
页面的绑定:
- <hx:dataTableEx id="tableEx1" value="#{pagedTableListBean.itemList}"
- var="vartableList" styleClass="dataTableEx" headerClass="headerClass"
- footerClass="footerClass" rowClasses="rowClass1, rowClass2"
- columnClasses="columnClass1" border="1" cellpadding="2"
- cellspacing="0" rows="15">
评论
现在我如果把管理页面4 的支撑bean 其Scope设为request时,另用一个属性变量来获取每页的一个first行并用session保侟,在getDataPage时再来check该变量,如果有时则获取的数据将从first行开始,这样的实现效果是可以,可是总要慢一个节拍,在经过...
DataPage getDataPage(startRow, pageSize); 中的startRow 和pageSize可以通过 <hx:dataTableEx id="tableEx1" value="#{pagedTableListBean.itemList}" binding="table"...>
中的table获取相关参数
table 在ManagerBean中定义为UIDataTable
table.getFirst(), table.getRows
现在我如果把管理页面4 的支撑bean 其Scope设为request时,另用一个属性变量来获取每页的一个first行并用session保侟,在getDataPage时再来check该变量,如果有时则获取的数据将从first行开始,这样的实现效果是可以,可是总要慢一个节拍,在经过
现在在管理页面4-->>通过修改操作-->>返回管理页面按钮--返回管理页面4
后,其管理页面4显示的数据是页面1的数据,如果此时我再去单击datatable上的任可一个按钮时将显示正确的(管理页面4),这好像就是一个响应慢一拍的感觉,请给予帮助?
现在我如果把管理页面4 的支撑bean 其Scope设为session时,另用一个属性变量来获取每页的一个first行并用session保侟,在getDataPage时再来check该变量,如果有时则获取的数据将从first行开始,这样的实现效果是可以,但是好像一旦有新的数据加进去后,不能及时显示出来,这是非常不好的地方,好像dataPage的数据被缓存了一样,真是奇怪,请给予帮助,谢谢
这两种方式都有一些小毛病,能否把你的实现思路说一下吗?谢谢
现在在管理页面4-->>通过修改操作-->>返回管理页面按钮--返回管理页面4
用了你楼上的那种方式后要怎么做到这种效果?
发表评论
-
IBM jsf row select
2009-07-09 19:09 1311http://www.ibm.com/developerwor ... -
jsf中使用Locale,显示本地化错误信息
2009-01-15 11:09 3394JSF 在转换和验证时都有可能会产生错误信息: 在使用标准转 ... -
JSF中制作双表尾
2008-11-21 21:42 1711最近,在项目中遇到一个制作表尾的问题,效果 如下: ... -
JSF1.2中 ValueExpression的用法
2008-05-22 23:20 4904在1.2之前,可以向下面一样使用ValueBinding: V ... -
Tomcat中如何打开Sun JSF RI 1.2中的日志
2008-05-16 00:50 3605为了更加清楚的了解JSF请求在每一个生命周期中的执行情况,我们 ... -
JSF环境配置(JDK6+Eclipse3.3+Tomcat 6.0+JSF1.2+JSTL1.1)
2008-04-25 23:14 7007第一步: 下载安装 JDK 6 Update 3 h ... -
不可不看,JSF1.2 changes
2008-03-31 17:04 4326变化还是挺多的,仔细看看,可以省掉很多郁闷的时间哦。The n ... -
JSTL 1.2 下载
2008-03-31 14:26 30776在网上找JSTL找了一会,不太好找,就放在这里一份了: 网络下 ... -
JSF 1.2中对以前JSF的修改
2008-03-31 11:00 1914Features that are unavailable ... -
JSF 各版本一览
2008-03-28 18:03 3522JSF started its journey from ve ... -
JSF 背景
2008-03-25 17:29 1794自从第一个web应用程序Struts于2001年6月发布开始, ... -
在Dreamwear中开发JSF
2008-03-09 22:49 2739可以在Dreamwear中安装JSF插件,然后利用Dreamw ... -
JSF中Exception的处理
2007-12-21 15:54 4925JSF中Exception的处理<o:p>< ... -
JSF中Exception的处理
2007-12-21 14:56 78目标: 解析错误信息,使用Globalization 来显示 ... -
Why JSF
2007-12-17 16:03 1298JavaServer Faces is extremely i ... -
源码讲解renderResponse和responseComplete的区别
2007-11-17 00:40 4492看源代码: responseComplete: ... -
JSF 源代码赏析之Lifecycle
2007-11-15 23:41 5945JSF的生命周期在JSF ... -
如何在Maven中配置Richfaces
2007-11-08 17:41 30131.首先到这个地方下载maven http://maven. ... -
JSF 标准 转换器&验证器 文档
2007-11-02 18:50 2273下面是两篇文档 http://www.ibm.com/deve ... -
JSF 源代码赏析之FacesServlet
2007-10-30 00:08 12588学习JSF 多日,现在开始看看源代码。 首先是FacesSer ...
相关推荐
以PrimeFaces为例,`p:dataTable`组件自带了分页功能,只需配置`rows`属性(每页记录数)和`paginator`属性(启用分页),它会自动处理分页的前后端逻辑。 4. **自定义分页**: 如果组件库提供的分页功能不能满足...
在JSF中,处理大量数据时,分页功能是必不可少的,它可以提高用户体验,减少一次性加载过多数据对服务器和网络资源的压力。本文将深入探讨JSF自带的分页功能,并结合提供的博客链接进行讲解。 在JSF中,分页通常...
3. **JavaScript实现**:编写JavaScript函数来处理分页逻辑。这些函数通常会监听按钮点击事件,根据当前页码和每页记录数计算出显示的数据范围,然后更新页面上的数据显示区。 4. **DOM操作**:使用JavaScript库如...
总之,在JSF中实现分页,我们可以选择利用第三方库如PrimeFaces提供的组件,或者自己编写逻辑处理分页。这两种方法都有其优缺点,具体选择取决于项目需求和个人喜好。无论哪种方式,关键在于理解分页的基本原理,...
描述中提到的“具体的分页可继承PagerBean”,这表明可能有一个名为`PagerBean`的后台bean,用于处理分页逻辑。在JSF中,Managed Bean是存储业务逻辑和状态的Java类,它们可以与视图层交互。`PagerBean`可能包含以下...
- **编写后台逻辑**: 编写Java代码处理分页操作,包括计算总页数、根据用户选择的页码获取相应数据等。 - **集成到JSF生命周期**: 使用JSF的生命周期方法(如`@PostConstruct`、`processAction`等)确保组件与JSF...
在JSF中,我们可以使用各种分页组件来实现这一功能。本文将深入探讨JSF分页组件2的相关知识点,包括其原理、使用方法和最佳实践。 ### 1. 分页组件的基本概念 分页组件允许用户以有限的数量逐页查看数据,而不是一...
综上所述,这个JSF分页实现项目涵盖了Web开发中的多个重要方面,包括前端界面的组件化设计、后端数据的分页处理、数据库操作以及Java的高级特性运用。通过学习和理解这个案例,开发者可以深化对JSF框架、SQL查询和...
在JSF页面(通常是`.xhtml`文件)中,使用`p:datatable`展示数据,`p:datascroller`处理分页。 ```html <!DOCTYPE html> xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:p="http://primefaces.org/ui"> ...
在这个简单的例子中,我们关注的是如何在JSF应用中实现数据分页。 **数据分页**是一种在大量数据展示时优化用户体验的技术,它允许用户逐步加载和查看数据,而不是一次性加载所有内容,这可以提高页面加载速度,...
在JavaScript Server Faces (JSF) 中,分页是一种常见的功能,用于处理大量数据时提高用户体验。这个"jsf分页——详细源码 测试通过"的压缩包文件提供了一个实现JSF分页功能的详细源代码,且经过了测试验证其有效性...
然而,在处理大量数据分页查询时,JSF的标准组件可能显得力不从心。因此,本文将探讨如何通过自定义渲染器来解决这一问题。 #### 自定义分页呈现器的需求分析 在使用JSF构建的应用系统中,特别是在涉及到大量数据...
本篇将详细讲解如何在JSF中实现动态分页。 **1. JSF组件库与动态分页** JSF提供了一些基本的UI组件,但默认并未包含分页组件。在实际开发中,我们通常会借助第三方库来实现这一功能。在给定的资源中,"myfaces-...
在JavaServer Faces (JSF) 应用程序中处理大量的数据时,分页是一个非常实用且必要的功能。通过合理地分页展示数据,不仅可以提高用户体验,还可以减少服务器的压力。本文将详细介绍一种基于自定义渲染器的高效分页...
通过这个压缩包中的实例,你可以深入理解JSF如何处理分页,以及如何将分页与其他功能(如搜索、排序)结合使用。同时,也可以从中学习到如何组织和管理JSF项目,以及如何调试和优化JSF应用。最后,别忘了JSF的强大...
2. **Managed Bean**:创建一个Managed Bean,处理分页逻辑,如`@ManagedBean`和`@ViewScoped`注解的Bean,包含当前页码、每页大小等属性,并提供相应的业务方法。 3. **数据绑定**:使用`h:dataTable`组件展示数据...
在分页中,Spring MVC的`ModelAndView`或`@ResponseBody`注解可以用来处理HTTP请求并返回分页数据。同时,Spring的数据层服务可以整合Hibernate,实现对数据库的高效操作。 **Hibernate ORM** Hibernate是一个强大...
在“jsf增删改查分页例子”这个项目中,我们可以看到JSF如何被用来实现一个基本的CRUD(创建、读取、更新和删除)功能,以及数据的分页展示。以下是关于这些知识点的详细解释: 1. **JSF组件库**:JSF包含了一系列...