分页功能的实现

时间:2021-10-19 12:50:37

不多说先放出主角,实现分页功能的sql语句(news管理系统的分页语句~~):

                   select  newsno, news_title, news_context,news_author,news_pubdate,  news_type,readcount, news_images

                   from (select rownum as r,t.*from (select news_info.*from news_info  )t where rownum<=?*3) where r>(?-1)*3

这个sql语句就能实现每页显示3条信息的分页功能。

理解一下:select news_info.*from news_info 查询到的是表中所有的信息。

                    select rownum as r,t.*from (select news_info.*from news_info  )t where rownum<=?*3 控制每页查询到的信息数量

                    外面的r >(?-1)*3则实现“分”的功能,表示从哪一页开始。3表示每一页的新闻数量,?表示当前页码

                    个人理解是,里面的where控制每页的显示数量,外面的where控制从哪开始。

先看一张图片,方便理解:分页功能的实现

这是用户所能看到和操作的功能。要实现分页,需要知道两个变量即可,当前页pageNo和总页pageNums。为什么呢?

因为 首页即pageNo = 1;上一页即pageNo-1;下一页即pageNo+1;末页即pageNo=pageNums。

所以,接下来我们就要考虑怎么知道pageNo和pageNums,即可。

举个实例,要求实现新闻列表的分页显示功能。

分页的总页数不就是新闻的数量除以每页显示的新闻数量吗?新闻的数量即获取数据库表中行数,每页显示新闻的数量是固定的值,下面暂且赋值为3。注意:取余不为零就需要再给一页来显示新闻,即pageNums+1。

下面是获取数据库表中数据行数的sql语句:select count(*) from news_info;再用getInt(1)从结果集中取出来。这里的1理解为查询结果的列号为1。

pageNo我们都知道本身这个值从页面上是获取不到的,但是是从第一页开始的,所以我们可以判断是否为null,为null的话说明了,这一页就是第一页,赋值为1。然后,不为null,就从页面获取值,后一页即pageNo=${pageNo+1}   上一页即pageNo=${pageNo-1}。

基本方法上面都提及了。

下面送上我的项目实例:

jsp(c:when来控制视图显示):

<c:forEach items="${pageList}" var="pageList">
<li>
<a href='#'>${pageList.newsTitle}</a><span>
${pageList.newsDate}</span>
</li>
<li class='space'></li>
</c:forEach>
<p align="right">
<c:choose>
<c:when test="${pageNo>1}">
<a href="index.do">首页</a> 
<a href="index.do?pageNo=${pageNo-1}">上一页</a> 
</c:when>
</c:choose>
当前页数:[${pageNo}/${pageNums}] 
<c:choose>
<c:when test="${pageNo!=pageNums}">
<a href="index.do?pageNo=${pageNo+1}">下一页</a> 
<a href="index.do?pageNo=${pageNums}">末页</a>
</c:when>
</c:choose>
</p>

servlet:
int pageNums = 0;
int newNums = infoBiz.getNewsNums();
//总页数的算法,规定每页显示3条新闻
if (newNums%3==0) {
pageNums = newNums/3;
} else {
pageNums = newNums/3+1;
}
session.setAttribute("pageNums", pageNums);

String pageNo = null;
pageNo = request.getParameter("pageNo");