web核心66-day13笔记 (分页查询案例)

本文详细介绍了一个关于Web核心分页查询的实战案例,包括如何进行分页查询、多条件查询以及用户数据的展示和管理。文章深入讲解了前端与后端的交互流程,如查询所有用户、删除用户、条件查询的实现方式,并重点阐述了分页查询的原理及其实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

web核心66-day13笔记 (分页查询案例)

今日任务:

1.查看所有
2.删除用户
3.多条件查询
4.分页查询

准备工作:

1.数据库准备  执行sql脚本
2.前端页面代码导入
3.环境搭建:
    1).导入jar
    2).导入配置文件
    3).导入工具类
    4).创建三层结构(Service和Dao层面向接口设计)+domain包(面向接口bean)

//////////////////////////////////////////////////

1.查看所有

1).请求来到servlet 
2).调用service 查看所有用户列表 返回list集合
3).将数据放在request域中
4).请求转发给jsp展示(不用重定向,因为一个请求,可传递request中存储的属性)
5).jsp页面编辑,将list.html样式和布局粘贴到jsp文件中,展示users集合列表:
    --使用jstl的forEach循环遍历users集合,(先在开头添加taglib 核心库core)

2.删除一个用户:

1).前端页面:
    点击删除按钮 弹出确认框confirm("***"){} 防止误操作
    点击取消 啥也不做
    点击确认 发请求 location.href ="Servlet路径";
    必须言明删除哪个 在请求中get方式传递参数:路径?id=**; 
        location.href = "${pageContext.request.contextPath}/delUser?id="+userId;
2).后端逻辑:
    1.获取参数id request.getParameter("id");
    2.调用service 根据id 删除某一条数据
    3.删除操作完成 重定向到-->查询所有findAll的Servlet(请求转发到findAll.jsp)

意外收获两个小知识:

1).a标签取消默认事件
    <a href="javascript:void(0);"></a>
    <a href="javascript:;"></a>简写方式 推荐这种
2).在jsp页面中设置变量,简化信息
    <c:set var="ctx" value="${pageContext.request.contextPath}"></c:set>
    body中${ctx}则代表${pageContext.request.contextPath}

3.多条件查询数据:

1).前端页面:
    为查询所有的页面上方添加一个form表单,设置查询条件
    提供了性别和地址输出框 
    点击查询按钮(分情况): a.有可能有一个条件 b.有两个条件 c.可能直接查询没有条件


2).后端服务器?
    //获取查询条件(刚跳转过来时候没有条件)
    //调用 service 查询某种条件结果 
    List<user> userService.findByCondition(sex,address);
    //将查询结果数据放入request
    //请求转发到jsp展示
    ----刚跳转过来jsp页面时候没有条件,此时要求显示所有值:
        List<Object> params = new ArrayList<>();
        如果查询条件不为空,才添加进参数集合;
        qr.query(sql, new BeanListHandler<>(User.class),params.toArray());
        刚跳转过来传递的参数个数为0个,就等于查询所有

    ----jsp展示结果时,如何让查询条件同时显示?
            (1).需要在servlet中将查询条件存入request属性中;
            (2).在jsp页面中设置:
                <label for="sex">性别</label>的selected属性;
                <label for="address">籍贯</label>的value值(显示内容);

又意外收获一个小知识:

多条件查询dao的sql编写问题
    string sql="select * from contact"

    判断 两个都为空:
        sql+=""
    判断有一个参数的时候
        判断是sex
            sql+="where sex=?"
        判断是address
            sql+="where address=?"

    判断都不为空的时候:
        sql+="where sex=? and address=?"

以上因为分类太多,sql语句变化太多,麻烦! 解决方案:
改变基本sql语句 
    sql="select * from contact where 1=1 ";

    有一个参数?
        sql+=" and 参数名=?"
    又有一个参数?
        sql+=" and 参数名=?"
    再有一个参数?
        sql+=" and 参数名=?"

注意:  
    //address != null && address.trim().length()>0

    //因为防注入攻击的sql不支持 % 等特殊符号,模糊查询应自行拼接字符串,query传参时候传入
    address = "%" + address + "%";

////////////////////////////////////////////////

4.分页查询(好处)

用户角度:
    不会一下子 查看所有
技术角度:
    内存限制
其他好处:
    提高用户体验.

5.分页查询实现方式:

1).物理分页
    每当我们用户发请求的时候,我们服务器才会去数据库中查询出对应页的数据
    返回用户

2).逻辑分页 (等于扯淡)
    在服务器启动的时候 ,先去数据库将所有数据加载 web服务器内存,
    当用户来访问的时候,去内存中截取对应页的数据
    最终展示给用户

/////////////////////////////////////////////////////////////

6.mysql分页查询 (limit关键字)

select * from 表名 where 条件  limit m,n;
    m:代表的offset 偏移量 或者起始索引
    n:每页查询的条数个数

有时候我们看到这种写法 
    select * from 表名 limit n; =====> select * from 表名 limit 0,n;

要求每页查询 N=5条
    查询第一页   limit 0,5
    查询第二页   limit 5,5
    查询第三页   limit 10,5
    查询第i页   limit (i-1)*5,5

M=(页码-1)*N

总结:
    select * from 表名 where 条件  limit (页码-1)*n,n;

//////////////////////////////////////////////////////////////////////////////////

7.mysql分页查询步骤分析:

7.1.前端请求 必须要求传参数页码 ? 不传参数默认为第一页.
7.2.后端逻辑:
    1).获取第几页数据
        如果不传参数 默认为是第一页
        定义每页显示条数: int pageSize=5;
    2).调用service查询数据  条件 (pageNumber,pageSize) 返回list<user>
    3).放入request
    4).交给jsp展示

7.3.需要下方页码:
    1).总页数totalPage==============>总条数/每页显示的个数 向上取整 Math.ceil();
    2).总条数total
    3).每页显示的个数pageSize
    4).当前是第几页pageNumber
    5).当前页的数据data

7.4.封装到一个方法 
    由于java根本不支持多返回值操作,将要返回的五样数据放入到一个对象中--->pageBean

    public class pageBean{
        private int totalPage;          //1.总页数(不需setter方法)
        private int total;              //2.总条数
        private int pageSize;           //3.每页显示的个数
        private int pageNumber;         //4.当前是第几页
        private List<T> data            //5.当前页数据

        getter and setter...
    }

7.5.下方页面的前页与后页设置,下方只显示10页设置
    String sql = "select count(*) from user";
    return ((Long)qr.query(sql,new ScalarHandler())).intValue();
    //因为查询条数的sql底层返回个数,是Long类型
    /**
     * Long num=Object query(.....){
     *  ....
     *    return new Long(100);
     * }
     */


7.6.前端jsp页面:     

    <li class="disabled">       禁用该标签
    <a href="javascript:;" >    标签取消默认事件

    转义字符:
        &laquo;     <<
        &raquo;     >>

7.7.分页页面布局逻辑(采用PageBean封装了信息储存在request中)
    1).与查询所有类似,显示用户信息(pb.data,默认第一页5条信息)
    2).用户信息下方布局页码
        (1).采用循环,遍历页码;第一页之前加上&laquo;    << ,最后一页加上&raquo;   >>;
    3).实现单击页码或<< >> 更新用户信息功能(分页查询功能)
        分情况:
        (1)第一页的<<前一页功能禁用;而其他页,<<跳转到前一页,pageNumber-1;
        (2)最后一页的>>后一页功能禁用;而其他页,>>跳转到下一页,pageNumber+1;
        (3)单击当前页,取消标签默认事件;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值