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;
public class BookBean extends PageListBaseBean {
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;
}
}
前台
<f:view>
<a4j:loadScript src="resource://jquery.js" />
<a4j:keepAlive beanName="bookBean" ajaxOnly="false" />
<a4j:form id="showBookForm" ajaxSubmit="true">
<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" ignoreDupResponses="false"
renderIfSinglePage="true" maxPages="5" page="#{bookBean.scrollerPage}" />
</f:facet>
</rich:dataTable>
</div>
</a4j:form>
</f:view>
分享到:
相关推荐
同时,还可以自定义分页样式和事件处理,以满足特定的交互需求。 接下来,我们要讨论的是行拖动功能。在`richfaces`中,我们可以使用`<rich:dragSupport>`和`<rich:dropSupport>`这两个组件来实现。这两个组件分别...
4. **自定义分页**: 如果组件库提供的分页功能不能满足需求,可以创建自定义组件或行为。这可能涉及扩展UIComponent,实现自身的生命周期方法,或者创建自定义EL函数来处理分页逻辑。 5. **性能优化**: 为了...
3. 皮肤和主题: RichFaces支持自定义皮肤和主题,允许开发者根据需求调整UI样式,以满足不同项目的需求。 三、核心组件 1. RichInput components:如AutoComplete、FileUpload等,提供了更丰富的输入方式,增强了...
3. **事件处理**:提供了一种灵活的方式来处理客户端和服务器端的事件,可以自定义触发器和事件监听器,增强应用交互性。 4. **皮肤和主题**:支持CSS主题,允许开发者轻松更改组件样式,满足不同项目需求。 5. **...
创建自定义分页组件涉及以下几个步骤: - **设计组件**: 首先,你需要设计一个UI组件,包含必要的HTML元素和CSS样式,以实现分页导航的布局。 - **编写后台逻辑**: 编写Java代码处理分页操作,包括计算总页数、根据...
- **第六章至第八章:进阶技术** ——探讨了如何利用RichFaces进行表单验证、国际化处理以及实现自定义组件的方法。 - **第九章:最佳实践** ——分享了一些实际开发中的经验教训,帮助读者更好地运用RichFaces解决...
例如,`<rich:datascroller>`标签用于分页显示大量数据,它的`page`属性用于指定当前页数,`event`属性可以设置触发分页操作的事件,如“click”或“mouseover”。此外,手册还会提供示例代码,帮助开发者快速理解和...
4. **自定义和扩展**:尽管RichFaces提供了很多现成组件,但开发者仍可以根据需要自定义组件或扩展现有组件,以满足特定项目需求。 5. **性能优化**:RichFaces 4.0对性能进行了优化,如延迟加载和资源合并,降低了...
这种方法更加简洁,但可能不如自定义分页那样灵活,例如无法自定义分页按钮的样式或行为。 总之,在JSF中实现分页,我们可以选择利用第三方库如PrimeFaces提供的组件,或者自己编写逻辑处理分页。这两种方法都有其...
RichFaces的`<rich:dataTable>`和`<rich:extendedDataTable>`组件提供了强大的数据展示功能,支持分页、排序、过滤等操作。配合`<rich:datascroller>`可以实现数据的动态加载。 6. **国际化与本地化**: ...
在JSF中,分页通常通过自定义组件或利用现有的第三方库如PrimeFaces、RichFaces等实现。 "JSF分页控件" 可能是基于某个特定的JSF库,比如PrimeFaces中的`p:datascroller`或`p:paginator`,或者自定义的组件。这些...
许多开源库提供了现成的JSF分页组件,如PrimeFaces的`p:paginator`和RichFaces的`rich:datascroller`。这些组件通常提供了丰富的功能和自定义选项,简化了开发过程。 ### 3. 分页组件的核心功能 - **页码控制**:...
4. Extensions:包括一系列增强JSF功能的组件,如数据表的分页和排序、文件上传等。 四、RichFaces的事件模型 RichFaces的事件模型是其核心特性之一,它允许开发人员在后台处理用户交互,并仅更新必要的UI部分。...
3. **皮肤化与主题支持**:RichFaces允许开发者创建和应用自定义的皮肤,使得UI设计更加灵活,可以轻松地适应不同的品牌风格和用户界面需求。 4. **事件处理和生命周期管理**:RichFaces 3.1.0具有完善的事件处理...
- **数据表格(Data Table)**:用于展示大量数据,并提供排序、分页等功能。 - **日历选择器(Date Picker)**:允许用户直观地选择日期。 - **树形菜单(Tree Menu)**:用于展示层次结构的数据。 - **标签页面板...
或者,你可以使用`<rich:datascroller>`来实现数据网格的分页,提供流畅的浏览体验。 此外,Richfaces4.0还提供了事件处理机制,使得组件间可以进行通信。通过定义`<a4j:support>`或`<rich:componentControl>`标签...
学习源码可以帮助开发者深入了解组件的工作原理,优化自定义组件,甚至为RichFaces贡献代码。可以使用Eclipse或IntelliJ IDEA等IDE导入项目,通过阅读和调试源码来理解组件的生命周期和事件处理流程。 六、实战应用...
2. **rich:extendedDataTable**: 支持分页、排序和过滤的高级数据表组件,可以方便地展示大量数据。 3. **rich:calendar**: 一个直观的日历组件,支持日期选择和时间选择,可自定义样式和事件。 4. **rich:slider**:...
2. **自定义GridDataProvider类**:由于JSF默认的数据表GridDataProvider没有实现分页功能,因此需要自定义一个GridDataProvider子类来实现数据分页。GridDataProvider是一个抽象类,它包含了几个关键方法,如`get...
- **Richfaces组件冲突**:Richfaces的calendar和fileupload组件可能因关键词冲突而无法使用。可以重命名这些组件的标签以避免冲突。 - **RememberMe类的UsernameSelector**:RememberMe类中的UsernameSelector...