`
happylo
  • 浏览: 47466 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

基于rich:datascroller和rich:dataTable的分页查询实现

阅读更多

基于Seam/JSF开发,直接使用Rich组件确实是使界面达到较为美观和专业的最简单途径。

 

一般来说,基于rich:datascroller和rich:dataTable进行配合,马上就实现了表格及分页,但这种分布是一种“伪分页”,即:只是表现层分页,在数据层并没有进行分页查询。

 

下面给出一个我在使用的支持数据层分布查询的方法:

 

基类:

 

public abstract class BaseExtendedDataModel<T, ID extends Serializable> extends ExtendedDataModel {
	@Logger
	private Log log;

	public List<T> listRow = null;
	private int firstRow_old = 0;

	private ID currentId;
	private Map<ID, T> wrappedData = new HashMap<ID, T>();
	private Long rowCount; // better to buffer row count locally

	public abstract Long getCount();

	public abstract List<T> getList(Integer firstRow, Integer maxResults);

	public abstract T findById(ID id);

	public void wrap(FacesContext context, DataVisitor visitor, Range range, Object argument, List<T> list) throws IOException {
		wrappedData = new HashMap<ID, T>();
		for (T row : list) {
			ID id = null;
			try {
				id = (ID) PropertyUtils.getProperty(row, "id");
			} catch (Exception e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
			// wrappedKeys.add(id);
			wrappedData.put(id, row);
			visitor.process(context, id, argument);
		}
	}

	public boolean hasById(ID id) {
		return wrappedData.get(id) != null;
	}

	@Override
	public void walk(FacesContext context, DataVisitor visitor, Range range, Object argument) throws IOException {
		int firstRow = ((SequenceRange) range).getFirstRow();
		int maxResults = ((SequenceRange) range).getRows();
		if (firstRow != firstRow_old || listRow == null){
			listRow = getList(firstRow, maxResults);
			firstRow_old = firstRow;
		}
		wrap(context, visitor, range, argument, listRow);
	}

	/*
	 * This method normally called by Visitor before request Data Row.
	 */
	@Override
	public void setRowKey(Object key) {
		this.currentId = (ID) key;
	}

	@Override
	public int getRowCount() {
		if (rowCount == null)
			return (rowCount = this.getCount()).intValue();
		else
			return rowCount.intValue();
	}

	@Override
	public boolean isRowAvailable() {
		if (currentId == null) {
			return false;
		} else {
			return hasById(currentId);
		}
	}

	/**
	 * This is main way to obtain data row. It is intensively used by framework. We strongly recommend use of local cache in that method.
	 */
	@Override
	public Object getRowData() {
		if (currentId == null) {
			return null;
		} else {
			T ret = wrappedData.get(currentId);
			if (ret == null) {
				ret = this.findById(currentId);
				wrappedData.put(currentId, ret);
				return ret;
			} else {
				return ret;
			}
		}
	}

	/**
	 * Unused rudiment from old JSF staff.
	 */
	@Override
	public Object getWrappedData() {
		throw new UnsupportedOperationException();
	}
	private int rowIndex = 0;
	@Override
	public int getRowIndex() {
		//throw new UnsupportedOperationException();
		return rowIndex;
	}

	@Override
	public void setRowIndex(int rowIndex) {
		//throw new UnsupportedOperationException();
		this.rowIndex = rowIndex;
	}

	@Override
	public void setWrappedData(Object data) {
		throw new UnsupportedOperationException();
	}

	@Override
	public Object getRowKey() {
		if (true)
			throw new UnsupportedOperationException();
		return currentId;
	}

}

 

数据列表类

 

public class PeopleListExtendedDataModel extends BaseExtendedDataModel<People, Long>{
...
	@Override
	public People findById(Long id) {
		return entityManager.find(People.class, id);
	}
	@Override
	public Long getCount() {
		return (Long)createQuery(true).getSingleResult();
	}

	@Override
	public List<People> getList(Integer firstRow, Integer maxResults) {
		return createQuery(false).setFirstResult(firstRow).setMaxResults(maxResults).getResultList();
	}

...

}

 

页面代码:

            <rich:datascroller align="left"  for="peopleList" maxPages="20" rendered="#{peopleListExtendedDataModel.size>20}"/>
            <rich:dataTable width="100%" id="peopleList" rows="20" columnClasses="col"
                value="#{peopleListExtendedDataModel}" var="people">

 

分享到:
评论
2 楼 jim19770812 2009-06-22  
呵呵,那个问题搞定了,只要在BaseExtendedDataModel增加一个refresh方法就可以了,代码如下

public void refresh(){
        firstRow_old = -1;
}

删除数据之后,只要refresh一下就可以了

public String doDel(){
        ........
        this.pagedModel.refresh();
        return null;
}
1 楼 jim19770812 2009-06-22  
方法不错,只是遇到个小问题,在删除的时候,页面无法刷新,删除的记录仍然存在,请问这个怎么解决?

相关推荐

    Richface实现服务器端分页Demo

    3. **配置JSF页面**:在JSF页面中,使用`rich:datascroller`和`rich:extendedDataTable`组合实现分页。`rich:datascroller`将负责导航,而`rich:extendedDataTable`则展示数据。 ```xml &lt;rich:extendedDataTable ...

    richfaces中的datagrid显示数据

    通过使用RichFaces的`rich:dataTable`和`rich:datascroller`组件,我们可以轻松地在Web应用中实现数据的展示和分页功能。同时,结合后端的`DataPage`和`PagedListDataModel`类,可以更高效地处理大量数据,提升应用...

    richfaces组件说明文档及使用实例

    RichFaces的`&lt;rich:dataTable&gt;`和`&lt;rich:extendedDataTable&gt;`组件提供了强大的数据展示功能,支持分页、排序、过滤等操作。配合`&lt;rich:datascroller&gt;`可以实现数据的动态加载。 6. **国际化与本地化**: ...

    用jsf实现的相册管理

    比如,我们可以在相册列表页面使用`&lt;rich:datascroller&gt;`组件实现分页加载,使用`&lt;rich:fileUpload&gt;`组件让用户无需刷新页面即可上传图片,使用`&lt;rich:modalPanel&gt;`展示预览图片的弹窗。 在视图层,我们需要创建JSF...

    JSF分页组件2

    许多开源库提供了现成的JSF分页组件,如PrimeFaces的`p:paginator`和RichFaces的`rich:datascroller`。这些组件通常提供了丰富的功能和自定义选项,简化了开发过程。 ### 3. 分页组件的核心功能 - **页码控制**:...

    Richfaces的DateTable

    它不仅具有基本的表格功能,如排序、分页和筛选,还支持日期选择器和其他与日期相关的交互。DateTable可以很好地整合到JSF应用程序中,通过AJAX更新和丰富的用户界面,提高用户体验。 1. **DateTable的基本使用** ...

    richfaces参考文档

    - **&lt;rich:datascroller&gt;**:用于数据表格的分页,提供多种滚动样式和行为。 - **&lt;rich:datagrid&gt;**:一个动态的数据网格,可以展示大量数据,并支持排序、过滤和行操作。 - **&lt;rich:tree&gt;**:创建可扩展的树形...

    jsf最新版本jar包跟richfaces4.0完美结合

    3. **强大的数据呈现**:`&lt;rich:dataTable&gt;`和`&lt;rich:extendedDataTable&gt;`组件提供了强大的数据展示功能,支持排序、分页和过滤,适用于大数据集的显示。 4. **自定义和扩展**:尽管RichFaces提供了很多现成组件,...

    Practical RichFaces

    1. **设计页面布局:** 使用`rich:dataTable`来展示产品列表,该组件支持分页、排序等功能。 2. **添加AJAX支持:** 通过在`rich:dataTable`内嵌入`&lt;a4j:commandLink&gt;`或`&lt;a4j:commandButton&gt;`来实现单击时的异步...

    TableDataSource-将DataTable绑定到Rich Data控件

    在提供的文件中,`TableDataSource-Binding-DataTable-to-Rich-Data-Con.pdf`可能详细介绍了这个过程,而`Codeproject.zip`和`Codeproject2.zip`可能包含了示例代码和项目文件。通过查看这些资源,你可以更深入地...

    JSF商品管理小项目帮助文档

    在商品管理系统中,我们可以使用RichFaces的`&lt;rich:dataTable&gt;`来优雅地呈现商品列表,通过AJAX更新实现无刷新加载或编辑商品信息。例如,使用`&lt;a4j:ajax&gt;`事件监听器可以实现只更新特定区域的页面内容,提高响应...

    左右表格互移

    对于数据量较大的表格,可能需要使用如Bootstrap的DataTable插件或自定义的JavaScript解决方案来实现表格的分页、排序和过滤功能。这些工具通常也支持动态调整表格布局。 8. **无障碍性考虑**: 在实现左右表格互...

    Silverlight.DataSet

    Silverlight是微软推出的一种RIA(Rich Internet Application)技术,它提供了一种创建具有丰富媒体体验和交互式用户界面的Web应用程序的方式。通过XAML(Extensible Application Markup Language)和C#、VB.NET等...

    primefaces_user_guide_6_0.zip_primefaces

    例如,`p:datatable`组件允许你展示和操作表格数据,你可以通过调整列宽、排序、过滤和分页来定制其行为。 此外,指南还会介绍PrimeFaces的Ajax功能,如Partial Page Rendering(PPR)和PrimeFaces Push技术。PPR...

    ASP.NET 控件的使用

    16.3 使用ObjectDataSource控件分页、排序和过滤数据 515 16.3.1 用户界面分页 515 16.3.2 数据源分页 517 16.3.3 用户界面排序 522 16.3.4 数据源排序 523 16.3.5 过滤数据 527 16.4 处理ObjectDataSource控件的...

Global site tag (gtag.js) - Google Analytics