SSM中表单分页操作

本文介绍了在SSM(Spring、SpringMVC、MyBatis)框架中如何实现分页查询,通过在pom.xml中添加PageHelper依赖,配置SqlSessionFactoryBean,使用PageHelper.startPage()方法进行分页,并在Controller层利用PageInfo对象存储和传递分页信息。PageInfo类提供了丰富的分页属性,方便前端展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Maven pom.xml添加依赖

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.2</version>
    </dependency>

applicationContext.xml中 SqlSessionFactoryBean中添加拦截器数据库可以更换我用的是mysql数据库,使用其他数据库将mysql更换成其他数据库即可。

<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <!-- 传入PageHelper的插件 -->
    <property name="plugins">
        <array>
            <!-- 传入插件的对象 -->
            <bean class="com.github.pagehelper.PageInterceptor">
                <property name="properties">
                    <props>
                        <prop key="helperDialect">mysql</prop>
                        <prop key="reasonable">true</prop>
                    </props>
                </property>
            </bean>
        </array>
    </property>
</bean>

下面就可以使用分页了,需要在serviceImpl调用dao层代码的上一行添加
PageHelper.startPage(pageNum,pageSize);

@Override
public List<Syslog> selAll(Integer pageNum, Integer pageSize) {
    PageHelper.startPage(pageNum,pageSize);
    return iSysLogDao.selAll();
}

controller层需要将信息储存在PageInfo这个对象中

@RequestMapping("/show")
public ModelAndView show(@RequestParam(defaultValue = "1",required = true) Integer pageNum,@RequestParam(defaultValue = "10",required = true) Integer pageSize){
    ModelAndView modelAndView=new ModelAndView("syslog-list");
    List<Syslog> syslogList=iSysLogService.selAll(pageNum,pageSize);
    PageInfo pageInfo=new PageInfo(syslogList);
    modelAndView.addObject("pageInfo",pageInfo);

    return modelAndView;
}

需要注意在前端调用pageInfo.list

							<c:forEach items="${pageInfo.list}" var="syslog">
								<tr>
									<td><input name="ids" type="checkbox"></td>
									<td>${syslog.id}</td>
									<td>${syslog.visitTimeStr }</td>
									<td>${syslog.username }</td>
									<td>${syslog.ip }</td>
									<td>${syslog.url}</td>
									<td>${syslog.executionTime}毫秒</td>
									<td>${syslog.method}</td>										
								</tr>
							</c:forEach>

pageInfo封装了分页信息,可以直接使用,

				<div class="box-tools pull-right">
					<ul class="pagination">
						<li><a href="${pageContext.request.contextPath}/sysLog/show?pageNum=1&pageSize=${pageInfo.pageSize}" aria-label="Previous">首页</a></li>
						<li><a href="${pageContext.request.contextPath}/sysLog/show?pageNum=${pageInfo.pageNum-1}&pageSize=${pageInfo.pageSize}">上一页</a></li>
						<c:forEach begin="1" end="${pageInfo.pages}" var="pageNum">
							<li><a href="${pageContext.request.contextPath}/sysLog/show?pageNum=${pageNum}&pageSize=${pageInfo.pageSize}">${pageNum}</a></li>
						</c:forEach>
						<li><a href="${pageContext.request.contextPath}/sysLog/show?pageNum=${pageInfo.pageNum+1}&pageSize=${pageInfo.pageSize}">下一页</a></li>
						<li><a href="${pageContext.request.contextPath}/sysLog/show?pageNum=${pageInfo.pages}&pageSize=${pageInfo.pageSize}" aria-label="Next">尾页</a></li>
					</ul>
				</div>

下面是PageInfo源代码

/*

  • The MIT License (MIT)
  • Copyright © 2014-2017 abel533@gmail.com
  • Permission is hereby granted, free of charge, to any person obtaining a copy
  • of this software and associated documentation files (the “Software”), to deal
  • in the Software without restriction, including without limitation the rights
  • to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  • copies of the Software, and to permit persons to whom the Software is
  • furnished to do so, subject to the following conditions:
  • The above copyright notice and this permission notice shall be included in
  • all copies or substantial portions of the Software.
  • THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  • IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  • FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  • AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  • LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  • OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  • THE SOFTWARE.
    */

package com.github.pagehelper;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**

  • 对Page结果进行包装

  • 新增分页的多项属性,主要参考:http://bbs.youkuaiyun.com/topics/360010907

  • @author liuzh/abel533/isea533

  • @version 3.3.0

  • @since 3.2.2

  • 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper
    */
    @SuppressWarnings({“rawtypes”, “unchecked”})
    public class PageInfo implements Serializable {
    private static final long serialVersionUID = 1L;
    //当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;

    //由于startRow和endRow不常用,这里说个具体的用法
    //可以在页面中"显示startRow到endRow 共size条数据"

    //当前页面第一个元素在数据库中的行号
    private int startRow;
    //当前页面最后一个元素在数据库中的行号
    private int endRow;
    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List list;

    //前一页
    private int prePage;
    //下一页
    private int nextPage;

    //是否为第一页
    private boolean isFirstPage = false;
    //是否为最后一页
    private boolean isLastPage = false;
    //是否有前一页
    private boolean hasPreviousPage = false;
    //是否有下一页
    private boolean hasNextPage = false;
    //导航页码数
    private int navigatePages;
    //所有导航页号
    private int[] navigatepageNums;
    //导航条上的第一页
    private int navigateFirstPage;
    //导航条上的最后一页
    private int navigateLastPage;

    public PageInfo() {
    }

    /**

    • 包装Page对象
    • @param list
      */
      public PageInfo(List list) {
      this(list, 8);
      }

    /**

    • 包装Page对象

    • @param list page结果

    • @param navigatePages 页码数量
      */
      public PageInfo(List list, int navigatePages) {
      if (list instanceof Page) {
      Page page = (Page) list;
      this.pageNum = page.getPageNum();
      this.pageSize = page.getPageSize();

       this.pages = page.getPages();
       this.list = page;
       this.size = page.size();
       this.total = page.getTotal();
       //由于结果是>startRow的,所以实际的需要+1
       if (this.size == 0) {
           this.startRow = 0;
           this.endRow = 0;
       } else {
           this.startRow = page.getStartRow() + 1;
           //计算实际的endRow(最后一页的时候特殊)
           this.endRow = this.startRow - 1 + this.size;
       }
      

      } else if (list instanceof Collection) {
      this.pageNum = 1;
      this.pageSize = list.size();

       this.pages = this.pageSize > 0 ? 1 : 0;
       this.list = list;
       this.size = list.size();
       this.total = list.size();
       this.startRow = 0;
       this.endRow = list.size() > 0 ? list.size() - 1 : 0;
      

      }
      if (list instanceof Collection) {
      this.navigatePages = navigatePages;
      //计算导航页
      calcNavigatepageNums();
      //计算前后页,第一页,最后一页
      calcPage();
      //判断页面边界
      judgePageBoudary();
      }
      }

    /**

    • 计算导航页
      */
      private void calcNavigatepageNums() {
      //当总页数小于或等于导航页码数时
      if (pages <= navigatePages) {
      navigatepageNums = new int[pages];
      for (int i = 0; i < pages; i++) {
      navigatepageNums[i] = i + 1;
      }
      } else { //当总页数大于导航页码数时
      navigatepageNums = new int[navigatePages];
      int startNum = pageNum - navigatePages / 2;
      int endNum = pageNum + navigatePages / 2;

       if (startNum < 1) {
           startNum = 1;
           //(最前navigatePages页
           for (int i = 0; i < navigatePages; i++) {
               navigatepageNums[i] = startNum++;
           }
       } else if (endNum > pages) {
           endNum = pages;
           //最后navigatePages页
           for (int i = navigatePages - 1; i >= 0; i--) {
               navigatepageNums[i] = endNum--;
           }
       } else {
           //所有中间页
           for (int i = 0; i < navigatePages; i++) {
               navigatepageNums[i] = startNum++;
           }
       }
      

      }
      }

    /**

    • 计算前后页,第一页,最后一页
      */
      private void calcPage() {
      if (navigatepageNums != null && navigatepageNums.length > 0) {
      navigateFirstPage = navigatepageNums[0];
      navigateLastPage = navigatepageNums[navigatepageNums.length - 1];
      if (pageNum > 1) {
      prePage = pageNum - 1;
      }
      if (pageNum < pages) {
      nextPage = pageNum + 1;
      }
      }
      }

    /**

    • 判定页面边界
      */
      private void judgePageBoudary() {
      isFirstPage = pageNum == 1;
      isLastPage = pageNum == pages || pages == 0;;
      hasPreviousPage = pageNum > 1;
      hasNextPage = pageNum < pages;
      }

    public int getPageNum() {
    return pageNum;
    }

    public void setPageNum(int pageNum) {
    this.pageNum = pageNum;
    }

    public int getPageSize() {
    return pageSize;
    }

    public void setPageSize(int pageSize) {
    this.pageSize = pageSize;
    }

    public int getSize() {
    return size;
    }

    public void setSize(int size) {
    this.size = size;
    }

    public int getStartRow() {
    return startRow;
    }

    public void setStartRow(int startRow) {
    this.startRow = startRow;
    }

    public int getEndRow() {
    return endRow;
    }

    public void setEndRow(int endRow) {
    this.endRow = endRow;
    }

    public long getTotal() {
    return total;
    }

    public void setTotal(long total) {
    this.total = total;
    }

    public int getPages() {
    return pages;
    }

    public void setPages(int pages) {
    this.pages = pages;
    }

    public List getList() {
    return list;
    }

    public void setList(List list) {
    this.list = list;
    }

    @Deprecated
    // firstPage就是1, 此函数获取的是导航条上的第一页, 容易产生歧义
    public int getFirstPage() {
    return navigateFirstPage;
    }

    @Deprecated
    public void setFirstPage(int firstPage) {
    this.navigateFirstPage = firstPage;
    }

    public int getPrePage() {
    return prePage;
    }

    public void setPrePage(int prePage) {
    this.prePage = prePage;
    }

    public int getNextPage() {
    return nextPage;
    }

    public void setNextPage(int nextPage) {
    this.nextPage = nextPage;
    }

    @Deprecated
    // 请用getPages()来获取最后一页, 此函数获取的是导航条上的最后一页, 容易产生歧义.
    public int getLastPage() {
    return navigateLastPage;
    }

    @Deprecated
    public void setLastPage(int lastPage) {
    this.navigateLastPage = lastPage;
    }

    public boolean isIsFirstPage() {
    return isFirstPage;
    }

    public void setIsFirstPage(boolean isFirstPage) {
    this.isFirstPage = isFirstPage;
    }

    public boolean isIsLastPage() {
    return isLastPage;
    }

    public void setIsLastPage(boolean isLastPage) {
    this.isLastPage = isLastPage;
    }

    public boolean isHasPreviousPage() {
    return hasPreviousPage;
    }

    public void setHasPreviousPage(boolean hasPreviousPage) {
    this.hasPreviousPage = hasPreviousPage;
    }

    public boolean isHasNextPage() {
    return hasNextPage;
    }

    public void setHasNextPage(boolean hasNextPage) {
    this.hasNextPage = hasNextPage;
    }

    public int getNavigatePages() {
    return navigatePages;
    }

    public void setNavigatePages(int navigatePages) {
    this.navigatePages = navigatePages;
    }

    public int[] getNavigatepageNums() {
    return navigatepageNums;
    }

    public void setNavigatepageNums(int[] navigatepageNums) {
    this.navigatepageNums = navigatepageNums;
    }

    public int getNavigateFirstPage() {
    return navigateFirstPage;
    }

    public int getNavigateLastPage() {
    return navigateLastPage;
    }

    public void setNavigateFirstPage(int navigateFirstPage) {
    this.navigateFirstPage = navigateFirstPage;
    }

    public void setNavigateLastPage(int navigateLastPage) {
    this.navigateLastPage = navigateLastPage;
    }

    @Override
    public String toString() {
    final StringBuffer sb = new StringBuffer(“PageInfo{”);
    sb.append(“pageNum=”).append(pageNum);
    sb.append(", pageSize=").append(pageSize);
    sb.append(", size=").append(size);
    sb.append(", startRow=").append(startRow);
    sb.append(", endRow=").append(endRow);
    sb.append(", total=").append(total);
    sb.append(", pages=").append(pages);
    sb.append(", list=").append(list);
    sb.append(", prePage=").append(prePage);
    sb.append(", nextPage=").append(nextPage);
    sb.append(", isFirstPage=").append(isFirstPage);
    sb.append(", isLastPage=").append(isLastPage);
    sb.append(", hasPreviousPage=").append(hasPreviousPage);
    sb.append(", hasNextPage=").append(hasNextPage);
    sb.append(", navigatePages=").append(navigatePages);
    sb.append(", navigateFirstPage=").append(navigateFirstPage);
    sb.append(", navigateLastPage=").append(navigateLastPage);
    sb.append(", navigatepageNums=");
    if (navigatepageNums == null) sb.append(“null”);
    else {
    sb.append(’[’);
    for (int i = 0; i < navigatepageNums.length; ++i)
    sb.append(i == 0 ? “” : ", ").append(navigatepageNums[i]);
    sb.append(’]’);
    }
    sb.append(’}’);
    return sb.toString();
    }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值