可以看到,我们之前的用户管理、角色管理和信息发布管理的列表下均有这些东西:
总共1条记录,当前第 1 页,共 1 页    上一页  下一页 到

这个就是美工留给我们做分页的,我们接下来就以信息发布管理模块为例做一个分页功能。

我们在做之前首先分析一下我们分页的规则:
总共1条记录,当前第 1 页,共 1 页    上一页  下一页 到

属性有:
总记录数
当前页号
总页数
页大小
列表记录

使用例子:
共6条记录,每页3条,共2页

总页数 = 总记录数/页大小

共7条记录,每页3条,共3页

tem = 总记录数/页大小;

总页数 = (总记录数%页大小==0)?tem:(tem+1)

页号;当总记录数为0时,页号为0

总共30条记录,每页10条,第2页的数据从第10开始(因为第一页从0开始)

下面开始进行分页功能的编写:
首先我们创建一个分页对象:

package cn.edu.hpu.tax.core.page;import java.util.ArrayList;
import java.util.List;public class PageResult {//总记录数private long totalCount;//当前页号private int pageNo;//总页数private int totalPageCount;//页大小private int pageSize; //列表记录private List items;public PageResult(){}//计算总页数public PageResult(long totalCount, int pageNo, int pageSize, List items) {super();this.totalCount = totalCount;this.pageNo = pageNo;this.pageSize = pageSize;this.items = items==null?new ArrayList():items;if(totalCount!=0){//计算总数int tem=(int)totalCount/pageSize;this.totalPageCount=(totalCount%pageSize==0)?tem:(tem+1);}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;}
}

我们以后页面上的所有数据都会从分页对象中去取了。
我们下面来使用我们写的分页对象进行分页功能的编写。

我们在信息发布管理模块的InfoAction中引入分页对象PageResult、页号pageNo和页大小pageSize(get和set方法也要写):

//分页对象
private PageResult pageResult;
//页号
private int pageNo;
//页大小
private int pageSize;public PageResult getPageResult() {return pageResult;
}
public void setPageResult(PageResult pageResult) {this.pageResult = pageResult;
}
public int getPageNo() {return pageNo;
}
public void setPageNo(int pageNo) {this.pageNo = pageNo;
}
public int getPageSize() {//给的默认的分页大小if(pageSize < 1) pageSize = 4;return pageSize;
}
public void setPageSize(int pageSize) {this.pageSize = pageSize;
}

并且我们的查询也随着分页发生改变,我们的每次都要根据当前页数来查询分配数据,这里我们修改一下InfoAction的listUI方法:

//列表页面
public String listUI() throws Exception{try {//加载分类集合ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP);QueryHelper queryHelper=new QueryHelper(Info.class,"i");if(info != null){if(StringUtils.isNotBlank(info.getTitle())){info.setTitle(URLDecoder.decode(info.getTitle(),"utf-8"));queryHelper.addCondition("i.title like ?", "%"+info.getTitle()+"%");}queryHelper.addCondition("i.state = ?", "1");}//根据创建时间降序排序queryHelper.addOrderByProperty("i.createTime", queryHelper.ORDER_BY_DESC);pageResult=infoService.getPageResult(queryHelper,getPageNo(),getPageSize());} catch (Exception e) {throw new Exception(e.getMessage());}return "listUI";
}

可以看到,我们infoService.getPageResult()方法是没有编写的,我们在baseService中去编写这个方法:
BaseService:

//分页
public PageResult getPageResult(QueryHelper queryHelper, int pageNo,int pageSize);

BaseServiceImpl:

@Override
public PageResult getPageResult(QueryHelper queryHelper, int pageNo,int pageSize) {return baseDao.getPageResult(queryHelper,pageNo,pageSize);
}

然后我们在BaseDao中实现getPageResult方法:
BaseDao中:

//分页
public PageResult getPageResult(QueryHelper queryHelper, int pageNo,int pageSize);

BaseDaoImpl中:

@Override
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);
}

在上面的代码中,我们使用了queryHelper.getQueryCountHql()方法来获取一个查询总记录数的hql语句,这个方法我们还没有,我们在QueryHelper类中添加这个方法:

//查询统计数的hql语句
public String getQueryCountHql(){return "SELECT COUNT(*) "+fromClause+whereClause;
}

我们通过BaseService和BaseDao在InfoAction的listUI方法中获取到我们的分页查询对象PageRueslt了,我们下面就在相应的信息发布管理列表模块的jsp中去使用它:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><%@include file="/common/header.jsp"%><title>信息发布管理</title><script type="text/javascript">//全选、全反选function doSelectAll(){// jquery 1.6 前//$("input[name=selectedRow]").attr("checked", $("#selAll").is(":checked"));//prop jquery 1.6+建议使用$("input[name=selectedRow]").prop("checked", $("#selAll").is(":checked"));      }//新增function doAdd(){document.forms[0].action = "${basePath}tax/info_addUI.action";document.forms[0].submit();}//编辑function doEdit(id){document.forms[0].action = "${basePath}tax/info_editUI.action?info.infoId=" + id;document.forms[0].submit();}//删除function doDelete(id){document.forms[0].action = "${basePath}tax/info_delete.action?info.infoId=" + id;document.forms[0].submit();}//批量删除function doDeleteAll(){document.forms[0].action = "${basePath}tax/info_deleteSelected.action";document.forms[0].submit();}//异步发布信息,信息的id以及将要改成的状态值function doPublic(infoId,state){//1.更新信息状态$.ajax({url:"${basePath}tax/info_publicInfo.action",data:{"info.infoId":infoId,"info.state":state},type:"post",success:function(msg){//2.更新状态栏,操作栏的显示值if("更新状态成功"==msg){if(state==1){//说明信息状态已经被改成发布,操作栏被改为停用$("#show_"+infoId).html("发布");$("#oper_"+infoId).html('<a href="javascript:doPublic(\''+infoId+'\',0)">停用</a>');}else{$("#show_"+infoId).html("停用");$("#oper_"+infoId).html('<a href="javascript:doPublic(\''+infoId+'\',1)">发布</a>');}}else{alert("更新信息状态失败!");}},error:function(){alert("更新信息状态失败!");}});}    function doSearch(){document.forms[0].action = "${basePath}tax/info_listUI.action";document.forms[0].submit();}</script>
</head>
<body class="rightBody">
<form name="form1" action="" method="post"><div class="p_d_1"><div class="p_d_1_1"><div class="content_info"><div class="c_crumbs"><div><b></b><strong>信息发布管理</strong></div> </div><div class="search_art"><li>信息标题:<s:textfield name="info.title" cssClass="s_text" id="infoTitle"  cssStyle="width:160px;"/></li><li><input type="button" class="s_button" value="搜 索" οnclick="doSearch()"/></li><li style="float:right;"><input type="button" value="新增" class="s_button" οnclick="doAdd()"/> <input type="button" value="删除" class="s_button" οnclick="doDeleteAll()"/> </li></div><div class="t_list" style="margin:0px; border:0px none;"><table width="100%" border="0"><tr class="t_tit"><td width="30" align="center"><input type="checkbox" id="selAll" οnclick="doSelectAll()" /></td><td align="center">信息标题</td><td width="120" align="center">信息分类</td><td width="120" align="center">创建人</td><td width="140" align="center">创建时间</td><td width="80" align="center">状态</td><td width="120" align="center">操作</td></tr><s:iterator value="pageResult.items" status="st"><tr <s:if test="#st.odd"> bgcolor="f8f8f8" </s:if> ><td align="center"><input type="checkbox" name="selectedRow" value="<s:property value='infoId'/>"/></td><td align="center"><s:property value="title"/></td><td align="center"><s:property value="#infoTypeMap[type]"/>    </td><td align="center"><s:property value="creator"/></td><td align="center"><s:date name="createTime" format="yyyy-MM-dd HH:mm"/></td><td id="show_<s:property value='infoId'/>" align="center"><s:property value="state==1?'发布':'停用'"/></td><td align="center"><span id="oper_<s:property value='infoId'/>"><s:if test="state==1"><a href="javascript:doPublic('<s:property value='infoId'/>',0)">停用</a></s:if><s:else><a href="javascript:doPublic('<s:property value='infoId'/>',1)">发布</a></s:else></span><a href="javascript:doEdit('<s:property value='infoId'/>')">编辑</a><a href="javascript:doDelete('<s:property value='infoId'/>')">删除</a></td></tr></s:iterator></table></div></div><div class="c_pate" style="margin-top: 5px;"><!-- 如果页数为空不显示分页选项 --><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;" οnkeypress="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>   </div><script type="text/javascript">//翻页方法function doGoPage(pageNo){document.getElementById("pageNo").value = pageNo;document.forms[0].action="${basePath}tax/info_listUI.action";document.forms[0].submit();}</script></div></div>
</form></body>
</html>

我们下面来测试,我们之前在信息发布区域管理存了8条新闻,按照我们预想的,我们每次只取出4条数据(pageSize默认为4),然后一共8条记录,一共是2页,我们来点击看一下是不是这样:

结果如我们所想,点击下一页的时候可以看到剩下的四条新闻:

至此我们的分页功能完成。下一次我们进行优化

转载请注明出处:http://blog.csdn.net/acmman/article/details/49942621

【SSH项目实战】国税协同平台-26.分页功能编写相关推荐

  1. 项目实战---国税协同办公平台---day01

    SSH框架搭建及整合 1. 新建数据库及web项目 **1.1 创建数据库** CREATE DATABASE itcastTax DEFAULT CHARACTER SET utf8 COLLATE ...

  2. 【SSH项目实战】国税协同平台-1.项目介绍

    项目介绍 1.1项目背景 国税协同办公平台包括了行政管理.后勤服务.在线学习.纳税服务.我的空间等几个子系统:我们本次主要的开发功能是纳税服务子系统的部分模块和基于纳税服务子系统信息的个人工作台首页. ...

  3. 【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)

    [.NET Core项目实战-统一认证平台]第四章 网关篇-数据库存储配置(2) 原文:[.NET Core项目实战-统一认证平台]第四章 网关篇-数据库存储配置(2) [.NET Core项目实战- ...

  4. 【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)

    [.NET Core项目实战-统一认证平台]第三章 网关篇-数据库存储配置(1) 原文:[.NET Core项目实战-统一认证平台]第三章 网关篇-数据库存储配置(1) [.NET Core项目实战- ...

  5. 【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式

    上篇文章我介绍了如何强制令牌过期的实现,相信大家对IdentityServer4的验证流程有了更深的了解,本篇我将介绍如何使用自定义的授权方式集成老的业务系统验证,然后根据不同的客户端使用不同的认证方 ...

  6. 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...

    上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本篇就针对第一个思考问题详细的讲解下Ids4是如何生成acce ...

  7. 【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式

    上篇文章介绍了基于Ids4客户端授权的原理及如何实现自定义的客户端授权,并配合网关实现了统一的授权异常返回值和权限配置等相关功能,本篇将介绍密码授权模式,从使用场景.源码剖析到具体实现详细讲解密码授权 ...

  8. 【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权

    上篇文章介绍了如何使用Dapper持久化IdentityServer4(以下简称ids4)的信息,并实现了sqlserver和mysql两种方式存储,本篇将介绍如何使用ids4进行客户端授权. .ne ...

  9. 【.NET Core项目实战-统一认证平台】第九章 授权篇-使用Dapper持久化IdentityServer4...

    上篇文章介绍了IdentityServer4的源码分析的内容,让我们知道了IdentityServer4的一些运行原理,这篇将介绍如何使用dapper来持久化Identityserver4,让我们对I ...

最新文章

  1. 蓝卡在哪里_什么是蓝卡,魅力在哪里,让申请者为之着迷?
  2. 秒杀多线程第八篇 经典线程同步 信号量Semaphore
  3. numpy.ceil() 和 numpy.floor()--向上取整和向下取整
  4. 顺序三元组 java_hihocoder-1550-顺序三元组
  5. Python Tricks(二十)—— 阶乘的极简实现
  6. 08.存储Cinder→5.场景学习→12.Ceph Volume Provider→5.Detach Volume
  7. 小车故障灯亮显示大全_原创案例丨17款迈锐宝XL缺缸故障
  8. 七种滤波方法测试matlab
  9. MATLAB GUI编程总结
  10. 程序员的日常工作是怎样的?
  11. http状态404 vscode_HTTP常见状态码(404、400、500)等错误
  12. java实现ftp文件上传失败_用java+ftp实现文件上传的问题?
  13. HTML5作业:实现小米官网静态首页
  14. 编辑中的word变成只读_教大家word文档变成只读模式怎么改
  15. 2015年第四届C/C++ A组蓝桥杯省赛真题
  16. Unity3d光影烘焙常见缺陷的解决方法【2020】
  17. 自动化系2023挑战杯预审相关资料
  18. 裸奔真的会中木马病毒 挖矿病毒 wup.exe 程序文件占用电脑资源
  19. time.h头文件解析
  20. html转换成jsp格式文件

热门文章

  1. 因为名字叫True,她被苹果iCloud服务器拒绝了
  2. 日本人真会玩!3天众筹60万元来造“机器猫”,会说话摇尾巴的那种
  3. 计算力即生产力,智算中心就是智慧时代的“发电厂” | MEET2021
  4. 3天初版部署7天快速迭代!百度飞桨携手北京地铁落地AI口罩检测方案
  5. “完全自主”的木兰编程语言回应:承认基于Python二次开发,向中科院致歉
  6. Nature年度十大科学人物公布:瑞典气候女孩、北大邓宏魁、谷歌量子计算领导者上榜...
  7. 波士顿动力机器狗测评来了!售价堪比豪车,避障、导航、舞蹈样样都行,买不起还能租...
  8. Python Numpy 从文件中读取数据
  9. Android 6.0 变更
  10. 100多个基础常用JS函数和语法集合大全