之前项目中使用的是 richfaces自带的分页组件开发,但是性能上存在很大问题,所以需要使用数据库分页,这篇文章的主要内容是从网上借鉴过来的,但是网上大多是基于JSF1.2+Rf3.2的基础上进行分页的,我把代码稍微改了下,发现可以在JSF2.0+RF4.0的基础上使用!
dao层
//自定义分页
public int datasetSize(){
try {
String queryString = "select count(*) from Book";
Query query = em.createQuery(queryString);
return Integer.parseInt(query.getSingleResult()
.toString());
} catch (RuntimeException re) {
throw re;
}
}
@SuppressWarnings("unchecked")
public List<GoodsType> findAll(int startRow,int pageSize) {
try {
final String queryString = "select model from Book model";
Query query = em.createQuery(queryString);
query.setFirstResult(startRow);
query.setMaxResults(pageSize);
return query.getResultList();
} catch (RuntimeException re) {
throw re;
}
}
DataPage.java
package com.page;
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;
}
}
PageListBaseBean.java
package com.page;
/**
* TODO 带分页功能的基类
*
* @author <a href="mailto:tianlu@jsecode.com">TianLu</a>
* @version $Rev$ <br>
* $Id$
*/
public abstract class PageListBaseBean {
/**
* 当前页码,跟dataSroller的page属性绑定
*/
protected int scrollerPage = 1;
/**
* 当前页面大小
*/
protected int pageSize = 10;
/**
* 默认数据模型,如果你有多个数据集需要分页,请自定义PagedListDataModel和相应的getDataModel方法
*/
protected PageListDataModel defaultDataModel;
public int getScrollerPage() {
return scrollerPage;
}
public void setScrollerPage(int scrollerPage) {
this.scrollerPage = scrollerPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public abstract PageListDataModel getDefaultDataModel();
}
PageListDataModel.java
package com.page;
import java.io.Serializable;
import javax.faces.model.DataModel;
public abstract class PageListDataModel extends DataModel implements Serializable {
int pageSize;
int rowIndex;
DataPage page;
/**
* 创建一个datamodel显示数据,每一页指定的行数。
*/
public PageListDataModel(int pageSize) {
super();
this.pageSize = pageSize;
this.rowIndex = -1;
this.page = null;
}
/**
* 数据是通过一个回调fetchData方法获取,而不是明确指定一个列表
*/
public void setWrappedData(Object o) {
if (o instanceof DataPage) {
this.page = (DataPage) o;
} else {
throw new UnsupportedOperationException(" setWrappedData ");
}
}
public int getRowIndex() {
return rowIndex;
}
/**
* 指定的“当前行“在DataSet中.请注意,UIData组件会重复调用这个方法通过getRowData获取使用表中的对象!
*
*/
public void setRowIndex(int index) {
rowIndex = index;
}
/**
* 返回的总数据集大小(不只是的行数在当前页面! ) 。
*/
public int getRowCount() {
return getPage().getDatasetSize();
}
/**
* 返回DataPage对象;如果目前还没有fetchPage一个。请注意,这并不保证datapage返回包含当前rowIndex行;见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;
}
/**
* 返回相应的对象到当前rowIndex 。如果目前DataPage对象缓存不包括该指数则通过fetchPage找到适当的页面。
*/
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();
}
/**
* 如果rowIndex的值在DataSet中,返回真;请注意,它可能是匹配一行而不是当前DataPage缓存;
* 如果是的话当getRowData调用请求页面也会调用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;
}
}
/**
* 受管bean必须实现此方法
*/
public abstract DataPage fetchPage(int startRow, int pageSize);
/**
* 进行删除等操作后会立即改变列表项并且返回列表页的,请调用此方法,用于刷新列表。
*/
public void refresh() {
if (this.page != null) {
this.page = null;
getPage();
}
}
}
后台bean
package com.bean;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.ejb.BookDao;
import com.entity.Book;
import com.page.DataPage;
import com.page.PageListBaseBean;
import com.page.PageListDataModel;
@ManagedBean
@SessionScoped // 或换成ViewScoped
public class BookBean extends PageListBaseBean implements Serializable{
private BookDao dao;
public GoodsTypeBean() {
try {
Context ctx = new InitialContext();
java.util.Properties props = new java.util.Properties();
props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming");
ctx = new javax.naming.InitialContext(props);
dao = (BookDao) ctx.lookup("BookDaoImpl/remote");
} catch (NamingException e) {
e.printStackTrace();
}
}
@Override
public PageListDataModel getDefaultDataModel() {
if (defaultDataModel == null) {
defaultDataModel = new PageListDataModel(pageSize) {
public DataPage fetchPage(int startRow, int pageSize) {
// call enclosing managed bean method to fetch the data
List<Book> list=dao.findAll(startRow, pageSize);
return new DataPage(dao.datasetSize(), startRow, list);
}
};
}
return defaultDataModel;
}
}
前台:xhtml
<f:view>
<h:form id="showBookForm">
<div id="goodsInfoDiv" style="margin-top: 5px;">
<rich:dataTable id="bookList" styleClass="richDataTableStyle"
rows="10" align="center"
value="#{bookBean.defaultDataModel}" var="g"
onRowMouseOver="this.style.backgroundColor='#edf2f6';"
onRowMouseOut="this.style.backgroundColor='#ffffff';">
<f:facet name="header">
<rich:columnGroup>
<h:column>
<h:outputText value="货物编号" />
</h:column>
<h:column>
<h:outputText value="货物品名" />
</h:column>
<h:column>
<h:outputText value="型号" />
</h:column>
<h:column>
<h:outputText value="包装" />
</h:column>
</rich:columnGroup>
</f:facet>
<h:column>
<h:outputText value="#{g.fcustomerID}" />
</h:column>
<h:column>
<h:outputText value="#{g.fgoodsName}" />
</h:column>
<h:column>
<h:outputText value="#{g.fgoodsModel}" />
</h:column>
<h:column>
<h:outputText value="#{g.fgoodPackage}" />
</h:column>
<f:facet name="footer">
<rich:datascroller for="bookList" styleClass="ds"
renderIfSinglePage="true" maxPages="5" page="#{bookBean.scrollerPage}" />
</f:facet>
</rich:dataTable>
</div>
</h:form>
</f:view>
分享到:
相关推荐
1. **JSF 2.0**: JavaServer Faces 2.0是Java EE 6规范的一部分,它改进了JSF 1.x版本,引入了更多的特性,如Facelets作为默认视图层技术、自定义标签库的增强、异步请求处理和更多的注解支持。`jsf-api-2.0.2.jar`...
**JSF 2.0(JavaServer Faces 2.0)技术详解** JavaServer Faces (JSF) 是Java平台上的一个用于构建用户界面的组件模型框架,它为开发Web应用程序提供了一种结构化、可扩展的方法。JSF 2.0是这个框架的一个重大更新...
JSF(JavaServer Faces)2.0、Spring和Hibernate是Java开发中三个非常重要的框架,它们各自在Web应用开发的不同层面发挥着关键作用。JSF2.0专注于用户界面,Spring处理业务逻辑和服务层,而Hibernate则负责持久化...
通过整合JSF 2.0、Spring和Hibernate,开发者可以构建出具有强大功能、良好分层架构的Web应用,实现MVC模式,并有效地管理数据库操作和业务逻辑。这种组合在企业级项目中非常常见,因为它们各自都提供了许多开箱即用...
Seam作为整合框架,可以帮助管理和协调JSF、RichFaces和Ajax4jsf的交互,实现更高效的开发流程。例如,Seam可以自动处理RichFaces和Ajax4jsf组件之间的通信,提供统一的依赖注入和事务管理。通过Seam,开发者可以更...
**JSF2.0 + PrimeFaces在Websphere7.0上的部署安装步骤详解** JavaServer Faces(JSF)2.0是一个用于构建用户界面的Java EE标准框架,而PrimeFaces是一个基于JSF的组件库,提供了丰富的UI组件,使得开发人员能够更...
本系统使用jsf,richfaces,hibernate整合开发,完整的系统,个人日志系统,可以写日志,做备忘,行程,学习笔记等,覆盖了jsf,richfaces,hiberante等开发过程中的常用功能实现.适合新手的学习参考和学习.
这个小项目使用jsf+richfaces+hiberante设计,作为学习jsf和hibernate的新手学习参考.里面由基本上有常规项目所需一般功能:比如ajax.分页.hibernate级联操作等等
在JavaServer Faces (JSF)框架中,集成第三方库如RichFaces 4.0可以显著提升Web应用的用户体验和功能。本文将详细讲解如何将JSF的最新版本与RichFaces 4.0进行完美结合,以及这个组合带来的优势。 首先,让我们了解...
这些组件可以与JSF的Ajax机制相结合,实现自定义的异步更新。 6. **自定义更新方式实现步骤**: - 定义Dojo的Ajax请求:使用Dojo的`dojo/_base/xhr`模块,创建一个自定义的Ajax请求。 - 配置响应处理:在Ajax请求...
Java Web JSF + Richfaces + EJB + JPA 航空订票系统是一个综合性的应用,涵盖了多种Java技术,用于构建高效的、可扩展的、易于维护的Web应用程序。在这个系统中,每项技术都有其特定的角色和功能,共同协作以实现...
**JSF 1.2 + JPA 2.0 + Spring 3.1 整合开发详解** 在Java企业级应用开发中,JSF(JavaServer Faces)、JPA(Java Persistence API)和Spring框架的结合使用是常见的技术栈。本文将深入探讨如何将这三个组件整合在...
【seam+jsf+richfaces+ajax4jsf打包了】 这个压缩包集合了四个重要的Java Web开发框架,它们分别是Seam、JSF(JavaServer Faces)、RichFaces以及Ajax4jsf。这些技术在构建现代、交互性强的Web应用程序时发挥着关键...
1)JSP+javabean+DAO(Ajax:anywhere) 2)Struts+spring+hibernate3(AJax:DOJO) 3)JSF+richfaces+seam+EJB 总共3个完整的实例,并配有需求分析~~~~~~~~,绝对经典!
**JSF+RichFaces(Ajax4jsf)框架示例** JSF(JavaServer Faces)是一种用于构建Web应用程序的Java标准框架,它提供了一种组件化的方式来开发用户界面。JSF的核心是UI组件模型,允许开发者使用声明式编程来创建交互式...
这个压缩包包含了JSF 2.0的API jar包、实现库(即impl jar包)、源码以及doc帮助文档,为深入理解和学习JSF提供了全面的资源。 API jar包是JSF 2.0的核心接口和抽象定义,它定义了各种组件、事件、监听器和生命周期...
最近自己看了下jsf2,资料少的蛋疼,有什么问题搜来的永远就那么几篇帖子,次噢,就自己写了个demo,就一登录,数据库自己看SqlMapConfig.xml,还有不少问题,难学在于资料少,大神都不活跃啊,问什么都没人理。...
Mojarra JSF 2.0是针对JSF 2.0规范的实现库,包含了处理JSF生命周期、渲染组件以及与其他Java EE技术集成所需的所有类和接口。将Mojarra JSF 2.0库文件放置在Web应用的`WEB-INF/lib`目录下,是为了让应用服务器能够...
标题“JSF1.2+Spring2.0+Hibernate3.2的一个登陆实例”涉及到的是一个集成使用JavaServer Faces(JSF)、Spring框架和Hibernate ORM的登录应用示例。这个项目可能是一个教学资源或者开发者用来学习如何在旧版本的...