分页目的:为了防止服务器一次性将数据库全部数据读出,提高效率。(数据库数据以文件形式存在,从硬盘读取速度慢)
需要使用到限制查询,限制查询的两种表示方法:
limit n:从0开始查询n条数据
limit(n,m):
n―:偏移量(每页显示的第一条数据)
m―:分页量(每页显示的数据条数)
设计需考虑:
当前分页数:currentPage
分页量:pageSize
偏移量:offset
数据总条数:pageTotal
总页数:pages
偏移量:int offset = (currentPage -1)* pageSize;
总页数: int pages= (int)Math.ceil(total*1.0 /pageSize);
分页技术的具体实现如下:
- servlet中的处理
- service中的处理
- dao层的处理
- utils的处理
- .jsp文件的处理
StudentServlet (get请求中分页实现关键代码)
case "look": //int currentPage = 1; int currentPage = req.getParameter("p")==null?1:Integer.parseInt(req.getParameter("p"));//页码值 int pageSize = 10;//分页量 List<Student> list = ssi.queryPage(currentPage,pageSize);//分页后的数据 int total= ssi.queryTotal();//总条数 int pages= (int)Math.ceil(total*1.0 /pageSize);//总页数 req.setAttribute("currentPage",currentPage); req.setAttribute("pages",pages); req.setAttribute("list",list); req.getRequestDispatcher("/WEB-INF/sms/stu/list.jsp").forward(req,resp); break;
StudentServiceImpl中关键代码
@Override public List<Student> queryPage(int currentPage, int pageSize) { //拿到偏移量: 起始位置 ,从0开始 int offset = (currentPage -1)* pageSize; return sdi. selectPage(offset,pageSize); } @Override public int queryTotal() { return sdi.selectTotal(); }
StudentDaoImpl中关键代码
@Override public List<Student> selectPage(int offset, int pageSize) { String sql = "select * from students limit ?,?"; BeanListHandler<Student> handler = new BeanListHandler(Student.class); Integer[] args = {offset,pageSize}; return DBUtil.select(sql,handler,args); } @Override public int selectTotal() { String sql = "select count(*) from students"; ScalarHandler<Long> handler = new ScalarHandler<>(); Integer[] args = {}; return DBUtil.select(sql,handler,args); }
DBUtil中对查询的操作
public static <T> List<T> select(String sql, BeanListHandler<T> beanListHandler, Object... args){ List<T> list = null; try { list = runner.query(sql,beanListHandler,args); } catch (SQLException e) { e.printStackTrace(); } return list; } //longǿתint public static int select(String sql, ScalarHandler<Long> scalarHandler, Object... args){ int num = 0 ; try { num = (int)runner.query(sql,scalarHandler,args).intValue(); } catch (SQLException e) { e.printStackTrace(); } return num; }
list.jsp中对页码部分的设置,采用booystrap设置的分页框架
需注意的是:左右两边界限的判断
左边界限:当currentPage-1=0时 显示第一页,否则显示当前页currentPage-1;
右边界限:当currentPage+1>pages 时 显示最大页即Pages,否则显示当前页currentPage+1;
对当前页添加激活颜色
<tr> <td colspan="7"> <nav aria-label="Page navigation"> <ul class="pagination"> <li> <a href="?a=look&p=${currentPage-1 == 0?1:currentPage-1}" aria-label="Previous"> <span aria-hidden="true">«</span> </a> </li> <c:forEach begin="1" end="${pages}" var="i"> <li class="${i==currentPage ? 'active':''}"><a href="?a=look&p=${i}">${i}</a></li> </c:forEach> <li> <a href="?a=look&p=${currentPage+1 > pages? pages:currentPage+1}" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> </ul> </nav> </td> </tr>
来源:51CTO
作者:hqzl
链接:https://blog.csdn.net/weixin_44864446/article/details/101222777