• 通用分页02


    目录

    一、改造pagebean

     二、分页查询

    一、改造pagebean

    目标需求:
        需要新增变量保存上一次查询条件
        需要新增变量保存上一次请求地址
        需要添加方法:获取最大页的页码
        需要添加方法:获取下一页的页码
        需要添加方法:获取上一页的页码
        需要新增方法:初始化pagebean

    pagebean的代码:

    1. package com.cdl.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:8080/t280_page/book/search
    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 ?
    21. this.total / this.rows
    22. : this.total / this.rows+1;
    23. }
    24. // 需要添加方法:获取上一页的页码;
    25. public int previousPage() {
    26. return this.page > 1 ? this.page-1 : this.page;
    27. }
    28. // 需要添加方法:获取下一页的页码
    29. public int nextPage() {
    30. return this.page < this.maxPage()?
    31. this.page+1:this.page;
    32. }
    33. // 需要增加方法:初始化pagebean
    34. public void setRequest(HttpServletRequest req) {
    35. this.setPage(req.getParameter("page"));
    36. this.setRows(req.getParameter("rows"));
    37. this.setPagination(req.getParameter("pagination"));
    38. this.setUrl(req.getRequestURL().toString());
    39. this.setParameterMap(req.getParameterMap());
    40. }
    41. private void setPagination(String pagination) {
    42. if(StringUtils.isNotBlank(pagination)) {
    43. this.setPagination(!"false".equals(pagination));
    44. }
    45. }
    46. private void setRows(String rows) {
    47. if(StringUtils.isNotBlank(rows)) {
    48. this.setRows(Integer.valueOf(rows));
    49. }
    50. }
    51. public void setPage(String page) {
    52. if(StringUtils.isNotBlank(page)) {
    53. // set自动生成的方法
    54. this.setPage(Integer.valueOf(page));
    55. }
    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 PageBean() {
    70. super();
    71. }
    72. public int getPage() {
    73. return page;
    74. }
    75. public void setPage(int page) {
    76. this.page = page;
    77. }
    78. public int getRows() {
    79. return rows;
    80. }
    81. public void setRows(int rows) {
    82. this.rows = rows;
    83. }
    84. public int getTotal() {
    85. return total;
    86. }
    87. public void setTotal(int total) {
    88. this.total = total;
    89. }
    90. public void setTotal(String total) {
    91. this.total = Integer.parseInt(total);
    92. }
    93. public boolean isPagination() {
    94. return pagination;
    95. }
    96. public void setPagination(boolean pagination) {
    97. this.pagination = pagination;
    98. }
    99. /**
    100. * 获得起始记录的下标
    101. *
    102. * @return
    103. */
    104. public int getStartIndex() {
    105. return (this.page - 1) * this.rows;
    106. }
    107. @Override
    108. public String toString() {
    109. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination
    110. + ", url=" + url + ", parameterMap=" + parameterMap + "]";
    111. }
    112. }

    建一个bookservlet:

    1. package com.cdl.web;
    2. import java.io.IOException;
    3. import java.util.Map;
    4. import javax.jws.WebService;
    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.cdl.util.PageBean;
    11. @WebServlet("/book/search")
    12. public class BookServlet extends HttpServlet{
    13. @Override
    14. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    15. doPost(req, resp);
    16. }
    17. @Override
    18. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    19. PageBean pageBean=new PageBean();
    20. pageBean.setRequest(req);
    21. req.setAttribute("pagebean", pageBean);
    22. req.getRequestDispatcher("/bookList.jsp").forward(req, resp);
    23. }
    24. }

    bookList.jsp:

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>Insert title here</title>
    8. </head>
    9. <body>
    10. ${pagebean }
    11. </body>
    12. </html>

    运行结果:

     二、分页查询

    以一个书籍的表为例

    建一个pageTag类:

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

    写一个配置文件chengdongli.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>y</short-name>
    10. <uri>http://cdl.com</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.cdl.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>

    注意:当发生页数改变时,很多参数不变,但是页数(page)是会改变的

    pagebean代码:

    1. package com.cdl.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:8080/t280_page/book/search
    15. private String url;
    16. // 需要新增变量保存上一次查询条件
    17. private Map<String,String[]> parameterMap = new HashMap<>();
    18. // 需要添加方法:获取最大页的页码
    19. public int maxPage() {
    20. return this.total % this.rows == 0 ?
    21. this.total / this.rows
    22. : this.total / this.rows+1;
    23. }
    24. // 需要添加方法:获取上一页的页码;
    25. public int previousPage() {
    26. return this.page > 1 ? this.page-1 : this.page;
    27. }
    28. // 需要添加方法:获取下一页的页码
    29. public int nextPage() {
    30. return this.page < this.maxPage()?
    31. this.page+1:this.page;
    32. }
    33. // 需要增加方法:初始化pagebean
    34. public void setRequest(HttpServletRequest req) {
    35. this.setPage(req.getParameter("page"));
    36. this.setRows(req.getParameter("rows"));
    37. this.setPagination(req.getParameter("pagination"));
    38. this.setUrl(req.getRequestURI().toString());
    39. this.setParameterMap(req.getParameterMap());
    40. }
    41. private void setPagination(String pagination) {
    42. if(StringUtils.isNotBlank(pagination)) {
    43. this.setPagination(!"false".equals(pagination));
    44. }
    45. }
    46. private void setRows(String rows) {
    47. if(StringUtils.isNotBlank(rows)) {
    48. this.setRows(Integer.valueOf(rows));
    49. }
    50. }
    51. public void setPage(String page) {
    52. if(StringUtils.isNotBlank(page)) {
    53. // set自动生成的方法
    54. this.setPage(Integer.valueOf(page));
    55. }
    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 PageBean() {
    70. super();
    71. }
    72. public int getPage() {
    73. return page;
    74. }
    75. public void setPage(int page) {
    76. this.page = page;
    77. }
    78. public int getRows() {
    79. return rows;
    80. }
    81. public void setRows(int rows) {
    82. this.rows = rows;
    83. }
    84. public int getTotal() {
    85. return total;
    86. }
    87. public void setTotal(int total) {
    88. this.total = total;
    89. }
    90. public void setTotal(String total) {
    91. this.total = Integer.parseInt(total);
    92. }
    93. public boolean isPagination() {
    94. return pagination;
    95. }
    96. public void setPagination(boolean pagination) {
    97. this.pagination = pagination;
    98. }
    99. /**
    100. * 获得起始记录的下标
    101. *
    102. * @return
    103. */
    104. public int getStartIndex() {
    105. return (this.page - 1) * this.rows;
    106. }
    107. @Override
    108. public String toString() {
    109. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination
    110. + ", url=" + url + ", parameterMap=" + parameterMap + "]";
    111. }
    112. }

    在bookList.jsp中导入标签库

    1. <%@taglib uri="http://cdl.com" prefix="z" %>
    2. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

    在bookservlet中写代码

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

    将数据展示到页面上去

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@taglib uri="http://cdl.com" 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="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
    11. rel="stylesheet">
    12. <script
    13. src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/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. <form class="form-inline"
    35. action="${pageContext.request.contextPath }/book/search" method="post">
    36. <div class="form-group mb-2">
    37. <input type="text" class="form-control-plaintext" name="bname"
    38. placeholder="请输入书籍名称">
    39. </div>
    40. <button type="submit" class="btn btn-primary mb-2">查询</button>
    41. </form>
    42. <table class="table table-striped ">
    43. <thead>
    44. <tr>
    45. <th scope="col">书籍ID</th>
    46. <th scope="col">书籍名</th>
    47. <th scope="col">价格</th>
    48. </tr>
    49. </thead>
    50. <tbody>
    51. <c:forEach items="${books }" var="b">
    52. <tr>
    53. <td>${b.bid }</td>
    54. <td>${b.bname }</td>
    55. <td>${b.price }</td>
    56. </tr>
    57. </c:forEach>
    58. </tbody>
    59. </table>
    60. <z:page pageBean="${pagebean }"></z:page>
    61. </body>
    62. </html>

    会出现乱码的情况

    就可以去EncodingFiter中解决

    1. package com.cdl.util;
    2. import java.io.IOException;
    3. import java.util.Iterator;
    4. import java.util.Map;
    5. import java.util.Set;
    6. import javax.servlet.Filter;
    7. import javax.servlet.FilterChain;
    8. import javax.servlet.FilterConfig;
    9. import javax.servlet.ServletException;
    10. import javax.servlet.ServletRequest;
    11. import javax.servlet.ServletResponse;
    12. import javax.servlet.annotation.WebFilter;
    13. import javax.servlet.http.HttpServletRequest;
    14. import javax.servlet.http.HttpServletResponse;
    15. /**
    16. * 中文乱码处理
    17. *
    18. */
    19. @WebFilter("/book/*")
    20. public class EncodingFiter implements Filter {
    21. private String encoding = "UTF-8";// 默认字符集
    22. public EncodingFiter() {
    23. super();
    24. }
    25. public void destroy() {
    26. }
    27. public void doFilter(ServletRequest request, ServletResponse response,
    28. FilterChain chain) throws IOException, ServletException {
    29. HttpServletRequest req = (HttpServletRequest) request;
    30. HttpServletResponse res = (HttpServletResponse) response;
    31. // 中文处理必须放到 chain.doFilter(request, response)方法前面
    32. res.setContentType("text/html;charset=" + this.encoding);
    33. if (req.getMethod().equalsIgnoreCase("post")) {
    34. req.setCharacterEncoding(this.encoding);
    35. } else {
    36. Map map = req.getParameterMap();// 保存所有参数名=参数值(数组)的Map集合
    37. Set set = map.keySet();// 取出所有参数名
    38. Iterator it = set.iterator();
    39. while (it.hasNext()) {
    40. String name = (String) it.next();
    41. String[] values = (String[]) map.get(name);// 取出参数值[注:参数值为一个数组]
    42. for (int i = 0; i < values.length; i++) {
    43. values[i] = new String(values[i].getBytes("ISO-8859-1"),
    44. this.encoding);
    45. }
    46. }
    47. }
    48. chain.doFilter(request, response);
    49. }
    50. public void init(FilterConfig filterConfig) throws ServletException {
    51. String s = filterConfig.getInitParameter("encoding");// 读取web.xml文件中配置的字符集
    52. if (null != s && !s.trim().equals("")) {
    53. this.encoding = s.trim();
    54. }
    55. }
    56. }

    最终结果:

     

  • 相关阅读:
    Java @Data注解 的使用
    【故障公告】周五下午的一次突发故障
    【项目实战】springboot+vue舞蹈课程在线学习系统-java舞蹈课程学习打卡系统的设计与实现
    Linux:安装minio并设置开机自启
    Application Studio 学习笔记(1)
    hwk4:C++ 运算符重载
    写一个c程序,要求用户输入一个数字。你的程序将检查输入的数字是否是质数如果是质数,则相应地打印一条消息
    【PyTorch深度学习项目实战100例】—— 基于ResNet101实现猴痘病毒识别任务 | 第31例
    0 基础 Java 自学之路(2)
    RabbitMQ系列【17】RabbitOperations接口详解
  • 原文地址:https://blog.csdn.net/weixin_62735525/article/details/125433274