登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

清风幻影的博客

Where there is love, I will be there.

 
 
 

日志

 
 
关于我

同是天涯沦落人,相逢何必曾相识. 天生我材必有用,千金散尽还复来. 天若有情天亦老,人间正道是沧桑. 月影西斜人已去, 堤上梅花情依旧, 此情故已成追忆, 美人如玉夜留香

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

2010-02-03 16:45:20|  分类: eXtremeTable |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://blog.csdn.net/tigerflower/archive/2006/08/22/1105036.aspx

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

  评论这张
 
阅读(718)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018