什么是通用分页:
在Java中,通用分页是指一种通用的工具或类,用于简化开发人员在分页查询时的操作。通过使用通用分页,开发人员可以快速、方便地实现分页功能,并在不同的业务场景中进行复用。
1.理解分页思想:
通用分页的思想是将分页逻辑封装起来,实现通用性和可复用性。通过将分页逻辑抽象化为一个组件或工具类,可以在不同的业务场景中轻松应用,并减少开发人员的重复性工作。这样,分页查询可以更加简洁、高效地实现,提升了代码的可读性和维护性。同时,也提供了一种灵活的方式来处理大型数据集的分页查询需求。
2.优化pagebean:
pagebean优化分页查询的代码它封装了分页查询的逻辑,并提供了便捷的操作和查询性能优化。
package com.xiaoye.util; import java.util.Map; import javax.servlet.http.HttpServletRequest; /** * 分页工具类 * */ public class PageBean { private int page = 1;// 页码 private int rows = 10;// 页大小 private int total = 0;// 总记录数 private boolean pagination = true;// 是否分页 // 增加一个属性url,保留上一次发送的请求地址 // 增加一个属性paramMap,保留上一次发送的请求携带的参数 // req.getParameterMap(); // 增加一个最大页的方法 // 增加一个下一页的方法 // 增加一个上一页的方法 // 初始化pagebean的方法 //最大页 public int maxPage() { return this.total % this.rows ==0 ? this.total /this.rows : this.total /this.rows; } //下一页 public int nextPage() { return this.page < this.maxPage() ? this.page + 1 :this.page; } //上一页 public int prevPage() { return this.page > 1 ? this.page -1 :this.page; } public void setRequest(HttpServletRequest req) { //初始化默认查询第几页的数据 this.setPage(req.getParameter("page")); this.setRows(req.getParameter("rows")); this.setPagination(req.getParameter("pagination")); //保留上一次的URL this.setUrl(req.getRequestURL().toString()); //保留携带的参数 this.setParamMap(req.getParameterMap()); } //重写setPagination private void setPagination(String pagination) { if(StringUtils.isNotBlank(pagination)) { this.setPagination(!"false".equals(pagination)); } } //重写setRows private void setRows(String rows) { if(StringUtils.isNotBlank(rows)) { this.setRows(Integer.valueOf(rows)); } } //重写setPage private void setPage(String page) { if(StringUtils.isNotBlank(page)) { this.setPage(Integer.valueOf(page)); } } private String url; private Map<String,String[]> paramMap; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public Map<String, String[]> getParamMap() { return paramMap; } public void setParamMap(Map<String, String[]> paramMap) { this.paramMap = paramMap; } public PageBean() { super(); } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getRows() { return rows; } public void setRows(int rows) { this.rows = rows; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public void setTotal(String total) { this.total = Integer.parseInt(total); } public boolean isPagination() { return pagination; } public void setPagination(boolean pagination) { this.pagination = pagination; } /** * 获得起始记录的下标 * * @return */ public int getStartIndex() { return (this.page - 1) * this.rows; } @Override public String toString() { return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]"; } }
优化之前:
优化之后:
package com.xiaoye.util; import java.io.IOException; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/bookServlet") public class BookServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @SuppressWarnings("unused") @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // String bname = req.getParameter("bname"); // //map包含了浏览器传递到后台的所有参数 // Map<String, String[]> map = req.getParameterMap(); // //浏览器请求地址 // String url = req.getRequestURL().toString(); //简化 PageBean pageBean=new PageBean(); pageBean.setRequest(req); req.setAttribute("pageBean", pageBean); req.getRequestDispatcher("bookList.jsp").forward(req, resp); } }
输出结果:
3.分页自定义jsp标签
什么是分页自定义jsp标签:
分页自定义JSP标签一般具有以下几个关键属性或功能:
- 当前页码(currentPage):表示用户当前所处的页数。
- 每页显示数量(pageSize):表示每页显示的数据条数。
- 数据总数(total):表示满足查询条件的数据总数量。
- 分页查询结果(dataList):表示查询到的当前页的数据列表。
使用分页自定义JSP标签可以使分页逻辑更加清晰和模块化,提高了代码的可读性和可维护性,并方便地在不同的JSP页面中进行重用。
tld
助手类
package com.xiaoye.util; import java.util.Map; import javax.servlet.http.HttpServletRequest; /** * 分页工具类 * */ public class PageBean { private int page = 1;// 页码 private int rows = 10;// 页大小 private int total = 0;// 总记录数 private boolean pagination = true;// 是否分页 // 增加一个属性url,保留上一次发送的请求地址 // 增加一个属性paramMap,保留上一次发送的请求携带的参数 // req.getParameterMap(); // 增加一个最大页的方法 // 增加一个下一页的方法 // 增加一个上一页的方法 // 初始化pagebean的方法 //最大页 public int maxPage() { return this.total % this.rows ==0 ? this.total /this.rows : this.total /this.rows; } //下一页 public int nextPage() { return this.page < this.maxPage() ? this.page + 1 :this.page; } //上一页 public int prevPage() { return this.page > 1 ? this.page -1 :this.page; } public void setRequest(HttpServletRequest req) { //初始化默认查询第几页的数据 this.setPage(req.getParameter("page")); this.setRows(req.getParameter("rows")); this.setPagination(req.getParameter("pagination")); //保留上一次的URL this.setUrl(req.getRequestURL().toString()); //保留携带的参数 this.setParamMap(req.getParameterMap()); } //重写setPagination private void setPagination(String pagination) { if(StringUtils.isNotBlank(pagination)) { this.setPagination(!"false".equals(pagination)); } } //重写setRows private void setRows(String rows) { if(StringUtils.isNotBlank(rows)) { this.setRows(Integer.valueOf(rows)); } } //重写setPage private void setPage(String page) { if(StringUtils.isNotBlank(page)) { this.setPage(Integer.valueOf(page)); } } private String url; private Map<String,String[]> paramMap; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public Map<String, String[]> getParamMap() { return paramMap; } public void setParamMap(Map<String, String[]> paramMap) { this.paramMap = paramMap; } public PageBean() { super(); } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getRows() { return rows; } public void setRows(int rows) { this.rows = rows; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public void setTotal(String total) { this.total = Integer.parseInt(total); } public boolean isPagination() { return pagination; } public void setPagination(boolean pagination) { this.pagination = pagination; } /** * 获得起始记录的下标 * * @return */ public int getStartIndex() { return (this.page - 1) * this.rows; } @Override public String toString() { return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]"; } }
没有优化之前:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script> <title>书籍列表</title> <style type="text/css"> .page-item input { padding: 0; width: 40px; height: 100%; text-align: center; margin: 0 6px; } .page-item input, .page-item b { line-height: 38px; float: left; font-weight: 400; } .page-item.go-input { margin: 0 10px; } </style> </head> <body> <form class="form-inline" action="${pageContext.request.contextPath }/book.action" method="post"> <div class="form-group mb-2"> <input type="text" class="form-control-plaintext" name="bname" placeholder="请输入书籍名称"> </div> <button type="submit" class="btn btn-primary mb-2">查询</button> </form> <table class="table table-striped bg-success"> <thead> <tr> <th scope="col">书籍ID</th> <th scope="col">书籍名</th> <th scope="col">价格</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>圣墟第1章</td> <td>1</td> </tr> <tr> <td>1</td> <td>圣墟第1章</td> <td>1</td> </tr> </tbody> </table> <form action="" id="pageBeanForm" method="post"> <input type="hidden" name="page"> </form> <!-- 分页条 69-85 --> <ul class="pagination justify-content-center"> <li class="page-item"><a class="page-link" href='javascript:gotoPage(1)'>首页</a></li> <li class="page-item"><a class="page-link" href='javascript:gotoPage(1)'><</a></li> <li class="page-item"><a class="page-link" href="#">1</a></li> <li class="page-item"><a class="page-link" href="#">2</a></li> <li class="page-item active"><a class="page-link" href="#">3</a></li> <!--下一页 --> <li class="page-item disabled"><a class="page-link" href="#">></a></li> <li class="page-item disabled"><a class="page-link" href="#">尾页</a></li> <li class="page-item go-input"><b>到第</b><input class="page-link" type="text" id="skipPage" name="" /><b>页</b></li> <li class="page-item go"><a class="page-link" href="javascript:skipPage()">确定</a></li> <li class="page-item"><b>共666条</b></li> </ul> <script type='text/javascript'> function gotoPage(page) { document.getElementById('pageBeanForm').page.value = page; /*提交一个from表单 */ document.getElementById('pageBeanForm').submit(); } /* 跳到那一页 */ function skipPage() { var page = document.getElementById('skipPage').value; if (!page || isNaN(page) || parseInt(page) < 1 || parseInt(page) > 1122) { alert('请输入1~N的数字'); return; } /*执行跳到那一页 */ gotoPage(page); } </script> </body> </html>
优化之后:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://jsp.xiaoye.xy" prefix="x" %> <!DOCTYPE html > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script> <title>书籍列表</title> <style type="text/css"> .page-item input { padding: 0; width: 40px; height: 100%; text-align: center; margin: 0 6px; } .page-item input, .page-item b { line-height: 38px; float: left; font-weight: 400; } .page-item.go-input { margin: 0 10px; } </style> </head> <body> <form class="form-inline" action="${pageContext.request.contextPath }/book.action" method="post"> <div class="form-group mb-2"> <input type="text" class="form-control-plaintext" name="bname" placeholder="请输入书籍名称"> </div> <button type="submit" class="btn btn-primary mb-2">查询</button> </form> <table class="table table-striped bg-success"> <thead> <tr> <th scope="col">书籍ID</th> <th scope="col">书籍名</th> <th scope="col">价格</th> </tr> </thead> <tbody> <c:forEach items="${books }" var="b"> <tr> <td>${b.bid }</td> <td>${b.bname }</td> <td>${b.price }</td> </tr> </c:forEach> </tbody> </table> <x:page pageBean="${pageBean }"></x:page> </body> </html>
输出结果:
4.枫叶debug调试代码
1.debug启动项目:
右击代码然后点击debug
点击Finish
出来两个选项 yes/no:
点击yes:
点击No:
2.在将要调试的代码上打上断点:
调试代码按F6即可
双击要调试的代码
点击yes会直接跳到debug调试窗口 点击NO依然在J2EE但是不影响调试
变量:
调试的代码都会在这里面显示: