• jsp通用分页(下)


    目录

    一,通用分页前端

    1.pageBean工具分页类

    2.Servlet类

    3.pageTag类

    4. tld文件

    5.jsp界面


    前言:

    核心思想如图

     

    一,通用分页前端

     1.pageBean工具分页类

    1. package com.dengxiyan.util;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import javax.servlet.http.HttpServletRequest;
    5. /**
    6. * 分页工具类
    7. *
    8. */
    9. public class PageBean {
    10. private int page = 1;// 页码
    11. private int rows = 10;// 页大小
    12. private int total = 0;// 总记录数
    13. private boolean pagination = true;// 是否分页
    14. // 需要新增变量保存上一次请求地址:http://localhost;80/...
    15. private String url;
    16. //保留上一次查询的条件 //需要新增变量保存上一次查询条件
    17. private Map<String, String[]> parameterMap = new HashMap<String, String[]>();
    18. // 需要添加方法:获取最大页的页码
    19. public int maxPage() {
    20. return this.total % this.rows ==0 ? this.total / this.rows : this.total / this.rows + 1;
    21. }
    22. // 需要添加方法:获取上一页的页码
    23. public int previousPage() {
    24. return this.page > 1 ? this.page - 1 : this.page;
    25. }
    26. // 需要添加方法:获取下一页的页码
    27. public int nextPage() {
    28. return this.page < this.maxPage() ? this.page + 1 : this.page;
    29. }
    30. // 需要新增方法:初始化pagebean
    31. public void setRequest(HttpServletRequest req) {
    32. this.setPage(req.getParameter("page"));
    33. this.setRows(req.getParameter("rows"));
    34. this.setPagination(req.getParameter("page"));
    35. this.setUrl(req.getRequestURL().toString());
    36. this.setParameterMap(req.getParameterMap());
    37. }
    38. private void setPagination(String page) {
    39. if(StringUtils.isNotBlank(page)) {
    40. //此处判断意为:当条件不为false时就进行分页,所以非字符不能少
    41. this.setPagination(!"false".equals(page));
    42. }
    43. }
    44. private void setRows(String rows) {
    45. if(StringUtils.isNotBlank(rows)) {
    46. this.setRows(Integer.valueOf(rows));
    47. }
    48. }
    49. public void setPage(String page) {
    50. if(StringUtils.isNotBlank(page))
    51. //set自动生成的方法
    52. this.setPage(Integer.valueOf(page));
    53. }
    54. public PageBean() {
    55. super();
    56. }
    57. public String getUrl() {
    58. return url;
    59. }
    60. public void setUrl(String url) {
    61. this.url = url;
    62. }
    63. public Map<String, String[]> getParameterMap() {
    64. return parameterMap;
    65. }
    66. public void setParameterMap(Map<String, String[]> parameterMap) {
    67. this.parameterMap = parameterMap;
    68. }
    69. public int getPage() {
    70. return page;
    71. }
    72. public void setPage(int page) {
    73. this.page = page;
    74. }
    75. public int getRows() {
    76. return rows;
    77. }
    78. public void setRows(int rows) {
    79. this.rows = rows;
    80. }
    81. public int getTotal() {
    82. return total;
    83. }
    84. public void setTotal(int total) {
    85. this.total = total;
    86. }
    87. public void setTotal(String total) {
    88. this.total = Integer.parseInt(total);
    89. }
    90. public boolean isPagination() {
    91. return pagination;
    92. }
    93. public void setPagination(boolean pagination) {
    94. this.pagination = pagination;
    95. }
    96. /**
    97. * 获得起始记录的下标
    98. *
    99. * @return
    100. */
    101. public int getStartIndex() {
    102. return (this.page - 1) * this.rows;
    103. }
    104. @Override
    105. public String toString() {
    106. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination
    107. + ", url=" + url + ", parameterMap=" + parameterMap + "]";
    108. }
    109. }

    《代码分析如下》 

    需要新增变量保存上一次查询的条件

    private Map<String, String[]> parameterMap = new HashMap<String, String[]>();
    

    需要新增变量保存上一次请求的地址

    1. private String url;
    2. public String getUrl() {
    3. return url;
    4. }
    5. public void setUrl(String url) {
    6. this.url = url;
    7. }

    需要添加方法,获取最大页码的页码

    总页码%页码大小,能被整除的情况下返回被整除的结果。否则就在返回的结果加1

    1. public int maxPage() {
    2. return this.total % this.rows ==0 ? this.total / this.rows : this.total / this.rows + 1;
    3. }

    需要添加方法:获取上一页的页码

    如果当前页大于1的情况下当前页-1,否则就为当前页

    1. public int previousPage() {
    2. return this.page > 1 ? this.page - 1 : this.page;
    3. }

    需要添加方法:获取下一页的页码

    如果当前页码小于最大页码数时当前页码就+1,否则就为当页码

    1. public int nextPage() {
    2. return this.page < this.maxPage() ? this.page + 1 : this.page;
    3. }

    需要新增方法:初始化pagebean

    提示:在判断是,如果只有一条代码的情况下可以不加花括号

    1. public void setRequest(HttpServletRequest req) {
    2. this.setPage(req.getParameter("page"));
    3. this.setRows(req.getParameter("rows"));
    4. this.setPagination(req.getParameter("page"));
    5. this.setUrl(req.getRequestURL().toString());
    6. this.setParameterMap(req.getParameterMap());
    7. }
    8. private void setPagination(String page) {
    9. 判断如果不为空
    10. if(StringUtils.isNotBlank(page)) {
    11. 就调用它先=现有的方法
    12. this.setPagination(!"false".equals(page));
    13. }
    14. }
    15. private void setRows(String rows) {
    16. if(StringUtils.isNotBlank(rows)) {
    17. this.setRows(Integer.valueOf(rows));
    18. }
    19. }
    20. //相当于一个重载的方法
    21. public void setPage(String page) {
    22. if(StringUtils.isNotBlank(page))
    23. //set自动生成的方法(并非自己掉自己)
    24. this.setPage(Integer.valueOf(page));
    25. }

    2.Servlet类

    《代码演示》

    提示:PageBean pageBean = new PageBean();
                    pageBean.setRequest(req);
    这里实例化了分页工具类,然后调用了初始化pagebean的方法,req里面就带着前台jsp传过来的值

    1. package com.dengxiyan.web;
    2. import java.io.IOException;
    3. import java.util.List;
    4. import java.util.Map;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.annotation.WebServlet;
    7. import javax.servlet.http.HttpServlet;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import com.dengxiyan.dao.BookDao;
    11. import com.dengxiyan.entity.Book;
    12. import com.dengxiyan.util.PageBean;
    13. @WebServlet("/book/search")
    14. public class BookServlet extends HttpServlet{
    15. @Override
    16. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    17. doPost(req, resp);
    18. }
    19. @Override
    20. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    21. PageBean pageBean = new PageBean();
    22. pageBean.setRequest(req);
    23. BookDao bd = new BookDao();
    24. Book book = new Book();
    25. book.setBname(req.getParameter("bname"));
    26. try {
    27. List<Book> books = bd.list2(book, pageBean);
    28. req.setAttribute("books", books);
    29. } catch (Exception e) {
    30. // TODO Auto-generated catch block
    31. e.printStackTrace();
    32. }
    33. req.setAttribute("pagebean", pageBean);
    34. req.getRequestDispatcher("/booklist.jsp").forward(req, resp);
    35. }
    36. }

    3.pageTag类

    《代码如下》

    将jsp界面的代码拿过来,同时要将它转换为页面上的html。将代码放进来是一定要细心

    提示:如果当前页与最大页码相等时,就禁用按钮,否则啥也没有

    首页的话就==1的时候

    sb.append("	<li class='page-item "+(pagebean.getPage() == pagebean.maxPage() ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pagebean.nextPage()+")'>&gt;</a></li>");
    
    1. package com.dengxiyan.tag;
    2. import java.io.IOException;
    3. import java.util.Map;
    4. import java.util.Map.Entry;
    5. import java.util.Set;
    6. import javax.servlet.jsp.JspException;
    7. import javax.servlet.jsp.JspWriter;
    8. import javax.servlet.jsp.tagext.BodyTagSupport;
    9. import com.dengxiyan.util.PageBean;
    10. public class PageTag extends BodyTagSupport {
    11. private PageBean pagebean;
    12. public PageBean getPagebean() {
    13. return pagebean;
    14. }
    15. public void setPagebean(PageBean pagebean) {
    16. this.pagebean = pagebean;
    17. }
    18. @Override
    19. public int doStartTag() throws JspException {
    20. JspWriter out = pageContext.getOut();
    21. try {
    22. out.print(toHTML());
    23. } catch (IOException e) {
    24. // TODO Auto-generated catch block
    25. e.printStackTrace();
    26. }
    27. return super.doStartTag();
    28. }
    29. private String toHTML() {
    30. StringBuffer sb = new StringBuffer();
    31. //隐藏的form表单,作用是,保存上一次的查询条件
    32. sb.append("<form action='"+pagebean.getUrl()+"' id='pageBeanForm' method='post'>");
    33. sb.append(" <input type='hidden' name='page' value=''>");
    34. Map<String, String[]> parameterMap = pagebean.getParameterMap();
    35. if(parameterMap != null && parameterMap.size() >0) {
    36. Set<Entry<String,String[]>> entrySet = parameterMap.entrySet();
    37. for (Entry<String, String[]> entry : entrySet) {
    38. String key = entry.getKey();//name/likes/page/rows
    39. String[] values = entry.getValue();
    40. if(!"page".equals(key)) {
    41. for (String value: values) {
    42. sb.append(" <input type='hidden' name='"+key+"' value=''>");
    43. }
    44. }
    45. }
    46. }
    47. sb.append("</form>");
    48. //分页条
    49. sb.append("<ul class='pagination justify-content-center'>");
    50. sb.append(" <li class='page-item "+(pagebean.getPage() == 1 ? "disabled" : "")+"'><a class='page-link'");
    51. sb.append(" href='javascript:gotoPage(1)'>首页</a></li>");
    52. sb.append(" <li class='page-item "+(pagebean.getPage() == 1 ? "disabled" : "")+"'><a class='page-link'");
    53. sb.append(" href='javascript:gotoPage("+pagebean.previousPage()+")'>&lt;</a></li>");
    54. sb.append(" <li class='page-item'><a class='page-link' href='#'></a></li>");
    55. sb.append(" <li class='page-item active'><a class='page-link' href='#'>"+pagebean.getPage()+"</a></li>");
    56. sb.append(" <li class='page-item "+(pagebean.getPage() == pagebean.maxPage() ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pagebean.nextPage()+")'>&gt;</a></li>");
    57. sb.append(" <li class='page-item "+(pagebean.getPage() == pagebean.maxPage() ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pagebean.maxPage()+")'>尾页</a></li>");
    58. sb.append(" <li class='page-item go-input'><b>到第</b><input class='page-link'");
    59. sb.append(" type='text' id='skipPage' name='' /><b>页</b></li>");
    60. sb.append(" <li class='page-item go'><a class='page-link'");
    61. sb.append(" href='javascript:skipPage()'>确定</a></li>");
    62. sb.append(" <li class='page-item'><b>共"+pagebean.getTotal()+"条</b></li>");
    63. sb.append("</ul>");
    64. //分页jsp代码
    65. sb.append("<script type='text/javascript'>");
    66. sb.append(" function gotoPage(page) {");
    67. sb.append(" document.getElementById('pageBeanForm').page.value = page;");
    68. sb.append(" document.getElementById('pageBeanForm').submit();");
    69. sb.append(" }");
    70. sb.append(" function skipPage() {");
    71. sb.append(" var page = document.getElementById('skipPage').value;");
    72. sb.append(" if (!page || isNaN(page) || parseInt(page) < 1");
    73. sb.append(" || parseInt(page) > "+pagebean.maxPage()+") {");
    74. sb.append(" alert('请输入1~"+pagebean.maxPage()+"的数字');");
    75. sb.append(" return;");
    76. sb.append(" }");
    77. sb.append(" gotoPage(page);");
    78. sb.append(" }");
    79. sb.append("</script>");
    80. return sb.toString();
    81. }
    82. }

    4. tld文件

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    5. version="2.0">
    6. <description>JSTL 1.1 core library</description>
    7. <display-name>JSTL core</display-name>
    8. <tlib-version>1.1</tlib-version>
    9. <short-name>z</short-name>
    10. <uri>http://jsp.veryedu.cn</uri>
    11. <validator>
    12. <description>
    13. Provides core validation features for JSTL tags.
    14. </description>
    15. <validator-class>
    16. org.apache.taglibs.standard.tlv.JstlCoreTLV
    17. </validator-class>
    18. </validator>
    19. <tag>
    20. <name>page</name>
    21. <tag-class>com.dengxiyan.tag.PageTag</tag-class>
    22. <body-content>JSP</body-content>
    23. <attribute>
    24. <name>pagebean</name>
    25. <required>true</required>
    26. <rtexprvalue>true</rtexprvalue>
    27. </attribute>
    28. </tag>
    29. </taglib>

    5.jsp界面

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@taglib uri="http://jsp.veryedu.cn" prefix="z"%>
    4. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    6. <html>
    7. <head>
    8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    9. <link
    10. href="css/bootstrap.css"
    11. rel="stylesheet">
    12. <script
    13. src="js/bootstrap.js"></script>
    14. <title>书籍列表</title>
    15. <style type="text/css">
    16. .page-item input {
    17. padding: 0;
    18. width: 40px;
    19. height: 100%;
    20. text-align: center;
    21. margin: 0 6px;
    22. }
    23. .page-item input, .page-item b {
    24. line-height: 38px;
    25. float: left;
    26. font-weight: 400;
    27. }
    28. .page-item.go-input {
    29. margin: 0 10px;
    30. }
    31. </style>
    32. </head>
    33. <body>
    34. <c:if test="${empty books}">
    35. <jsp:forward page="book/search"></jsp:forward>
    36. </c:if>
    37. <form class="form-inline"
    38. action="${pageContext.request.contextPath }/book/search" method="post">
    39. <div class="form-group mb-2">
    40. <input type="text" class="form-control-plaintext" name="bname"
    41. placeholder="请输入书籍名称">
    42. </div>
    43. <button type="submit" class="btn btn-primary mb-2">查询</button>
    44. </form>
    45. <table class="table table-striped bg-success">
    46. <thead>
    47. <tr>
    48. <th scope="col">书籍ID</th>
    49. <th scope="col">书籍名</th>
    50. <th scope="col">价格</th>
    51. </tr>
    52. </thead>
    53. <tbody>
    54. <c:forEach items="${books}" var="b">
    55. <tr>
    56. <td>${b.bid}</td>
    57. <td>${b.bname}</td>
    58. <td>${b.price}</td>
    59. </tr>
    60. </c:forEach>
    61. </tbody>
    62. </table>
    63. <z:page pagebean="${pagebean}"></z:page>
    64. </body>
    65. </html>

     

    《效果图如下》

     

     

  • 相关阅读:
    npm ERR! code ERESOLVE错误解决
    深度学习基础 - 牛顿法
    X-former系列(Transformer大家族)
    「贪心笔记」通过最少操作次数使得数组的和相等
    设计模式-创建型模式(单例、工厂、建造、原型)
    GB/T 26518-2023 高分子增强复合防水片材检测
    SaaSBase:Automation Anywhere是什么?
    Spring Boot
    Redis安装详解(单机安装,sentinel哨兵模式,Cluster模式)
    《算法系列》之回溯
  • 原文地址:https://blog.csdn.net/weixin_66202611/article/details/125441117