INTELLI

暂无签名

  • 博客访问: 454520
  • 博文数量: 42
  • 用 户 组: 普通用户
  • 注册时间: 1970-01-01 08:00
个人简介

鏆傛棤浠嬬粛

ITPUB论坛APP

ITPUB论坛APP



APP发帖 享双倍积分

文章分类

全部博文(42)

文章存档

2009年(1)

2007年(2)

2006年(21)

2004年(18)

我的朋友
微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

分类: 数据库开发技术

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

[@more@]

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

阅读(567565) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

shoeshop2014-12-08 15:26:47

很不错的想法

http://www.noobwatches.net/
http://www.noobwatches.net/%E6%B2%9B%E7%BA%B3%E6%B5%B7-c-1.html

评论热议
请登录后评论。

登录 注册