可以看到,我们之前的用户管理、角色管理和信息发布管理的列表下均有这些东西:
总共1条记录,当前第 1 页,共 1 页 上一页 下一页 到
这个就是美工留给我们做分页的,我们接下来就以信息发布管理模块为例做一个分页功能。
我们在做之前首先分析一下我们分页的规则:
总共1条记录,当前第 1 页,共 1 页 上一页 下一页 到
属性有:
总记录数
当前页号
总页数
页大小
列表记录
使用例子:
共6条记录,每页3条,共2页
总页数 = 总记录数/页大小
共7条记录,每页3条,共3页
tem = 总记录数/页大小;
总页数 = (总记录数%页大小==0)?tem:(tem+1)
页号;当总记录数为0时,页号为0
总共30条记录,每页10条,第2页的数据从第10开始(因为第一页从0开始)
下面开始进行分页功能的编写:
首先我们创建一个分页对象:
我们以后页面上的所有数据都会从分页对象中去取了。
我们下面来使用我们写的分页对象进行分页功能的编写。
我们在信息发布管理模块的InfoAction中引入分页对象PageResult、页号pageNo和页大小pageSize(get和set方法也要写):
并且我们的查询也随着分页发生改变,我们的每次都要根据当前页数来查询分配数据,这里我们修改一下InfoAction的listUI方法:
可以看到,我们infoService.getPageResult()方法是没有编写的,我们在baseService中去编写这个方法:
BaseService:
BaseServiceImpl:
然后我们在BaseDao中实现getPageResult方法:
BaseDao中:
BaseDaoImpl中:
在上面的代码中,我们使用了queryHelper.getQueryCountHql()方法来获取一个查询总记录数的hql语句,这个方法我们还没有,我们在QueryHelper类中添加这个方法:
我们通过BaseService和BaseDao在InfoAction的listUI方法中获取到我们的分页查询对象PageRueslt了,我们下面就在相应的信息发布管理列表模块的jsp中去使用它:
我们下面来测试,我们之前在信息发布区域管理存了8条新闻,按照我们预想的,我们每次只取出4条数据(pageSize默认为4),然后一共8条记录,一共是2页,我们来点击看一下是不是这样:
结果如我们所想,点击下一页的时候可以看到剩下的四条新闻:
总共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 pagNo,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="搜 索" onclick="doSearch()"/></li>
- <li style="float:right;">
- <input type="button" value="新增" class="s_button" onclick="doAdd()"/>
- <input type="button" value="删除" class="s_button" onclick="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" onclick="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;" 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>
- </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页,我们来点击看一下是不是这样:
结果如我们所想,点击下一页的时候可以看到剩下的四条新闻:
至此我们的分页功能完成。