• JavaWeb-高级分页查询


    一、简介

    高级分页查询:根据用户输入的条件(如年龄、姓名等)将数据库中的内容显示在页面上面,不符合条件的不显示
    在这里插入图片描述

    二、参数

    前端传递给后端的数据

    1、当前页码  -  currentPage  (当前第几页)
    2、页容量    -  pageSize   (一页能够容纳多少条数据) 
    
    5个条件
    1、姓名 name
    2、籍贯 address
    3、邮箱 email
    4、最小年龄 startAge
    5、最大年龄 endAge
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    后端响应给前端的数据

    5个参数
    1、当前页码  - currentPage
    2、页容量    - pageSize
    3、总记录数  - count  (数据库中总共有多少条数据)  
    4、总页数    - totalPage ( (总记录数%页容量)==0 ? (总记录数/页容量): (总记录数/页容量)+15、数据(集合) - records  (从数据库中查询到的所有数据放入集合中后返回集合)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    sql语句

    1.总记录数 
    	SELECT COUNT(1) FROM tb_userinfo WHERE 条件;
    2、数据集合
    	SELECT * FROM tb_userinfo WHERE 条件 LIMIT (currntPage-1, pageSize;
    
    • 1
    • 2
    • 3
    • 4

    三、步骤

    前端用的list.jsp页面,web层用的ListServlet , service层用的UserInfoService , dao层用的UserInfoDao


    第一步 前期准备

    为了方便后续传递参数,这里将前端传递给后端的2个参数以及5个条件分别封装到vo包下的类中,vo包专门存放前端传给后端的数据封装成的类,5个参数封装为Page类,5个条件封装为Condition类
    在这里插入图片
    注意:封装的Page类中总页数totalPage不能够提供set方法,这个是需要通过公式得到的,但是不提供set方法get到的总页数就是默认值null,所以还需要再修改get总页数的返回值
    在这里插入图片描述


    第二步 在ListServlet中添加代码

    1、指定编码

    2、获取前端传入的currentPage、pageSize、各种条件

    3、对获取到的值进行判断并初始化,初始化currentPage=1,pageSize=3,startAge=null , endAge=null
          如果前端传过来的值不为空并且不是空字符串,则将前端传过来的值赋值给currentpage…

    4、创建Condition条件类的对象,将前端传递过来的值通过类对象的set方法一 一进行赋值

    5、创建Service层实现类的对象,调用对象中的、获取带条件查询的queryByCondition(currentPage,pageSize , Condition condition)方法得到满足条件的多个对象

    6、将查询方法queryByCondition()传递回来的属性为Page的参数存入request域中

    7、将条件对象Condition condition 也存入request域中

    8、转发到原来的list.jsp页面


    第三步 在Service层中编写方法

    1、创建UserInfoService接口的实现类UserInfoServiceImpl ,实现UserInfoService调用的方法 queryByCondition(…)

    2、在该方法中对Page类进行赋值,(不在ListServlet类中赋值的原因:因为Page中获取总记录数count需要调用数据库进行查询,获取满足条件的数据也需要调用数据库,而根据web三层架构,Servlet层不能够跨层直接调用dao层中查询数据库的方法)

    在这里插入图片描述
    3、返回数据类型为UserInfo的Page对象


    第四步 在dao层中编写相对应的方法

    1、创建UserInfoDaoImpl类实现UserInfoDao接口中的方法,count(…)和query()
    【为了便于区分service层的方法和dao层的方法,这里dao层将query方法重新命名为queryByCondition(参数一致)】

    2、count(…)中编写代码如下
    在这里插入图片描述


    3、queryByCondition(…)方法如下
    在这里插入图片描述


    4、拼接字符串的方法
    在这里插入图片描述


    第五步 通过EL表达式+JSPL标签将数据填充进页面
    在第一步时就已经将从数据库中拿到的数据以及前端传入的条件存放进了域中,现在就需要从域中拿到数据即可,
    在这里插入图片描述

    注意:如果通过条件查询出了结果,但是当点击页码的时候(即第一页第二页)页面会重新请求Servlet,这个时候条件框如果为空则条件将不再存在,查出来的数据就是不带条件的数据,这就是一个bug,需要在查询的form表单中添加隐藏域value为1,type为hidden,当点击页码的时候将该隐藏域(作为currentPage使用)一起提交,点击页码时通过js代码将form表单提交即可
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    第三章:最新版零基础学习 PYTHON 教程(第十四节 - Python 运算符—Python 中 == 和 is 运算符的区别)
    欠拟合、过拟合及优化:岭回归
    学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计代做
    C. Yarik and Array Codeforces Round 909 (Div. 3) 1899C
    代码随想录算法训练营Day52|动态规划11
    UnityAI——排队过窄洞
    计算机微信小程序毕业设计题目SSM项目小说阅读器+后台管理系统|前后分离VUE[包运行成功]
    测试人员Bug书写规范
    Java 中文乱码原因及解决方案
    Java 原生编译的 Solon 回忆录
  • 原文地址:https://blog.csdn.net/qq_52998673/article/details/127559106