分页查询 原理以及网页实现固定页码数 搜索的实现

xiaoxiao2021-02-28  49

需求:做出类似百度这样页码限制的数据分页查询的功能网页

在数据库中通过数据的总行数以及你想要每次获取多少数据,就可以得到想要的页数

总页数 = 总行数/pageSize + (行数%pageSize==0?0:1);

所以获取数据的方法:

package cn.hncu.dao; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.faces.model.ScalarDataModel; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.MapListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import cn.hncu.domain.Stud; import cn.hncu.pubs.dbutilsC3po; public class PageDaoImpl implements PageDAO { @Override public Map<String, Object> query(Integer pageNo, Stud s) throws Exception { Map<String, Object> result = new HashMap<String, Object>(); int pageSize = 10;// 假定每页显示十行 // 计算总页数 // 总页数 = 总行数/pageSize + (行数%pageSize==0?0:1); // 查询总行数 int startN = (pageNo - 1) * pageSize; String sql = "select count(1) from stud2 where 1=1"; String sql2 = "select * from stud2 where 1=1 "; if (s.getId() != null && s.getId().trim().length() > 0) { sql = sql + " and id like '%" + s.getId().trim() + "%'"; sql2 = sql2 + " and id like '%" + s.getId().trim() + "%'"; } if (s.getName() != null && s.getName().trim().length() > 0) { sql = sql + " and name like '%" + s.getName().trim() + "%'"; sql2 = sql2 + " and name like '%" + s.getName().trim() + "%'"; } QueryRunner run = new QueryRunner(dbutilsC3po.getDataSource()); int rows = Integer.parseInt("" + run.query(sql, new ScalarHandler())); // 总页数 int pageCount = rows / pageSize + (rows % pageSize == 0 ? 0 : 1); result.put("pagecount", pageCount); result.put("pagesize", pageSize); sql2 = sql2 + " limit " + startN + "," + pageSize; List<Map<String, Object>> studs = run.query(sql2, new MapListHandler()); result.put("studs", studs); return result; } }

那么我们应该如何将这些数据在页面中显示并且限制它的页数呢

package cn.hncu.pubs; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class pageUtils { /** * 计算显示当前分页的起始页 * * @param pageNum * 当前页码 * @param pageCount * 总页数 * @param sideNum * 分页系数 分页条中显示几个数字页码。 显示数字页码个数 = 2 * sideNum + 1 * @param result * @param response * @param request */ public static void calcPage(int pageNum, int pageCount, int sideNum, Map<String, Object> result) { int startNum = 0;//要计算出页面第一个页数 int endNum = 0;//要计算出页面最后一个页数 if (pageCount <= sideNum) { endNum = pageCount; } else { if ((sideNum + pageNum) >= pageCount) { endNum = pageCount; } else { endNum = sideNum + pageNum; if ((sideNum + pageNum) <= (2 * sideNum + 1)) { if ((2 * sideNum + 1) >= pageCount) { endNum = pageCount; } else { endNum = 2 * sideNum + 1; } } else { endNum = sideNum + pageNum; } } } if (pageNum <= sideNum) { startNum = 1; } else { if ((pageNum + sideNum) >= pageCount) { if ((2 * sideNum + 1) >= pageCount) { if ((pageCount - 2 * sideNum) >= 1) { startNum = pageCount - 2 * sideNum; } else { startNum = 1; } } else { startNum = pageCount - 2 * sideNum; } } else { if ((pageNum - sideNum) >= 1) { startNum = pageNum - sideNum; } else { startNum = 1; } } } result.put("startNum", startNum); result.put("endNum", endNum); } }

然后通过jstl+el在页面获取数据:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>分页查询结果页面</title> </head> <body> <c:forEach items="${results.studs }" var="s"> ${s.id} ${s.name}<br /> </c:forEach> </body> <hr /> <c:if test="${results.currentPage!=1}"> <a href="<c:url value='/PageServlet?pageno=${results.currentPage-1}' />"> 上一页 </a>   </c:if> <c:forEach begin="${results.startNum }" end="${results.endNum }" var="idx"> <c:if test="${results.currentPage==idx}"> ${idx}   </c:if> <c:if test="${results.currentPage!=idx}"> <a href="<c:url value='/PageServlet?pageno=${idx}' />"> ${idx} </a>   </c:if> </c:forEach> <c:if test="${results.currentPage!=results.pagecount}"> <a href="<c:url value='/PageServlet?pageno=${results.currentPage+1}' />"> 下一页 </a>   </c:if>    <select onchange="sub(this);"> <c:forEach begin="1" end="${results.pagecount}" var="idx"> <option <c:if test='${idx==results.currentPage}'>selected</c:if> value="${idx}">第${idx}页</option> </c:forEach> </select> <form action="<c:url value='/PageServlet'/>" method="post"> id中包含:<input type="text" name="id" /> <br/> name中包含:<input type="text" name="name" /> <br/> <input type="submit" name="addquery" value="查询" /> </form> <script type="text/javascript"> function sub(obj) { window.location.href = "<c:url value='/PageServlet?pageno='/>" + obj.value; } </script> </html>
转载请注明原文地址: https://www.6miu.com/read-41285.html

最新回复(0)