如何使DataSet支持分页处理
设置DataSet或Reference的pageSize
Page对象说明
dorado中的DataSet或Reference中如果设置了pageSize属性,我们就要求后台对应的DataProvider方法的签名中含page对象,如下图:
这个方法与不设定pageSize属性的方法有所不同:
DataSet在不分页情况下,DataProvider直接将Java方法的返回数据或数据集合作为客户端ajax请求的相应数据,而设置了分页后方法设置为void类型,那么返回的数据就需要通过page对象这个载体返回到前台。下面我们对page对象的使用做详细说明。
由于查询结果已经不通过方法的返回值返回,那么我们需要将查询结果放在page对象中,参考范例:
@DataProvider public void findDataResources(Page<BusinessDataResource> page,Map<String,Object> params) throws Exception{ BusinessDataResource bd=new BusinessDataResource(); if(params!=null){ if(params.get("domainName")!=null){ bd.setDomainName(params.get("domainName").toString()); } if(params.get("fieldName")!=null){ bd.setFieldName(params.get("fieldName").toString()); } } Pagination<BusinessDataResource> p=businessDataManager.queryBusinessData(bd, page.getPageNo(), page.getPageSize()); page.setEntities(p.getResults()); page.setEntityCount(p.getTotalCount()); }
注意page对象的几个方法:
getPageSize()
这个方法容易理解,就是我们在DataSet中配置的pageSize属性的值或Reference中配置的pageSize属性值,如图:
getPageNo()
我们知道dataProvider方法是一个ajax方法,由客户端发起请求激活这个方法获取相应的数据,客户端发起请求的方式有很多,如下通过DataPilot翻页操作也是其中的一种:
如上图,当我们指定加载某一页数据的时候,会自动的将这个页号发送到dataProvider中,在dataProvider中我们就可以根据Page对象的getPageNo方法获得这个页号信息。
setEntities(xxx)
当我们通过page.getPageSize()和page.getPageNo方法获取到前台期望获取的某一页的数据请求,我们就可以通过dao到后台进行分页数据查询,如Oracle数据库中我们通过如下的SQL查询出第三页的数据:
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 30 ) WHERE RN >= 21
将查询出的数据通过page.setEntities()方法放在page对象中。如前面范例中的倒数第三行代码:
@DataProvider public void findDataResources(Page<BusinessDataResource> page,Map<String,Object> params) throws Exception{ BusinessDataResource bd=new BusinessDataResource(); if(params!=null){ if(params.get("domainName")!=null){ bd.setDomainName(params.get("domainName").toString()); } if(params.get("fieldName")!=null){ bd.setFieldName(params.get("fieldName").toString()); } } Pagination<BusinessDataResource> p=businessDataManager.queryBusinessData(bd, page.getPageNo(), page.getPageSize()); page.setEntities(p.getResults()); page.setEntityCount(p.getTotalCount()); }
另外对于SQL中的ROWNUM的数字计算,也可以通过page对象的两个方法获得:
- page.getFirstEntityIndex():根据pageNo和pageSize属性自动计算起始序号
- page.getLastEntityIndex():根据pageNo和pageSize属性自动计算结束序号
setEntityCount(xxx)
setEntityCount()方法,主要告诉客户端这次查询符合条件的总记录数有多少,对于分页查询的功能来说,它需要知道查询的总记录数,从而可以计算出共有多少页数据,便于客户端的管理。
如下的DataPilot中的展现信息就是根据你告诉它的总记录数信息计算出的总页数信息。当然对于客户端数据管理来说只要使用了分页技术,无论你用没用DataPilot对象,在DataProvider中你都必须调用page对象的setEntities()和setEntityCount()两个方法,完成分页基本信息的设置。
Attachments:
pageNo.png (image/png)
pageSize.png (image/png)
image2012-8-17 10:39:15.png (image/png)
image2012-8-17 10:40:26.png (image/png)