随笔-348  评论-598  文章-0  trackbacks-0
页面:
<f:view>
        
<h:form id="formlist">    
            
<rich:dataTable id="carList" width="483" columnClasses="col" rows="10"
                value
="#{testBean.dataModel}" var="car">            
                
<f:facet name="header">
                    
<rich:columnGroup>
                        
<h:column>
                            
<h:outputText styleClass="headerText" value="Name" />
                        
</h:column>
                        
<h:column>
                            
<h:outputText styleClass="headerText" value="Decription" />
                        
</h:column>
                        
<h:column>
                            
<h:outputText styleClass="headerText" value="Base Price" />
                        
</h:column>
                        
<h:column>
                            
<h:outputText styleClass="headerText" value="Time" />
                        
</h:column>
                        
<h:column>
                            
<h:outputText styleClass="headerText" value="操作" />
                        
</h:column>                        
                    
</rich:columnGroup>
                
</f:facet>
    
                
<h:column>
                    
<h:outputText value="#{car.name}" />
                
</h:column>
                
<h:column>
                    
<h:outputText value="#{car.description}" />
                
</h:column>
                
<h:column>
                    
<h:outputText value="#{car.baseprice}" />
                
</h:column>
                
<h:column>
                    
<h:outputText value="#{car.timestamp}" />
                
</h:column>
                
<h:column>
                    
<h:commandLink action="#{user.delete}" value="删除" >
                        
<f:param name="id" value="#{car.id}"/>
                    
</h:commandLink>
                
</h:column>                
            
</rich:dataTable>
            
<rich:datascroller for="carList" id="dc1"
            style
="width:483px" page="#{user.scrollerPage}"/>                        
        
</h:form>
    
</f:view>
DataPage.java:
package com.jsecode.util.pagination;

import java.util.List;

public class DataPage
{

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


    
private int datasetSize;

    
private int startRow;

    
private List data;

    
/**
     * 
     * 
@param datasetSize
     *            数据集大小
     * 
@param startRow
     *            起始行
     * 
@param data
     *            数据list
     
*/

    
public DataPage(int datasetSize, int startRow, List data)
    
{

        
this.datasetSize = datasetSize;

        
this.startRow = startRow;

        
this.data = data;

    }


    
/**
     * 
     * 
@return
     
*/

    
public int getDatasetSize()
    
{

        
return datasetSize;

    }


    
public int getStartRow()
    
{

        
return startRow;

    }


    
/**
     * 
     * 
@return 已填充好的数据集
     
*/

    
public List getData()
    
{

        
return data;

    }


}

PagedListDataModel.java:
package com.jsecode.util.pagination;

import javax.faces.model.DataModel;

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;
        }

    }


    
/**
     * Method which must be implemented in cooperation with the managed bean
     * class to fetch data on demand.
     
*/

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

    
/**
     * 添加了刷新模块
     
*/

    
public void reflash() {
        
if (this.page != null{
            
this.page = null;
            getPage();
        }

    }

}


TestBean.java:被datatable调用的类
public class TestBean
{
    
//不同的分页需求需要添加不同的dataModel,并实现不同的getDataModel
    
//例如,需要获得有名称条件的分页可以定义dataModelName,和getDataModelName()实现
    private DataModel dataModel;

    
public DataModel getDataModel()
    
{

        
if ( dataModel == null ) {
            dataModel 
= new PagedListDataModel(10)
            
{
                
/**
                 * 用不同的条件获得数据集和数量
                 
*/

                
public DataPage fetchPage(int startRow, int pageSize)
                
{
                    
// call enclosing managed bean method to fetch the data
                    CarBeanDAO dao = new CarBeanDAO();
                    String sql 
= "from CarBean model order by model.id desc";                
                    Query query 
= EntityManagerHelper.createQuery(sql);                    
                    query.setFirstResult(startRow);                    
                    query.setMaxResults(pageSize);                    
                    List list 
= query.getResultList();
                    System.out.println(
"current row count = " + list.size());
                    Query q 
= EntityManagerHelper.createQuery("select count(*) from CarBean");
                    
return new DataPage(Integer.parseInt(q.getSingleResult().toString()), startRow, list);
                }

            }
;
        }

        
        
return dataModel;

    }

}
配置文件:
 <managed-bean>
  
<managed-bean-name>testBean</managed-bean-name>
  
<managed-bean-class>com.jsecode.util.pagination.TestBean</managed-bean-class>
  
<managed-bean-scope>session</managed-bean-scope>
 
</managed-bean> 

有人反映会出现获取两次DataModel的情况,为什么呢?
经过我的测试,是因为设置的datatable的rows属性的值大于了程序中pageSize的值,比如你设置rows="12",而你的pageSize设置的是10,那么JSF为了满足显示12条得条件,就会取两次数据集组成一个12跳得数据集显示出来。


---------------------------------------------------------
专注移动开发

Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
posted on 2008-10-29 16:52 TiGERTiAN 阅读(2707) 评论(1)  编辑  收藏 所属分类: JavaJSF

评论:
# re: RichFaces中使用datatable和datascroller进行分页(使用数据库分页,改良版)(含源码)(JSF 1.2,RichFaces 3.2.1GA) 2008-10-30 16:34 | 韩现龙未登录
太好了!正在找这个,感谢楼主。
我由原来的C#阵营转到了java,还希望楼主能够多多指教!
加我MSN:hanxianlong@hotmail.com  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: