extremetable+hibernate实现分页 关于结合hibernate后台数据分页和eXtremeTable分页功能的使用

eXtremeComponents 是一系列提供高级显示的开源 JSP 定制标签。当前的包含 的组件为 eXtremeTable ,用于以表的形式显示数据。eXtremeTable提供了一个很好的分页特性,但是如何结合hibernate分页以及在分页后过滤器的使用再加上使用eXtremeTable的导出,这里提供一种了解决办法。使得在html页面的排序和导出的内容一致以及导出非分页后的数据(导出的数据为完整的数据集而不仅是当前页的内容)。并且使得后台分页不会和前台耦合在一起。关于如何使用eXtremeTable的Limit,可以参看其自带的相关文档。

首先从PageSortModel分页排序这个类开始,对于代码不做太多解释,它们都很容易读的。
public class PageSortModel implements Serializable{
private int pageSize = 10;//页面大小
private int pageNo = 1;//页号
private transient int totalRows = 0;//总记录数
private transient int pageCount = 0;//总页数
private boolean all=false;
private Map orderMap=null;
private Limit limit;
private HttpServletRequest request;
public PageSortModel(HttpServletRequest request,String tableId){
this.request=request;
if(tableId==null) tableId="ec";
Context context = new HttpServletRequestContext(request);
LimitFactory limitFactory = new TableLimitFactory(context, tableId);
limit = new TableLimit(limitFactory);
this.pageNo=limit.getPage();
String rcdStr=context.getParameter(tableId+"_"+TableConstants.CURRENT_ROWS_DISPLAYED);
if(StringUtils.isNotBlank(rcdStr)){
this.pageSize=Integer.parseInt(rcdStr);
}
if(ExportFilterUtils.isExported(context)) all=true;
orderMap=WebUtils.getParametersStartingWith(request,tableId+"_"+TableConstants.SORT);

}
public PageSortModel(int pageNo) {
this.pageNo=pageNo;
}

public Map getOrderMap() {
return orderMap;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRows() {
return totalRows;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
if(limit!=null){
limit.setRowAttributes(totalRows,pageSize);
}
request.setAttribute("totalRows",new Integer(totalRows));

}
public int getRowStart() {
return (pageNo-1)*pageSize;

}
public boolean isAll() {
return all;
}
public void setAll(boolean all) {
this.all = all;
}

}
这里public PageSortModel(HttpServletRequest request,String tableId)(与eXtremeTable沟通)仅仅是为了便于使用而加入的,可以将其放入servlet中,使其不与eXtremeTable耦合。
 
Dao如下
 
/**
 
* 提供对分页查询的支持
 
* @param criteria 条件查询
 
* @param psm 分页对象
 
* @return List
 
*
 
*/
 
public List find(Criteria criteria,PageSortModel psm){
 
if(psm.getOrderMap()!=null){
 
return find(criteria,createOrders(psm.getOrderMap()),psm);
 
}
 
int totalCount =((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
 
psm.setTotalRows(totalCount);
 
criteria.setProjection(null);
 
if(!psm.isAll()){
 
criteria.setFirstResult(psm.getRowStart());
 
criteria.setMaxResults(psm.getPageSize());
 
}
 
return criteria.list();
 
}
 
完成数据的后台分页,通常可以将其放在 hibernate dao 的抽象父类中,那么 dao 的实现类就像如下所示:
public List findUsers(Map map,PageSortModel ps){
 
Criteria criteria = getSession().createCriteria(getPersistentClass());
 
String name = (String) map.get("name");
 
if (StringUtils.isNotEmpty(name))
 
criteria.add(Restrictions.like("name", "%" + name + "%"));
 
String email = (String) map.get("email");
 
if (StringUtils.isNotEmpty(email) )
 
criteria.add(Restrictions.like("email", "%" + email + "%"));
 
return super.find(criteria,ps);
 
}
Servlet Controller如下:
 
String tableId="usersTableId";//default is "ec"
 
Map map = WebUtils.getParametersStartingWith(request,"search_");
 
PageSortModel psm=new PageSortModel(request,tableId);
 
List resultList=userManager.findUser(map, psm);
 
这里tableId为TableTag的tableid,其默认值为“ec”如果使用如下语句创建PageSortModel
 
PageSortModel psm=new PageSortModel(request,null); tableId将设为“ec”。
 
最后当然需要TableTag需要添加如下属性:
 
tableId = "usersTableId" retrieveRowsCallback = "org.extremecomponents.table.callback.LimitCallback" filterRowsCallback = "org.extremecomponents.table.callback.LimitCallback" sortRowsCallback = "org.extremecomponents.table.callback.LimitCallback"
 
注意这里的 tableId 值要和 Controller 中的一致。
public List find(Criteria criteria,PageSortModel psm) 参数中的Criteria不能使用Order(排序),事实是也不需要使用Order,因为在PageSortModel使用了eXtremeTable的排序,因此不需加入额外的排序代码
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值