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:;" > 标签取消默认事件
转义字符:
« <<
» >>
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).采用循环,遍历页码;第一页之前加上« << ,最后一页加上» >>;
3).实现单击页码或<< >> 更新用户信息功能(分页查询功能)
分情况:
(1)第一页的<<前一页功能禁用;而其他页,<<跳转到前一页,pageNumber-1;
(2)最后一页的>>后一页功能禁用;而其他页,>>跳转到下一页,pageNumber+1;
(3)单击当前页,取消标签默认事件;