分页实现一
由分页的视图分析出分页的对象模型Page类
-
pageNo 当前页码
由客户端进行传递
-
pageTotal 总页码
- 总页码可以由总记录数/每页数量得到
- 注:总记录数%每页数量>0,则总页码+1
-
pageTotalCount 总记录数
- 由sql语句求得,sql语句为select count(*) from 表名。
-
pageSize 每页显示数量
- 一:由客户端传递
- 二:由页面布局决定
-
items 当前页数据
- sql语句求得:select * from 表名 limit begin,pageSize;
- begin开始行 可以由公式求得(pageNo-1)X pageSize
分页模型Page的抽取
import java.util.List;
//T是具体的模块的javaBean类
public class Page<T> {
public static final Integer PAGE_SIZE=4;
//当前页码数
private Integer pageNo;
//总页码数
private Integer pageTotal;
//总记录数
private Integer pageTotalCount;
//当前页显示数量
private Integer pageSize=PAGE_SIZE;
//当前页显示数据
private List<T> items;
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getPageNo() {
return pageNo;
}
public void setPageNo(Integer pageNo) {
//数据边界的有效校验
// if(pageNo<1){
// pageNo=1;
// }
// if(pageNo>pageTotal){
// pageNo=pageTotal;
// }
this.pageNo = pageNo;
}
public Integer getPageTotal() {
return pageTotal;
}
public void setPageTotal(Integer pageTotal) {
this.pageTotal = pageTotal;
}
public Integer getPageTotalCount() {
return pageTotalCount;
}
public void setPageTotalCount(Integer pageTotalCount) {
this.pageTotalCount = pageTotalCount;
}
public List<T> getItems() {
return items;
}
public void setItems(List<T> items) {
this.items = items;
}
@Override
public String toString() {
return "Page{" +
"pageNo=" + pageNo +
", pageTotal=" + pageTotal +
", pageTotalCount=" + pageTotalCount +
", pageSize=" + pageSize +
", items=" + items +
", url='" + url + '\'' +
'}';
}
}
分页的初步实现
Dao层
IBookDao
//分页实现
long getCount();
//cs当前页码 ns页显示数据量
List<Book> getByPage(int cp,int ns);
IBookDaoImpl
QueryRunner qr = new QueryRunner(DBPoolUtil.getDataSource());
@Override
public List<Book> getByPage(int cp, int ns) {
int si = (cp -1)* ns;
try {
return qr.query("select * from t_book limit ?,?",new BeanListHandler<Book>(Book.class),si,ns);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
@Override
public long getCount() {
try {
return qr.query("select count(1) from t_book",new ScalarHandler<>());
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return 0;
}
service层
IBookService
long getCount();
Page<Book> page(int pageNo, int pageSize);
IBookServiceImpl
private IBookDao iBookDao = new IBookDaoImpl();
@Override
public long getCount() {
return iBookDao.getCount();
}
@Override
public Page2<Book> page(int pageNo, int pageSize) {
Page2 <Book> page = new Page2<>();
//设置当前页码
page.setPageNo(pageNo);
//设置每页显示的数量
page.setPageSize(pageSize);
//求总记录数
int totalCount = (int) iBookDao.getCount();
//设置总记录数
page.setPageTotalCount(totalCount);
//求总页码
int totalPage = totalCount%pageSize == 0 ?totalCount/pageSize:totalCount/pageSize+1;
//设置总页码
page.setPageTotal(totalPage);
//求当前页开始索引
int begin = (pageNo - 1) * pageSize;
//求当前页数据
List<Book> items = iBookDao.getByPage(begin,pageSize);
//设置当前页数据
return page;
}
controller层
BookServlet
protected void getAllBookByPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1 获取请求的参数 pageNo 和 pageSize
int pageNo = WebUtils.parseInt(request.getParameter("pageNo"), 1);
int pageSize = WebUtils.parseInt(request.getParameter("pageSize"), Page2.PAGE_SIZE);
//2 调用 BookService.page(pageNo,pageSize):Page 对象
Page2<Book> page = iBookService.page(pageNo, pageSize);
System.out.println(page.getItems());
//3 保存 Page 对象到 Request 域中
request.setAttribute("page",page);
//4 请求转发到/pages/book/booksPage.jsp 页面
request.getRequestDispatcher("/pages/book/booksByPage.jsp").forward(request,response);
}
WebUtils
public class WebUtils {
/*** 将字符串转换成为 int 类型的数据 * @param strInt * @param defaultValue * @return */
public static int parseInt(String strInt,int defaultValue) {
try {return Integer.parseInt(strInt);
} catch (Exception e)
{ e.printStackTrace(); }
return defaultValue;
}
}
books.jsp
<div id="page_nav">
<a href="#">首页</a>
<a href="#">上一页</a>
<a href="#">3</a>
【${ requestScope.page.pageNo }】
<a href="#">5</a>
<a href="#">下一页</a>
<a href="#">末页</a>
共${ requestScope.page.pageTotal }页,${ requestScope.page.pageTotalCount }条记录
到第<input value="4" name="pn" id="pn_input"/>页 <input type="button" value="确定"> </div>
首页、上一页、下一页 末页实现
<div id="page_nav">
<%--大于首页,才显示--%>
<c:if test="${requestScope.page.pageNo > 1}">
<a href="BookServlet?op=getAllBookByPage&pageNo=1">首页</a>
<a href="BookServlet?op=getAllBookByPage&pageNo=${requestScope.page.pageNo-1}">上一页</a>
</c:if>
<a href="#">3</a>
【${ requestScope.page.pageNo }】
<a href="#">5</a>
<%-- 如果已经 是最后一页,则不显示下一页,末页 --%>
<c:if test="${requestScope.page.pageNo < requestScope.page.pageTotal}">
<a href="BookServlet?op=getAllBookByPage&pageNo=${requestScope.page.pageNo+1}">下一页</a>
<a href="BookServlet?op=getAllBookByPage&pageNo=${requestScope.page.pageTotal}">末页</a>
</c:if>
共${ requestScope.page.pageTotal }页,${ requestScope.page.pageTotalCount }条记录
到第<input value="4" name="pn" id="pn_input"/>页
<input type="button" value="确定">
</div>
分页模块中跳转到指定页数功能实现
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
共${ requestScope.page.pageTotal }页,${ requestScope.page.pageTotalCount }条记录
到第<input value="${param.pageNo}" name="pn" id="pn_input"/>页
<input id="searchPageBtn" type="button" value="确定">
<script type="text/javascript">
$(function () {
// 跳到指定的页码
$("#searchPageBtn").click(function () {
alert($("#pn_input").val());
var pageNo = $("#pn_input").val();
location.href = "BookServlet?op=getAllBookByPage&pageNo=" + pageNo;
});
});
</script>
</div>
page对象的修改
public void setPageNo(Integer pageNo) {
//数据边界的有效校验
if(pageNo<1){
pageNo=1;
}
if(pageNo>pageTotal){
pageNo=pageTotal;
}
this.pageNo = pageNo;
}
service层方法的修改
@Override
public Page<Book> page(int pageNo, int pageSize) {
Page <Book> page = new Page2<Book>();
// //设置当前页码 必须放在下面
// page.setPageNo(pageNo);
// //设置每页显示的数量
page.setPageSize(pageSize);
//求总记录数
Integer totalCount = (int)iBookDao.getCount();
//设置总记录数
page.setPageTotalCount(totalCount);
//求总页码
Integer totalPage = totalCount%pageSize == 0 ?totalCount/pageSize:totalCount/pageSize+1;
//设置总页码
page.setPageTotal(totalPage);
//设置当前页码
page.setPageNo(pageNo);
//求当前页开始索引
int begin = (pageNo - 1) * pageSize;
//求当前页数据
List<Book> items = iBookDao.getByPage(begin,pageSize);
//设置当前页数据
page.setItems(items);
return page;
}
分页条的抽取
在page对象中添加URL属性
public class Page<T> {
public static final Integer PAGE_SIZE=4;
//当前页码数
private Integer pageNo;
//总页码数
private Integer pageTotal;
//总记录数
private Integer pageTotalCount;
//当前页显示数量
private Integer pageSize=PAGE_SIZE;
//当前页显示数据
private List<T> items;
//分页条的请求地址
private String url;
在servlet程序的page分页方法中设置URL的分页请求地址
protected void getAllBookByPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1 获取请求的参数 pageNo 和 pageSize
int pageNo = WebUtils.parseInt(request.getParameter("pageNo"), 1);
int pageSize = WebUtils.parseInt(request.getParameter("pageSize"), Page2.PAGE_SIZE);
//2 调用 BookService.page(pageNo,pageSize):Page 对象
Page2<Book> page = iBookService.page(pageNo, pageSize);
page.setUrl("BookServlet?op=getAllBookByPage");
System.out.println(page.getItems());
//3 保存 Page 对象到 Request 域中
request.setAttribute("page",page);
//4 请求转发到/pages/book/booksPage.jsp 页面
request.getRequestDispatcher("/pages/book/booksByPage.jsp").forward(request,response);
}
修改分页条中请求地址为URL变量输出,并抽取一个单独的jsp页面
page_nav.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--分页条的开始--%>
<div id="page_nav">
<%--大于首页,才显示--%>
<c:if test="${requestScope.page.pageNo > 1}">
<a href="${ requestScope.page.url }&pageNo=1">首页</a>
<a href="${ requestScope.page.url }&pageNo=${requestScope.page.pageNo-1}">上一页</a>
</c:if>
<%--页码输出的开始--%>
<c:choose>
<%--情况1:如果总页码小于等于5的情况,页码的范围是:1-总页码--%>
<c:when test="${ requestScope.page.pageTotal <= 5 }">
<c:set var="begin" value="1"/>
<c:set var="end" value="${requestScope.page.pageTotal}"/>
</c:when>
<%--情况2:总页码大于5的情况--%>
<c:when test="${requestScope.page.pageTotal > 5}">
<c:choose>
<%--小情况1:当前页码为前面3个:1,2,3的情况,页码范围是:1-5.--%>
<c:when test="${requestScope.page.pageNo <= 3}">
<c:set var="begin" value="1"/>
<c:set var="end" value="5"/>
</c:when>
<%--小情况2:当前页码为最后3个,8,9,10,页码范围是:总页码减4 - 总页码--%>
<c:when test="${requestScope.page.pageNo > requestScope.page.pageTotal-3}">
<c:set var="begin" value="${requestScope.page.pageTotal-4}"/>
<c:set var="end" value="${requestScope.page.pageTotal}"/>
</c:when>
<%--小情况3:4,5,6,7,页码范围是:当前页码减2 - 当前页码加2--%>
<c:otherwise>
<c:set var="begin" value="${requestScope.page.pageNo-2}"/>
<c:set var="end" value="${requestScope.page.pageNo+2}"/>
</c:otherwise>
</c:choose>
</c:when>
</c:choose>
<c:forEach begin="${begin}" end="${end}" var="i">
<c:if test="${i == requestScope.page.pageNo}">
【${i}】
</c:if>
<c:if test="${i != requestScope.page.pageNo}">
<a href="${ requestScope.page.url }&pageNo=${i}">${i}</a>
</c:if>
</c:forEach>
<%--页码输出的结束--%>
<%-- 如果已经 是最后一页,则不显示下一页,末页 --%>
<c:if test="${requestScope.page.pageNo < requestScope.page.pageTotal}">
<a href="${ requestScope.page.url }&pageNo=${requestScope.page.pageNo+1}">下一页</a>
<a href="${ requestScope.page.url }&pageNo=${requestScope.page.pageTotal}">末页</a>
</c:if>
共${ requestScope.page.pageTotal }页,${ requestScope.page.pageTotalCount }条记录
到第<input value="${param.pageNo}" name="pn" id="pn_input"/>页
<input id="searchPageBtn" type="button" value="确定">
<script type="text/javascript">
$(function () {
// 跳到指定的页码
$("#searchPageBtn").click(function () {
var pageNo = $("#pn_input").val();
<%--var pageTotal = ${requestScope.page.pageTotal};--%>
<%--alert(pageTotal);--%>
// javaScript语言中提供了一个location地址栏对象
// 它有一个属性叫href.它可以获取浏览器地址栏中的地址
// href属性可读,可写
location.href = "${pageScope.basePath}${ requestScope.page.url }&pageNo=" + pageNo;
});
});
</script>
</div>
<%--分页条的结束--%>
分页实现二
page实体类
package entity;
public class Page {
private Integer pageIndex;//当前页码
private Integer pageSize;//页大小 显示有多少数据
private Integer totalCounts;//数据的总行数
private Integer totalPages;//总页数
private Integer startRows;//起始行
/**含有当前页码的构造器
*/
public Page(Integer pageIndex) {
this(pageIndex,4);
}
public Page(Integer pageIndex, Integer pageSize) {
this.pageIndex = pageIndex;
this.pageSize = pageSize;
/**在构造器中设置起始行 (当前页码数-1)* 页数据
*
*/
this.setStartRows((pageIndex - 1) * pageSize);
}
public Integer getPageIndex() {
return pageIndex;
}
public void setPageIndex(Integer pageIndex) {
this.pageIndex = pageIndex;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getTotalCounts() {
return totalCounts;
}
/**
* 通过总条目数设置总页数
* 总条目数对页大小模运算
* @param totalCounts
*/
public void setTotalCounts(Integer totalCounts) {
this.totalCounts=totalCounts;
this.setTotalPages(totalCounts%pageSize == 0 ?totalCounts/pageSize:totalCounts/pageSize+1);
}
public Integer getTotalPages() {
return totalPages;
}
public void setTotalPages(Integer totalPages) {
this.totalPages = totalPages;
}
public Integer getStartRows() {
return startRows;
}
public void setStartRows(Integer startRows) {
this.startRows = startRows;
}
}
Dao层
dao
//分页查询所有
List<User> selectAll(Page page);
daoImpl
QueryRunner qr = new QueryRunner(DBPoolUtil.getDataSource());
@Override
public List<User> selectAll(Page page) {
try {
return qr.query("select * from t_user limit ?,?",new BeanListHandler<User>(User.class),
page.getStartRows(),page.getPageSize());
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
service层
service
//分页显示
List<User> showAll(Page page);
serviceImpl
//分页展示所有
@Override
public List<User> showAll(Page page) {
List<User> users = null;
//获取总行数
long count = iUserDao.getCount();
//将总行数传递给Page对象的构造器
page.setTotalCounts((int) count);
//根据controller传递的Page对象查询对应数据
users = iUserDao.selectAll(page);
return users;
}
controller层
//分页查找所有
protected void selectAllByPage(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取当前页
String pageIndex = req.getParameter("pageIndex");
//如果是第一次访问
if(pageIndex == null){
pageIndex = "1";
}
Page page = new Page(Integer.valueOf(pageIndex));
List<User> usersPage = iUserService.showAll(page);
for (User user : usersPage) {
System.out.println(user);
}
//将usersPage保存到域中
req.setAttribute("userPage",usersPage);
//将page页保存到域中
req.setAttribute("page",page);
System.out.println(page.getTotalPages());
req.getRequestDispatcher("/pages/user/usersPage.jsp").forward(req,resp);
}
usersPage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>users</title>
</head>
<body>
<c:if test="${userPage == null || userPage.size()==0}">
no date
${userPage}
</c:if>
<c:if test="${userPage != null || userPage.size()!=0}">
<table border="1" align="center" width="80%">
<tr>
<th>id</th>
<th>name</th>
<th>password</th>
<th>email</th>
<th>manger</th>
</tr>
<c:forEach items="${userPage}" var="p">
<tr>
<td>${p.id}</td>
<td>${p.username}</td>
<td>${p.password}</td>
<td>${p.email}</td>
<td><a href="UserServlet?op=getById&id=${p.id}">修改</a>
<a href="UserServlet?op=delete&id=${p.id}">删除</a>
</td>
</tr>
</c:forEach>
<tr>
<td colspan="5">
<a href="UserServlet?op=selectAllByPage&pageIndex=1">首页
<c:if test="${page.pageIndex>1}">
<a href="UserServlet?op=selectAllByPage&pageIndex=${page.pageIndex-1}">上一页</a>
</c:if>
<c:if test="${page.pageIndex==1}">
<a>上一页</a>
</c:if>
<c:if test="${page.pageIndex<page.totalPages}">
<a href="UserServlet?op=selectAllByPage&pageIndex=${page.pageIndex+1}">下一页</a>
</c:if>
<c:if test="${page.pageIndex==page.totalPages}">
<a>下一页</a>
</c:if>
<a href="UserServlet?op=selectAllByPage&pageIndex=${page.totalPages}">尾页</a>
</a>
</td>
</tr>
</table>
</c:if>
<h1><a href="/demo/pages/user/saveUser.jsp">添加</a></h1>
</body>
</html>
<c:if test="${page.pageIndex==1}">
<a>上一页</a>
</c:if>
<c:if test="${page.pageIndex<page.totalPages}">
<a href="UserServlet?op=selectAllByPage&pageIndex=${page.pageIndex+1}">下一页</a>
</c:if>
<c:if test="${page.pageIndex==page.totalPages}">
<a>下一页</a>
</c:if>
<a href="UserServlet?op=selectAllByPage&pageIndex=${page.totalPages}">尾页</a>
</a>
</td>
</tr>
</table>
</c:if>
<h1><a href="/demo/pages/user/saveUser.jsp">添加</a></h1>
</body>
</html>