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