当前课程知识点:Web后端开发技术 > 第9章 某高校毕业生信息发布系统开发 > 9.3 系统实现 > 9.3.4.1首页分页显示
同学你好
今天我们学习这个知识点
本节我们来看一下首页数据该
如何去分页展示
那么大家知道我们的数据在数据库里
实际很多
那么我们需要一次取出来一部分数据
给大家进行展示
然后我们可以点击下一页
上一页或者点击对应的页码
然后跳到对应的页面
那么这里我在第1步做的时候
我们先不考虑这个专业
这个专业我就先列在这
按理来说
如果我选中的是计算机科学与技术
那么这里的列出来的数据应该都是
计算机科学技术的
那么这时候我分两步来做
首先我就认为我查出的数据是全部的数据
然后在这个基础上
我们先把分页的功能给它完成
然后在第2步的时候
我们在考虑
当我们改变专业的时候
如何基于这个专业
然后再做我们的分页查询
好
那么为了完成分页查询
我首先先建立的一个类
我放在Java.util
这个包下
叫做page类
在page类当中我有这么几个属性
一个叫做每页大小
所谓的每页大小就是我每个页要展示
多少条数据
大家可以看到
这是我当前的数据库
那么假如说我每页
现在我默认我给他5条
也就是说我一次取的时候
比如说我第1页数据就应该从1到5条
给展示出来
然后第2页数据是展示
第6条数据
那么第2个属性就是我当前页到底
属于第1页还是属于第2页
那么再有一个就是我的总页数
我们等一下说总页数
我们先说总数据量
所以总数据量就是在我数据库当中
一共有多少条数据
这个是我们需要通过SQL
语句来求出来的
很显然在我们当前数据量当中
我们的总数据量是6条
那么有了我们的总数据量
有了每页大小
很显然我们的总页数就有了
比如说我们的总数据量是6条
每一页假如说每页是三条的话
好
那么我们现在totalpage就是两页
那么这时候6除以3是正好能整除的
但是如果是5条
像我们当前页
很显然我们也得需要两页
为什么
因为头一页有5条
第2页一共有6条数据
第2页虽然说只显示一条数据
但是也需要用两页来去取
那么我们怎么算totalpage
那么大家可以看到我这里的totalpage
get方法
我在这里做了一个重写
那么如果totalpage和totalcount
也是总数据量
和我们的总每页显示数据量
比如说6和3
它取余是0的
我们的大小直接用6除以3等于2就可以了
但是如果我们的总数量是6和5
它取余是不等于0的
不等于0
我就要整除以后6除以5
取整是1
那么再加上一个1
那么就等于2
两页
所以说这就是我们的totalpage的
计算方法
好了
那么有了帮助类
还有一项叫做list
这里我用来存储
我根据当前的这些设置
里面的数据是什么
所以说我在页面上我只需返回page对象
就可以了
那么我们来看一下我们的主要的
student dao
那么student dao
我们需要接收这么几个参数
第1个我想访问的是第几页的数据
然后每页数据
每页还有多少数据
当然了
我们这里要传进的一个majorId
看看它有没有majorId
如果有majorId
它是作为一个条件进行查询的
那么我这里有两个SQL
一个是用来查询数据的sql
一个是用来计算我总数据量的
SQL
那么查询数据的SQL
首先如果
majoridea不等于空
那么我就要构造一个什么样的SQL
select*from student
然后把major的条件给设置上
同样我查询总数据量
我就是select count*
from student
然后把 major的条件给设置上
那么如果 major Id是
等于空的
那么我们这两条语句相当于后面就
不用加 major条件了
好了
紧接着我们就要去取
offset
offset是什么意思呢
假如说我们现在想取的是
第1页的数据
大家去想我们的MySQL数据库
我们要用 limit这个关键字
他的第1个参数表是从第几条开始取
这是第0条数据 从第几条开始取
取多少条出来
那么我们假如说当前是第1页
那么很显然我是从第0条开始取
取5条出来
那么假如说当前是第2页
我肯定是从第几条开始取
从第0条
1条
2条
3条
4条
第5条过去以后
从这是
0 1 2 3 4
那么我第2页数据实际上从第5条开始取
取5条出来
以此类推
我第3页数据是从第10条开始取
取5条出来
那么问题是我现在只给的是我的
page size
我的current page
这是current page
那么我们需要计算出来
我从第几条开始起
那么第几条我叫做offset
那么offset的计算方法就是我的
当前页减1
乘以我的pagesize
比如说当前页是第1页
1减1
那就是0乘以pagesize还是0
当前页是第2页
2-1是1 我的pagesize是5
那我就从第5条开始取
同理当前也是3 3-1是2
2乘我的pagesize就是10
从这10条开始取
那么这就是我的offer set的含义
好了
所以说我现在开始拼凑一个空格
limit
从哪开始取offset
我计算出来offset
然后逗号分隔
取多少条出来
也就是取我的page size
这么多条出来
好了
我们的两个SQL都已经构造完了
我定义一个我的list用来存取我
最终的数据
prepared对象
然后我要设置参数
同样我的major ID不等于空的话
我第1个SQL
我要设置major ID进去
我这个totalSQL
也就是计算总数据量的SQL
也要设置major Id进去
那么如果这个参数等于空
那么当然了我就不用设置参数了
当然这句话其实你不写也是可以的
在这里写出来是为了大家跟上面对比
好了
我们紧接着就要定义我们的
ResultSet对象了
第1个我要通过pstmt
也就是说查询我数据真正数据的
pstmt
prepare statement
然后我这个数据进行循环
每次循环以后
我们有一个student对象
把我查出来的数据放到
我student对象里
然后把这一个对象放到我 list
集合当中
当循环完以后我集合当中
存储的就是我这根据我当前条件
查出来的所有的数据
那么底下ResultSet是我要直接
执行完以后
因为它里面就存在一条数据
就是我的总数据量
我直接给他查出来
直接查出来以后
我定义一个我的page对象
我page对象里面的totalcount就
设置成我查出来的总数据量
然后我关闭对应的数据库
然后我把我的page里面的相关的这些
属性给进行初始化了
我们page里面有pagesize
预定义就是5 currentpage
那么就是我传进来的是什么
我就设置是什么
pagesize
当然了
我们这里预定的是我
当然我这里传进来是什么
我实际上是可以改我这个pagesize
然后设置我的data
当然了
我的总数据量在这里已经设置过了
那么大家可以看到
实际上我的totalpage是不用设置的
因为有了totalcount的设置完了
有了
pageset设置完了
那么我就可以根据这两个量计算出来
我的totalpage
好
这就是我们的student dao
相对来说比较复杂的一个方法
我们的student service很简单
直接调用我们的student dao
把相应的参数传进去就可以了
好
我们来看我们的indexServlet
首先我的 majors
原先我 majors都是写死的
大家可以看我们之前课课上的代码
现在我是从数据库里我写了一个
getAllMajors这么一个方法
从数据库里给它取出来
取出来以后
我放在request请求域当中
然后我定义一个变量叫做
currentPage
还有一个叫做majorId
那么currentPage有可能是从页面上
传过来的
如果他传了
我就try catch给他转换成整型
如果没传他肯定这块就会报错
我就会给他catch住
那么默认的页面就是1
当然了
如果页面上传过来的currentpage是2
那么这句话就把currentpage
给改成2了
同样这个也是如果我页面传过来一个
majorId在这里面就会给
改掉
如果页面没有传出过来
majorId
我默认的majorId就是一个空值
然后这时候我就定义一个我的页面的
一个page对象
那么page对象
我通过student service
.getstudent
把我的
current配置当前页
每页的大小
以及我们的majorID传进去
刚才这个方法我们也讲过了
他可以获得一个page对象
然后我们把page对象设置到我们的
request请求域当中
然后我们就转向到我们的cvindex.jsp
我们来看一下我们的
cvindex.jsp
这块是我们的select下拉框
我没有做任何的更改
那么
这里原先大家还记得
我们是搁的一个student对象
现在不是了
现在这应该是我们page里面的
datas对象
因为它是一个list集合,这个集合里装的
每一个对象装的是一个
student对象
所以这里我改成page.datas
好
那么再看我下面的分页部分
大家可以看到我给他进行了一个改动
那么我之前代码我给他备份了一下
我们对照着来看
在这里back 之前我们的分页代码
就在这写死的
大家先就想
我把它改成了上一页
所谓的上一页
大家看是不是我当前页数减1
往上走一页
我当前页数比如说
是第2页往上走一页
就走到第1页去了
那么我给它传到哪
是不是传到我indexServlet
我给他一个参数值
current的配置就是page.current
我当前的页数减一就可以了
所以说在我的indexservlet
我就可以获得我currentPage了
同理
我的下一页是不是就是我的当前页
加一就可以了
没有问题
好
我这里一共要显示10个数字
也就是说从比如12345678910
我找到中间的这个位置
大家注意看
我找到中间这个位置
中间这个位置显示的就是我的当前页
比如说我的当前页是举个简单的例子
我的当前页第3页
那么这块应该就显示了3
那么我再往后台传
传url的时候
大家可以看到
我这里传的就是current page
当前页就是三 实际上url
你可以不写
因为当前处于第3页的时候
这个链接是可以不点的
所以这行代码你可以去掉
那么往后走是不是
我就要走到4
下一页就是5
再下一页6
再下一页7再下一页8
是这个意思吧
所以说我这里的页码的显示
就是在我当前页的基础上
加1加2加3加4加5
同样我往后台里传的时候
页数也要在我之前的
加1加2加3加4加5
那么同样往上走
应该第2页
第1页
有同学说你减3
这不就变成负1 负2
没错
现在是这样
待会我们看该怎么去解决
同理
这里传的也应该是2减1减2减3
一直减4
所以我运行一下这个代码
大家就可以看到我的效果
我的当前页是第1页
往前减就是0 -1 -2 -3
往后加就是2 3 4 5
那么很显然我不应该出现这样的情况
也就是我第1页
如果前面是不是没有了
就不应该再出现零这些东西了
而我最多一共有两页
大家看我这里已经给它显示出来了
在这里写着
page.current.page就是当前页
pagae.totalpage就是总共的页数
那么当我总共的页数
到达二的时候
后面的就不应该显示出来了
对吧
所以说这里大家可以麻烦一点
可以这样去写
在这里我做一个判断
每一条都做一个判断
c:if
好
我判断什么呢
我就判断
比如说这不是current减4吗
currentPage减4
我就判断currentPage减4
这个数值
它是不是大于等于1的
如果大于等于1我才让它显示
因为我前面最多显示到1
对吧
那么大家看我加了这一个判断以后
大家会看到负3就没了
同理
我这里再加一个判断
为了清晰可见
把这个加个缩进
注意这块不是减4了
而应该是我要判断这个减3是不是
大于等于1的
是我就让它显示出来
以此类推
你是不是可以判断
减2是不是大于等于1的
减1是不是大于等于1的
就可以了
对吧
好
我们把它保存一下
保存
好
这是第1页
第0页 负1页是吧
好像
我保存下没有保存下来
保存下来你一刷新应该就没有了
那么我们再看后面的
后面是不是我的current配置
加1以后一定要小于等于我这个
totalpage就可以了
所以说这块我怎么判断
我判断一下c:if
在这里写
test
currentPage加1
整个值
然后加括号
必须得小于等于我的totalPage
我才给他显示
如果不小于等于我就不显示了
所以说大家可以看到这个效果
我现在一共有两页
刚才我这个判断了
3应该就不显示了
它没有编译过来也好
大家可以看到刚才负2已经不显示了
如果你为了避免出现这样的情况
你就可以把这个服务器停掉
然后把它重启一下
好 刷新
解决完了
我们继续开始
好
我们看一下效果
现在没有变化
是因为我们当前也是1那么我们的
这块我判断的加1以后应该是第2页
而第2页我们有一共有两页
所以第2页正常显示
我们再往后写一个
把c:if判断拿过来
那么这时候我这个是判断我
currentPage加2了
加2的时候
应该是到3了
这个3应该不显示就对了
大家看3不显示
所以说后面我就不再写了
大家以此类推
把这些都分别加一个判断
都加一个判断
包括上面我没有写的
这两个也都加一个判断
那么大家还要去想上一页
因为我这个上一页没有任何的限制
是不是
当我到了第1页的时候
让上一页就不显示就可以了
所以说我说也加一个判断应该是什么
当我配置page.currentPage
就是我当前页
比如说是小于等于1的
我就不要让上一页
显示了
那么同样下一页
当我的当前页
是大于等于我的总页数
也就是说totalpage的时候
下一页也就不要再显示了
这样的话我整整个分页代码就会比较
完美了
好
我们将在下一个视频当中继续讲解
怎么样在选择专业的时候
带着分页功能
这个知识点就讲到这里
谢谢
-1.0 导学
--1.0.1 导学
-1.1 Web应用开发概述
--1.1.3 测试
-1.2 准备Java Web应用开发环境
--1.2.2 测试
-1.3 任务实现:Hello World Web项目
--1.3.2 测试
-1.4 小结
--1.4.1 小结
-本课程所有代码
--课程参考代码
-2.0 导学
--2.0.1 导学
-2.1 Servlet概述
--2.1.3 测试
-2.2 创建Servlet
--2,2,3 作业
-2.3 Servlet应用
--2.3.4 测试
-2.4 任务实现:某高校毕业生信息发布系统-注册与登录(Servlet版)
--2.4.3 测试
-2.5 ServletConfig接口
-2.6 ServletContext接口
-2.7 HttpServletRequest接口
--2.7.5 测验
-2.8 HttpServletResponse接口
--2.8.3 测试
-2.9 任务实现:某高校毕业生信息发布系统-简历添加
--2.9.1 任务实现:某高校毕业生信息发布系统-简历添加
-2.10 小结
-动画演示:Java Web应用服务器处理客户端请求的过程
-3.0 导学
--3.0.1 导学
-3.1 Cookie技术
--3.1.3 测试
-3.2 Session技术
--3.2.2 Session技术-Session技术应用购物车
--3.2.3 测试
-3.3 URL重写与隐藏表单域
--3.3.2 测试
-3.4 任务实现:某高校毕业生信息发布系统-简历修改
--3.4.1 任务实现:某高校毕业生信息发布系统-简历修改
-3.5 小结
--3.5.1 小结
-4.0 导学
-4.1 jsp概述
--4.1.2 测试
-4.2 脚本元素
--4.2.2 测试
-4.3 指令元素
--4.3.2 测试
-4.4 动作元素
--4.4.3 测试
-4.5 内置对象
--4.5.3 测试
-4.6 JavaBean
--4.6.3 测试
-4.7 任务实现:某高校毕业生信息发布系统-首页(JSP版)
--4.7.1 任务实现:某高校毕业生信息发布系统-首页(JSP版)
-4.8 小结
--4.8.1 小结
-5.0 导学
--5.0.2 测试
-5.1 el语法
--5.1.2 测试
-5.2 el隐含对象
--5.2.2 测试
-5.3 任务实现:某高校毕业生信息发布系统-学生详细信息展示
--5.3.1 任务实现:某高校毕业生信息发布系统-学生详细信息展示
--5.3.2 测试
-5.4 小结
--5.4.1 小结
-6.0 导学
--6.0.2 测试
-6.1 核心标签库
--6.1.5 测试
-6.2 任务实现:某高校毕业生信息发布系统-首页(JSTL版)
--6.2.1 任务实现:某高校毕业生信息发布系统-首页(JSTL版)
--6.2.2 测试
-6.3 小结
--6.3.1 小结
-7.0 导学
--7.0_导学
-7.1 过滤器
--7.1.3 测试
-7.2 监听器
--7.2.1.1与ServletContext相关的监听器
--7.2.4 测试
-7.3 任务实现:某高校毕业生信息发布系统-单态登录
--7.3.1 任务实现:某高校毕业生信息发布系统-单态登录
--7.3.2 测试
-7.4 小结
--7.4.1小结
-8.0 导学
--8.0_导学
-8.1 JDBC API
--8.1.2 测试
-8.2 JDBC API访问MySQL基本步骤
--8.2.2 测试
-8.3 任务实现:某高校毕业生信息发布系统-注册与登录
--8.3.1 任务实现:某高校毕业生信息发布系统-注册与登录(JDBC版)
--8.3.2 测试
-8.4 小结
--8.4.1小结
-9.0导学
--9.0导学
-9.1 技术准备
--9.1.5 测试.
-9.2 系统设计
-9.3 系统实现
-9.4 小结
--9.4.1小结


