[spring mvc踩坑填坑]spring mvc+hibernate实现分页

本篇博客使用的分页思路为前端页面传页码,后段根据页码和每页多少记录查询结果,并将得到的结果返回给前端页面。以此来实现分页查询。目录结构如下。


创建page类。首先我们先创建一个page类,这个类可以作为通用的分页类,代码如下:

package com.news.pojo;

import java.util.List;

public class NewsPage {
    // 结果集
    private List<NewContentEntity> list;

    // 查询记录总数
    private int totalRecords;

    // 每页多少条记录
    private int pageSize;

    // 第几页
    private int pageNo;

    /**
     * @return 总页数
     * */
    public int getTotalPages(){
        return (totalRecords+pageSize-1)/pageSize;
    }

    /**
     * 计算当前页开始记录
     * @param pageSize 每页记录数
     * @param currentPage 当前第几页
     * @return 当前页开始记录号
     */
    public int countOffset(int currentPage,int pageSize){
        int offset = pageSize*(currentPage-1);
        return offset;
    }

    /**
     * @return 首页
     * */
    public int getTopPageNo(){
        return 1;
    }

    /**
     * @return 上一页
     * */
    public int getPreviousPageNo(){
        if(pageNo<=1){
            return 1;
        }
        return pageNo-1;
    }

    /**
     * @return 下一页
     * */
    public int getNextPageNo(){
        if(pageNo>=getBottomPageNo()){
            return getBottomPageNo();
        }
        return pageNo+1;
    }

    /**
     * @return 尾页
     * */
    public int getBottomPageNo(){
        return getTotalPages();
    }


    public List<NewContentEntity> getList() {
        return list;
    }

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

    public int getTotalRecords() {
        return totalRecords;
    }

    public void setTotalRecords(int totalRecords) {
        this.totalRecords = totalRecords;
    }

    public int getPageSize() {
        return pageSize;
    }

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

    public int getPageNo() {
        return pageNo;
    }

    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
    }
}
此类为描述每页的数据信息和页码。


编写service类方法。进行数据查询的操作。

    public List<NewContentEntity> queryForPage(int offset, int length) {
        Session session = getCurrentSession();
        Query query = session.createQuery("from NewContentEntity ");
        query.setFirstResult(offset);
        query.setMaxResults(length);
        return query.list();
    }

    //查询记录总数
    public int getAllRowCount(){
        Session session = getCurrentSession();
        int count=((Long) session.createQuery( "select count(*) from NewContentEntity").iterate().next()).intValue();
        return count;
    }

    public NewsPage queryForNewsPage(int currentPage,int pageSize) {
        NewsPage page = new NewsPage();
        //总记录数
        int allRow = getAllRowCount();
        //当前页开始记录
        int offset = page.countOffset(currentPage,pageSize);
        //分页查询结果集
        List<NewContentEntity> list = queryForPage(offset, pageSize);
        page.setPageNo(currentPage);
        page.setPageSize(pageSize);
        page.setTotalRecords(allRow);
        page.setList(list);
        return page;
    }

在查询中,用到了query.setFirstResult()和 query.setMaxResults()方法,query.setFirstResult()为设置开始查询的位置,query.setMaxResults()为设置查询的数目。这就相当于hibernate自带的分页查询功能。


编写controller代码。通过向controller传入页码数来获取数据信息。主要是调用service中的方法。

    @RequestMapping(value = "/newsList", method = RequestMethod.GET)
    //找到所有的记录并实现了分页
    public String findAll(@RequestParam(value = "pageNo", required = false) String pageNo,Model model) {
        if (pageNo == null) {
            pageNo = "1";
        }
        NewsPage page = service.queryForNewsPage(Integer.valueOf(pageNo), 5);
        model.addAttribute("page", page);
        List<NewContentEntity> list = page.getList();
        model.addAttribute("list", list);
        return "AdminView/newsList";
    }

通过传入pageNo页码数来获取信息,每页显示五个。

jsp页面的编写。

<%@ taglib prefix="mvc" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: wangxiao
  Date: 2017/10/7
  Time: 下午5:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <title>新闻管理</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <script type="text/javascript" src="/js/jquery.js"></script>
    <script type="text/javascript" src="/js/slide.js"></script>
    <link rel="stylesheet" type="text/css" href="/css/main.css">
    <link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
</head>
<body>
<div class="head">
    <div class="headcontent"></div>
</div>
<div class="nav">
    <ul>
        <li><a href="" index="0">添加用户</a></li>
        <li><a href="" index="1">管理用户</a></li>
        <li><a href="" index="2">修改密码</a></li>
        <li><a href="" index="3">新闻管理</a></li>
        <li><a href="" index="4">添加新闻</a></li>
        <li><a href="" index="5">添加轮播图</a></li>
    </ul>
</div>
<div class="childmain" style="background:white">
    <div class="childmaincontent">
        <div class="rightchildcontent" style="width:100%;">
            <table class="table table-striped table-hover">
                <tr>
                    <td>新闻标题</td>
                    <td>作者</td>
                    <th>时间</th>
                    <td>操作</td>
                </tr>
                <mvc:forEach items="${list}" var="newContent">
                    <tr>
                        <td>${newContent.title}</td>
                        <td>${newContent.author}</td>
                        <td>${newContent.dateTime}</td>
                        <td>
                            <button class="btn btn-default btn-sm">编辑</button>
                            <button class="btn btn-danger btn-sm">删除</button>
                        </td>
                    </tr>
                </mvc:forEach>
            </table>
            <table>
                <tr>
                    <td colspan="6" align="center">共${page.totalRecords}条记录 共${page.totalPages}页 当前第${page.pageNo}页<br>
                        <a href="/admin/newsList?pageNo=${page.topPageNo}"><input type="button" name="fristPage" value="首页" /></a>
                        <mvc:choose>
                            <mvc:when test="${page.pageNo!=1}">
                                <a href="/admin/newsList?pageNo=${page.previousPageNo }"><input type="button" name="previousPage" value="上一页" /></a>
                            </mvc:when>
                            <mvc:otherwise>
                                <input type="button" disabled="disabled" name="previousPage" value="上一页" />
                            </mvc:otherwise>
                        </mvc:choose>
                        <mvc:choose>
                            <mvc:when test="${page.totalPages>3}">
                                <span><a href="/admin/newsList?pageNo=1">1</a></span><span><a href="/admin/newsList?pageNo=2">2</a></span>...<span><a href="/admin/newsList?pageNo=${page.totalPages}">${page.totalPages}</a></span>
                            </mvc:when>
                        </mvc:choose>
                        <mvc:choose>
                            <mvc:when test="${page.pageNo != page.totalPages}">
                                <a href="/admin/newsList?pageNo=${page.nextPageNo }"><input type="button" name="nextPage" value="下一页" /></a>
                            </mvc:when>
                            <mvc:otherwise>
                                <input type="button" disabled="disabled" name="nextPage" value="下一页" />
                            </mvc:otherwise>
                        </mvc:choose>
                        <a href="/admin/newsList?pageNo=${page.bottomPageNo}"><input type="button" name="lastPage" value="尾页" /></a>
                    </td>
                </tr>
            </table>
        </div>
    </div>
</div>
</body>
</html>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值