• J2EE基础:通用前台分页02


    目录

    一.改造上一次后台分页01的pagebean分页工具类

     二.分页的助手类

    1.分页的核心思想

    2.页码样式 

    2.开始步骤 

    3.开始改造

     三.关于字符编码


    通用分页前端

    一.改造上一次后台分页01的pagebean分页工具类

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

    需要新增变量保存上一次请求地址: http://localhost:80/J_page/book/search

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

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

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

    需要新增方法:初始化pageBean

    PageBean.java代码块改造后的:

    1. package com.jiangwenjuan.util;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import javax.servlet.http.HttpServletRequest;
    5. /**
    6. * 分页工具类
    7. * @author 蒋文娟
    8. *
    9. * @date 2022年6月21日 下午8:15:46
    10. */
    11. public class PageBean {
    12. private int page = 1;// 页码
    13. private int rows = 10;// 页大小
    14. private int total = 0;// 总记录数
    15. private boolean pagination = true;// 是否分页
    16. // 需要新增变量保存上一次请求地址: http://localhost:80/J_page/book/search
    17. private String url;
    18. // 需要新增变量保存上一次查询条件,然后在提供setget方法
    19. private Map<String, String[]> parameterMap = new HashMap<String, String[]>();
    20. // 获取最大页的页码
    21. public int maxPage() {
    22. return this.total % this.rows == 0 ? this.total / this.rows : 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() ? this.page + 1 : this.page;
    31. }
    32. // 需要新增方法:初始化pageBean
    33. public void setRequest(HttpServletRequest req) {
    34. this.setPage(req.getParameter("page"));
    35. this.setRows(req.getParameter("rows"));
    36. this.setPagination(req.getParameter("pagination"));
    37. this.setUrl(req.getRequestURI().toString());//上一次请求的URL
    38. this.setParameterMap(req.getParameterMap());//上一次请求的条件
    39. }
    40. private void setPagination(String pagination) {
    41. if(StringUtils.isNotBlank(pagination)) {
    42. this.setPagination(!"false".equals(pagination));
    43. }
    44. }
    45. private void setRows(String rows) {
    46. if(StringUtils.isNotBlank(rows)) {
    47. // this.setRows(rows);这里面是自己调用自己所以不行
    48. this.setRows(Integer.valueOf(rows));
    49. }
    50. }
    51. //   需要新增变量保存上一次查询条件
    52. //      需要新增变量保存上一次请求地址: http://localhost:80/J_page/book/search
    53. //      需要添加方法:获取最大页的页码
    54. //      需要添加方法:获取下一页的页码
    55. //      需要添加方法:获取上一页的页码
    56. //      需要新增方法:初始化pageBean
    57. public void setPage(String page) {
    58. if(StringUtils.isNotBlank(page))
    59. // set自动生成的方法
    60. this.setPage(Integer.valueOf(page));
    61. }
    62. public String getUrl() {
    63. return url;
    64. }
    65. public void setUrl(String url) {
    66. this.url = url;
    67. }
    68. public Map<String, String[]> getParameterMap() {
    69. return parameterMap;
    70. }
    71. public void setParameterMap(Map<String, String[]> parameterMap) {
    72. this.parameterMap = parameterMap;
    73. }
    74. public PageBean() {
    75. super();
    76. }
    77. public int getPage() {
    78. return page;
    79. }
    80. public void setPage(int page) {
    81. this.page = page;
    82. }
    83. public int getRows() {
    84. return rows;
    85. }
    86. public void setRows(int rows) {
    87. this.rows = rows;
    88. }
    89. public int getTotal() {
    90. return total;
    91. }
    92. public void setTotal(int total) {
    93. this.total = total;
    94. }
    95. public void setTotal(String total) {
    96. this.total = Integer.parseInt(total);
    97. }
    98. public boolean isPagination() {
    99. return pagination;
    100. }
    101. public void setPagination(boolean pagination) {
    102. this.pagination = pagination;
    103. }
    104. /**
    105. * 获得起始记录的下标
    106. *
    107. * @return
    108. */
    109. public int getStartIndex() {
    110. return (this.page - 1) * this.rows;
    111. }
    112. @Override
    113. public String toString() {
    114. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination
    115. + ", url=" + url + ", parameterMap=" + parameterMap + "]";
    116. }
    117. }

    判空StringUtils.java代码块:

    1. package com.jiangwenjuan.util;
    2. /**
    3. * 判空
    4. * @author 蒋文娟
    5. *
    6. * @date 2022年6月21日 下午8:15:19
    7. */
    8. public class StringUtils {
    9. // 私有的构造方法,保护此类不能在外部实例化
    10. private StringUtils() {
    11. }
    12. /**
    13. * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
    14. *
    15. * @param s
    16. * @return
    17. */
    18. public static boolean isBlank(String s) {
    19. boolean b = false;
    20. if (null == s || s.trim().equals("")) {
    21. b = true;
    22. }
    23. return b;
    24. }
    25. /**
    26. * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
    27. *
    28. * @param s
    29. * @return
    30. */
    31. public static boolean isNotBlank(String s) {
    32. return !isBlank(s);
    33. }
    34. }

    web包里面的BookServlet.java代码块:

    1. package com.jiangwenjuan.web;
    2. import java.io.IOException;
    3. import java.util.Map;
    4. import javax.servlet.ServletException;
    5. import javax.servlet.annotation.WebServlet;
    6. import javax.servlet.http.HttpServlet;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import com.jiangwenjuan.util.PageBean;
    10. @WebServlet("/book/search")
    11. public class BookServlet extends HttpServlet{
    12. @Override
    13. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    14. doPost(req, resp);
    15. }
    16. @Override
    17. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    18. PageBean pageBean = new PageBean();
    19. pageBean.setRequest(req);
    20. req.setAttribute("pageBean", pageBean);
    21. req.getRequestDispatcher("/bookList.jsp").forward(req, resp);
    22. }
    23. }

    运行后:


     





     二.分页的助手类

    1.分页的核心思想

    2.页码样式 

    注意这个样式:要连接WiFi才会有显示 

    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. <link
    8. href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
    9. rel="stylesheet">
    10. <script
    11. src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
    12. <title>书籍列表</title>
    13. <style type="text/css">
    14. .page-item input {
    15. padding: 0;
    16. width: 40px;
    17. height: 100%;
    18. text-align: center;
    19. margin: 0 6px;
    20. }
    21. .page-item input, .page-item b {
    22. line-height: 38px;
    23. float: left;
    24. font-weight: 400;
    25. }
    26. .page-item.go-input {
    27. margin: 0 10px;
    28. }
    29. </style>
    30. </head>
    31. <body>
    32. <form class="form-inline"
    33. action="${pageContext.request.contextPath }/book.action" method="post">
    34. <div class="form-group mb-2">
    35. <input type="text" class="form-control-plaintext" name="bname"
    36. placeholder="请输入书籍名称">
    37. </div>
    38. <button type="submit" class="btn btn-primary mb-2">查询</button>
    39. </form>
    40. <table class="table table-striped bg-success">
    41. <thead>
    42. <tr>
    43. <th scope="col">书籍ID</th>
    44. <th scope="col">书籍名</th>
    45. <th scope="col">价格</th>
    46. </tr>
    47. </thead>
    48. <tbody>
    49. <tr>
    50. <td>1</td>
    51. <td>圣墟第1章</td>
    52. <td>1</td>
    53. </tr>
    54. <tr>
    55. <td>1</td>
    56. <td>圣墟第1章</td>
    57. <td>1</td>
    58. </tr>
    59. </tbody>
    60. </table>
    61. <form action="" id="pageBeanForm" method="post">
    62. <input type="hidden" name="page">
    63. </form>
    64. <ul class="pagination justify-content-center">
    65. <li class="page-item"><a class="page-link"
    66. href='javascript:gotoPage(1)'>首页</a></li>
    67. <li class="page-item"><a class="page-link"
    68. href='javascript:gotoPage(1)'>&lt;</a></li>
    69. <li class="page-item"><a class="page-link" href="#">1</a></li>
    70. <li class="page-item"><a class="page-link" href="#">2</a></li>
    71. <li class="page-item active"><a class="page-link" href="#">3</a></li>
    72. <li class="page-item disabled"><a class="page-link" href="#">&gt;</a></li>
    73. <li class="page-item disabled"><a class="page-link" href="#">尾页</a></li>
    74. <li class="page-item go-input"><b>到第</b><input class="page-link"
    75. type="text" id="skipPage" name="" /><b></b></li>
    76. <li class="page-item go"><a class="page-link"
    77. href="javascript:skipPage()">确定</a></li>
    78. <li class="page-item"><b>共666条</b></li>
    79. </ul>
    80. <script type='text/javascript'>
    81. function gotoPage(page) {
    82. document.getElementById('pageBeanForm').page.value = page;
    83. document.getElementById('pageBeanForm').submit();
    84. }
    85. function skipPage() {
    86. var page = document.getElementById('skipPage').value;
    87. if (!page || isNaN(page) || parseInt(page) < 1
    88. || parseInt(page) > 1122) {
    89. alert('请输入1~N的数字');
    90. return;
    91. }
    92. gotoPage(page);
    93. }
    94. </script>
    95. </body>
    96. </html>

    运行出来的:如果不喜欢这个颜色可以换就在<table>表格里面可以选择默认的。

    上面的代码块:里面的gotoPage()方法跳到第几页,还是要根据上面的核心思路图来看,这里就通过我们最初分析点击查询那么就会按照这个条件去搜索,当我点下一页是不是也要把这个条件带到下一页去,那么这里就有一个问题,目前上一次请求所有的参数这些条件都存到哪里的,是不是存到pageBean里面啊,当我去点这个下一页的时候,是不是要把上一次所有的查询的条件要带到下一次上面去,那我们要怎么实现,是不是要把pageBean里面的内容要保存到隐藏域的form表单,当我下一次提交的时候我把隐藏域from表单的值,给我发到下一次去,什么意思啊下面解释。

    在上面的页码样式里面有个东西很重要就是隐藏的from表单 ,假如我上一次请求在这个发的

    1. //假如这是上一次请求
    2. <form class="form-inline"
    3. action="${pageContext.request.contextPath }/book.action" method="post">
    4. <div class="form-group mb-2">
    5. <input type="text" class="form-control-plaintext" name="bname"
    6. placeholder="请输入书籍名称">
    7. </div>
    8. <button type="submit" class="btn btn-primary mb-2">查询</button>
    9. </form>

    完了之后我在下面这里有一个隐藏域的from表单

     这些查询条件都应该保存在这里,这就是隐藏域的from表单的作用,我要把上一次查询出来所有的条件,全都跟我保存到这个隐藏的from表单

    1. /伪代码
    2. <form action="" id="pageBeanForm" method="post">
    3. <input type="hidden" name="page" value="">//上一次的页码是多少
    4. <input type="hidden" name="bname" value="">//上一次的名字是多少
    5. <input type="hidden" name="rows" value="">//上一次页大小是多少
    6. <input type="hidden" name="pageniation" value="">//上一次是否分页
    7. <input type="hidden" name="likes" value="">//这个就是我们上一次做的案例
    8. </form>
    9. //还原
    10. <form action="" id="pageBeanForm" method="post">
    11. <input type="hidden" name="page" value="">
    12. </form>

     当我去点下一页的时候或者点首页的时候,首页的gotoPage(),我把这个隐藏的from表单提交了

     

    当我点击查询的时候 ,最终这个页面会做展示,做展示的同时,你把pageBean里面的那些内容全部加到隐藏的from表单去它们的一些value值是多少,完了之后在我点gotoPage()的时候,那我们只要改变这个page的值就行了,剩下的就不需要改,这就是伪代码的作用

    1. <form action="" id="pageBeanForm" method="post">
    2. <input type="hidden" name="page" value="">//上一次的页码是多少
    3. <input type="hidden" name="bname" value="">//上一次的名字是多少
    4. <input type="hidden" name="rows" value="">//上一次页大小是多少
    5. <input type="hidden" name="pageniation" value="">//上一次是否分页
    6. <input type="hidden" name="likes" value="">//这个就是我们上一次做的案例
    7. </form>

    2.开始步骤 

     那么上面的那些都还是嘶的数据吧,现在我们要把它变活的,而且每一个页码你都要写大量的html代码,还有分页条,下面就是js代码,每个页码都要写是不是很麻烦所以我们要封装成标签。然后把页面样式里面的双引号改为单引号,为什么呢?因为还要转义。这样就方便很多。

    在页面样式里面分为了三部分。第一个就隐藏的from表单,分页条是一部分,js代码是一部分。 

    1. <form action='' id='pageBeanForm' method='post'>
    2. <input type='hidden' name='page' value=''>
    3. </form>
    1. <ul class='pagination justify-content-center'>
    2. <li class='page-item'><a class='page-link'
    3. href='javascript:gotoPage(1)'>首页</a></li>
    4. <li class='page-item'><a class='page-link'
    5. href='javascript:gotoPage(1)'>&lt;</a></li>
    6. <li class='page-item'><a class='page-link' href='#'>1</a></li>
    7. <li class='page-item'><a class='page-link' href='#'>2</a></li>
    8. <li class='page-item active'><a class='page-link' href='#'>3</a></li>
    9. <li class='page-item disabled'><a class='page-link' href='#'>&gt;</a></li>
    10. <li class='page-item disabled'><a class='page-link' href='#'>尾页</a></li>
    11. <li class='page-item go-input'><b>到第</b><input class='page-link'
    12. type='text' id='skipPage' name='' /><b></b></li>
    13. <li class='page-item go'><a class='page-link'
    14. href='javascript:skipPage()'>确定</a></li>
    15. <li class='page-item'><b>共666条</b></li>
    16. </ul>
    1. <script type='text/javascript'>
    2. function gotoPage(page) {
    3. document.getElementById('pageBeanForm').page.value = page;
    4. document.getElementById('pageBeanForm').submit();
    5. }
    6. function skipPage() {
    7. var page = document.getElementById('skipPage').value;
    8. if (!page || isNaN(page) || parseInt(page) < 1
    9. || parseInt(page) > 1122) {
    10. alert('请输入1~N的数字');
    11. return;
    12. }
    13. gotoPage(page);
    14. }
    15. </script>

     写一个标签类:把上面的三部分一个一个加进去

    1. package com.jiangwenjuan.tag;
    2. import java.io.IOException;
    3. import javax.servlet.jsp.JspException;
    4. import javax.servlet.jsp.JspWriter;
    5. import javax.servlet.jsp.tagext.BodyTagSupport;
    6. import com.jiangwenjuan.util.PageBean;
    7. /**
    8. * 分页助手类
    9. * @author 蒋文娟
    10. *
    11. * @date 2022年6月23日 上午9:49:37
    12. */
    13. public class PageTag extends BodyTagSupport{
    14. private PageBean pageBean;
    15. public PageBean getPageBean() {
    16. return pageBean;
    17. }
    18. public void setPageBean(PageBean pageBean) {
    19. this.pageBean = pageBean;
    20. }
    21. @Override
    22. public int doStartTag() throws JspException {
    23. //UI标签先要获取那些内容
    24. //UI标签的特点就是你没有标签体,但是可以在页面中输出内容
    25. JspWriter out = pageContext.getOut();
    26. try {
    27. out.print(toHTML());
    28. } catch (Exception e) {
    29. // TODO Auto-generated catch block
    30. e.printStackTrace();
    31. }
    32. return super.doStartTag();
    33. }
    34. private String toHTML() {
    35. StringBuffer sb = new StringBuffer();
    36. //隐藏的from表单,作用是保存上一次查询的条件
    37. sb.append("<form action='' id='pageBeanForm' method='post'>");
    38. sb.append(" <input type='hidden' name='page' value=''>");
    39. sb.append(" <input type='hidden' name='page' value=''>");
    40. sb.append("</form>");
    41. //分页条
    42. sb.append("<ul class='pagination justify-content-center'>");
    43. sb.append(" <li class='page-item'><a class='page-link'");
    44. sb.append(" href='javascript:gotoPage(1)'>首页</a></li>");
    45. sb.append(" <li class='page-item'><a class='page-link'");
    46. sb.append(" href='javascript:gotoPage(1)'>&lt;</a></li>");
    47. sb.append(" <li class='page-item'><a class='page-link' href='#'>1</a></li>");
    48. sb.append(" <li class='page-item'><a class='page-link' href='#'>2</a></li>");
    49. sb.append(" <li class='page-item active'><a class='page-link' href='#'>3</a></li>");
    50. sb.append(" <li class='page-item disabled'><a class='page-link' href='#'>&gt;</a></li>");
    51. sb.append(" <li class='page-item disabled'><a class='page-link' href='#'>尾页</a></li>");
    52. sb.append(" <li class='page-item go-input'><b>到第</b><input class='page-link'");
    53. sb.append(" type='text' id='skipPage' name='' /><b></b></li>");
    54. sb.append(" <li class='page-item go'><a class='page-link'");
    55. sb.append(" href='javascript:skipPage()'>确定</a></li>");
    56. sb.append(" <li class='page-item'><b>共666条</b></li>");
    57. sb.append("</ul>");
    58. //分页的js代码
    59. sb.append("<script type='text/javascript'>");
    60. sb.append(" function gotoPage(page) {");
    61. sb.append(" document.getElementById('pageBeanForm').page.value = page;");
    62. sb.append(" document.getElementById('pageBeanForm').submit();");
    63. sb.append(" }");
    64. sb.append(" function skipPage() {");
    65. sb.append(" var page = document.getElementById('skipPage').value;");
    66. sb.append(" if (!page || isNaN(page) || parseInt(page) < 1");
    67. sb.append(" || parseInt(page) > 1122) {");
    68. sb.append(" alert('请输入1~N的数字');");
    69. sb.append(" return;");
    70. sb.append(" }");
    71. sb.append(" gotoPage(page);");
    72. sb.append(" }");
    73. sb.append("</script>");
    74. return sb.toString();
    75. }
    76. }

    然后在去写一个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>j</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.jiangwenjuan.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>

    然后在去界面去引用:

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!-- 引入我们自己写的标签库 -->
    4. <%@taglib uri="http://jsp.veryedu.cn" prefix="j" %>
    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 bg-success">
    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. <tr>
    52. <td>1</td>
    53. <td>圣墟第1章</td>
    54. <td>1</td>
    55. </tr>
    56. <tr>
    57. <td>1</td>
    58. <td>圣墟第1章</td>
    59. <td>1</td>
    60. </tr>
    61. </tbody>
    62. </table>
    63. <j:page pageBean="${pageBean }"></j:page>
    64. </body>
    65. </html>

    现在运行出来的结果还是一样的:

    3.开始改造

    先把主要问题说一下:


     

    改造的PageTag分页助手类:

    1. package com.jiangwenjuan.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.jiangwenjuan.util.PageBean;
    10. /**
    11. * 分页助手类
    12. * @author 蒋文娟
    13. *
    14. * @date 2022年6月23日 上午9:49:37
    15. */
    16. public class PageTag extends BodyTagSupport{
    17. private PageBean pageBean;
    18. public PageBean getPageBean() {
    19. return pageBean;
    20. }
    21. public void setPageBean(PageBean pageBean) {
    22. this.pageBean = pageBean;
    23. }
    24. @Override
    25. public int doStartTag() throws JspException {
    26. //UI标签先要获取那些内容
    27. //UI标签的特点就是你没有标签体,但是可以在页面中输出内容
    28. JspWriter out = pageContext.getOut();
    29. try {
    30. out.print(toHTML());
    31. } catch (Exception e) {
    32. // TODO Auto-generated catch block
    33. e.printStackTrace();
    34. }
    35. return super.doStartTag();
    36. }
    37. private String toHTML() {
    38. StringBuffer sb = new StringBuffer();
    39. //隐藏的from表单,作用是保存上一次查询的条件
    40. sb.append("<form action='"+pageBean.getUrl()+"' id='pageBeanForm' method='post'>");
    41. sb.append(" <input type='hidden' name='page' value=''>");
    42. //保存的查询条件是不是在pageBean里面
    43. Map<String, String[]> parameterMap = pageBean.getParameterMap();
    44. //有没有可能没有内容,所以说要判断,当它不等于空而且还要大于0
    45. if(parameterMap != null && parameterMap.size() > 0) {
    46. //才去拼装它的条件
    47. Set<Entry<String,String[]>> entrySet = parameterMap.entrySet();
    48. for (Entry<String, String[]> entry : entrySet) {
    49. String key = entry.getKey(); // name/likes/page/rows等等这些
    50. String[] values = entry.getValue();// 所有的值
    51. //我们要在拼接的时候排除这个page 当这个属性不等于page的时候
    52. if(!"page".equals(key)) {
    53. //在遍历所有的数组集合
    54. for (String value : values) {
    55. //在追加
    56. sb.append(" <input type='hidden' name='"+key+"' value='"+value+"'>");
    57. }
    58. }
    59. }
    60. }
    61. sb.append("</form>");
    62. //分页条
    63. sb.append("<ul class='pagination justify-content-center'>");
    64. sb.append(" <li class='page-item "+(pageBean.getPage()==1 ? "disabled" : "")+"'><a class='page-link'");
    65. sb.append(" href='javascript:gotoPage(1)'>首页</a></li>");
    66. sb.append(" <li class='page-item "+(pageBean.getPage()==1 ? "disabled" : "")+"'><a class='page-link'");
    67. sb.append(" href='javascript:gotoPage("+pageBean.previousPage()+")'>&lt;</a></li>");
    68. sb.append(" <li class='page-item active'><a class='page-link' href='#'>"+pageBean.getPage()+"</a></li>");
    69. sb.append(" <li class='page-item "+(pageBean.getPage()==pageBean.maxPage() ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.nextPage()+")'>&gt;</a></li>");
    70. sb.append(" <li class='page-item "+(pageBean.getPage()==pageBean.maxPage() ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.maxPage()+")'>尾页</a></li>");
    71. sb.append(" <li class='page-item go-input'><b>到第</b><input class='page-link'");
    72. sb.append(" type='text' id='skipPage' name='' /><b>页</b></li>");
    73. sb.append(" <li class='page-item go'><a class='page-link'");
    74. sb.append(" href='javascript:skipPage()'>确定</a></li>");
    75. sb.append(" <li class='page-item'><b>共"+pageBean.getTotal()+"条</b></li>");
    76. sb.append("</ul>");
    77. //分页的js代码
    78. sb.append("<script type='text/javascript'>");
    79. sb.append(" function gotoPage(page) {");
    80. sb.append(" document.getElementById('pageBeanForm').page.value = page;");
    81. sb.append(" document.getElementById('pageBeanForm').submit();");
    82. sb.append(" }");
    83. sb.append(" function skipPage() {");
    84. sb.append(" var page = document.getElementById('skipPage').value;");
    85. sb.append(" if (!page || isNaN(page) || parseInt(page) < 1");
    86. sb.append(" || parseInt(page) > "+pageBean.maxPage()+") {");
    87. sb.append(" alert('请输入1~"+pageBean.maxPage()+"的数字');");
    88. sb.append(" return;");
    89. sb.append(" }");
    90. sb.append(" gotoPage(page);");
    91. sb.append(" }");
    92. sb.append("</script>");
    93. return sb.toString();
    94. }
    95. }

    接着BookServlet调用一下:

    1. package com.jiangwenjuan.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.jiangwenjuan.dao.BookDao;
    11. import com.jiangwenjuan.entity.Book;
    12. import com.jiangwenjuan.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 bookDao = new BookDao();
    24. Book book = new Book();
    25. book.setBname(req.getParameter("bname"));
    26. try {
    27. List<Book> books = bookDao.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. }

    在主界面中运行:

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

    运行出来的结果为:

     三.关于字符编码

    怎么解决呢?我们先去BookServlet里面根据bname查询哪里打个断点看看

     

    这里乱码的问题就是字符编码器集的问题,那么此时我们的工具类就派上用场了,在哪里内

    那么凡是要去访问这个book的请求,我们就用一下这个乱码:

     

    代码块: 

    1. package com.jiangwenjuan.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. * 过滤器:就是把我们的字符编码集转成UTF-8,jsp默认的编码集是ISO-8859-1,这个就是我们编码集的作用
    17. * 中文乱码处理
    18. * @author 蒋文娟
    19. *
    20. * @date 2022年6月21日 下午8:09:18
    21. */
    22. @WebFilter("/book/*")
    23. public class EncodingFiter implements Filter {
    24. private String encoding = "UTF-8";// 默认字符集
    25. public EncodingFiter() {
    26. super();
    27. }
    28. public void destroy() {
    29. }
    30. public void doFilter(ServletRequest request, ServletResponse response,
    31. FilterChain chain) throws IOException, ServletException {
    32. HttpServletRequest req = (HttpServletRequest) request;
    33. HttpServletResponse res = (HttpServletResponse) response;
    34. // 中文处理必须放到 chain.doFilter(request, response)方法前面
    35. res.setContentType("text/html;charset=" + this.encoding);
    36. if (req.getMethod().equalsIgnoreCase("post")) {
    37. req.setCharacterEncoding(this.encoding);
    38. } else {
    39. Map map = req.getParameterMap();// 保存所有参数名=参数值(数组)的Map集合
    40. Set set = map.keySet();// 取出所有参数名
    41. Iterator it = set.iterator();
    42. while (it.hasNext()) {
    43. String name = (String) it.next();
    44. String[] values = (String[]) map.get(name);// 取出参数值[注:参数值为一个数组]
    45. for (int i = 0; i < values.length; i++) {
    46. values[i] = new String(values[i].getBytes("ISO-8859-1"),
    47. this.encoding);
    48. }
    49. }
    50. }
    51. chain.doFilter(request, response);
    52. }
    53. public void init(FilterConfig filterConfig) throws ServletException {
    54. String s = filterConfig.getInitParameter("encoding");// 读取web.xml文件中配置的字符集
    55. if (null != s && !s.trim().equals("")) {
    56. this.encoding = s.trim();
    57. }
    58. }
    59. }

    然后我们在去输入查询一下

     

    不管你查询了那些数据它都会把你查询出来的数据给保存起来

     

    传了那些参数它都能帮你保存下来,这就是这个from表单,它就是用来保存上一次请求的所以参数,你可以通过检查然后来看.

  • 相关阅读:
    vue3使用插件fullcalendar生成日历或工作台
    Feign源码解析7:nacos loadbalancer不支持静态ip的负载均衡
    大厂的 404 页面都长啥样?看到最后一个,我笑了~
    机器学习基础:模型评估
    【python笔记】第八节 函数基础
    linux shell脚本修改ini配置文件[session]下的键值
    VMwareCentOS7Ping 指令报错:Nameorservicenotknown
    踩坑记:JSON.parse和JSON.stringify
    leetcode456 132 Pattern
    Java测试(11) --- selenium
  • 原文地址:https://blog.csdn.net/weixin_67465673/article/details/125416898