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的排序,因此不需加入额外的排序代码。