cases(findByPage)WebStageDay13

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

今日任务:
1.查看所有
2.删除用户
3.多条件查询
4.分页查询
准备工作:
1.数据库准备 执行sql脚本
2.前端页面代码导入
3.环境搭建:
1).导入jar
2).导入配置文件
3).导入工具类
4).创建三层结构(Service和DAO层面向接口设计)+domain包(面向接口javaBean)


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(“Are you sure to delete it?”){} 防止误操作
点击取消 什么都不做
点击确认 发请求 location.href =”Servlet路径”;
必须言明删除哪个 在请求中get方式传递参数:路径?id=在前端页面获取的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标签取消默认事件
这里写图片描述
2).在jsp页面中设置变量,简化信息
这里写图片描述

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

2).后端服务器
    //获取查询条件(刚跳转过来时候没有条件)
    //调用 service 查询某种条件结果 
    List<user> userService.findByCondition(gender,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 user”

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

    判断都不为空的时候:
        sql+="where gender=? 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
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方法,getter方法自己计算)
        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域中)
总述: 本页共分3个部分,1是标题,2是分页查询的信息表,3是下方页码显示区域.
1.标题部分有了样式,重定义下标题内容
2.此部分与查询所有类似,只是request这次传递的是封装好的pb.data, 不再是集合users了.
3.实现单击页码显示,和页码功能分步骤进行:
3.1 for循环打印出所有的页码,前后加上 “前页” 和”后页” 标签
3.2 对不同的页码(包括前页和后页)单击事件,进行判断处理
三种情况:
(1)第一页的<<前一页功能禁用;而其他页,<<跳转到前一页,pageNumber-1;
(2)最后一页的>>后一页功能禁用;而其他页,>>跳转到下一页,pageNumber+1;
(3)单击当前页,取消标签默认事件;

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

猜你喜欢

转载自blog.csdn.net/weixin_42957715/article/details/82658323
13
13)
今日推荐