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

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


首先从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 TableTagtableid,其默认值为“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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值