CRM-分页查询
PageResult对象的设计
对象主要包括当前页号,总页数,数据列表,总记录数,每页大小。
public class PageResult {
//总记录数
private long totalCount;
//当前页号
private int pageNo;
//总页数
private int totalPageCount;
//页大小
private int pageSize;
//列表记录
private List items;
//计算总页数
public PageResult(long totalCount, int pageNo, int pageSize, List items) {
this.items = items==null?new ArrayList():items;
this.totalCount = totalCount;
this.pageSize = pageSize;
if(totalCount != 0){
//计算总页数
int tem = (int)totalCount/pageSize;
this.totalPageCount = (totalCount%pageSize==0)?tem:(tem+1);
this.pageNo = pageNo;
} else {
this.pageNo = 0;
}
}
public long getTotalCount() {
return totalCount;
}
public void setTotalCount(long totalCount) {
this.totalCount = totalCount;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getTotalPageCount() {
return totalPageCount;
}
public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public List getItems() {
return items;
}
public void setItems(List items) {
this.items = items;
}
}
BaseDao中分页查询方法的实现
NT:这里使用了QueryHelper,详情见其他博文。
public PageResult getPageResult(QueryHelper queryHelper, int pageNo, int pageSize) {
Query query = getSession().createQuery(queryHelper.getQueryListHql());
List<Object> parameters = queryHelper.getParameters();
if(parameters != null){
for(int i = 0; i < parameters.size(); i++){
query.setParameter(i, parameters.get(i));
}
}
if(pageNo < 1) pageNo = 1; //异常叶号进行处理
query.setFirstResult((pageNo-1)*pageSize);//设置数据起始索引号
query.setMaxResults(pageSize);
List items = query.list();
//获取总记录数
Query queryCount = getSession().createQuery(queryHelper.getQueryCountHql());
if(parameters != null){
for(int i = 0; i < parameters.size(); i++){
queryCount.setParameter(i, parameters.get(i));
}
}
long totalCount = (Long)queryCount.uniqueResult();
return new PageResult(totalCount, pageNo, pageSize, items);
}
}
Action中对于请求数据的处理
由于对action进行了抽取,在baseaction中,定义了如下3个实例变量
protected PageResult pageResult;
private int pageNo;
private int pageSize = DEFAULT_PAGE_SIZE;
public static int DEFAULT_PAGE_SIZE = 3; //pageSize应设置默认值
public String listUI() throws Exception{
//加载分类集合
ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP);
QueryHelper queryHelper = new QueryHelper(Info.class, "i");
/*普通分页查询、有条件的分页查询*/
pageResult = infoService.getPageResult(queryHelper, getPageNo(), getPageSize());
} catch (Exception e) {
throw new Exception(e.getMessage());
}
return "listUI";
}
在listUI中,对查询进行了集中,即普通分页查询、有条件的分页查询等走的都是这个action。
前台JSP页面,分页的抽取
前台页面并没有设计pageBar, 其实后台页面也没提供支持。
这里将前台分页抽取到了pageNavigator.jsp。
其他页面需要分页时只需
<s:if test="pageResult.totalCount > 0">
<table width="100%" class="pageDown" border="0" cellspacing="0"
cellpadding="0">
<tr>
<td align="right">
总共 <s:property value="pageResult.totalCount"/> 条记录,当前第 <s:property value="pageResult.pageNo"/> 页,
共 <s:property value="pageResult.totalPageCount"/> 页
<s:if test="pageResult.pageNo > 1">
<a href="javascript:doGoPage(<s:property value='pageResult.pageNo-1'/>)">上一页</a>
</s:if>
<s:if test="pageResult.pageNo < pageResult.totalPageCount">
<a href="javascript:doGoPage(<s:property value='pageResult.pageNo+1'/>)">下一页</a>
</s:if>
到 <input id="pageNo" name="pageNo" type="text" style="width: 30px;" onkeypress="if(event.keyCode == 13){doGoPage(this.value);}" min="1"
max="" value="<s:property value='pageResult.pageNo'/>" />
</td>
</tr>
</table>
</s:if><s:else>暂无数据!</s:else>
<script type="text/javascript">
//翻页
function doGoPage(pageNo){
document.getElementById("pageNo").value = pageNo;
document.forms[0].action=list_url; //提交url定义成全局,以便进行抽取
document.forms[0].submit();
}
</script>