JSP开发业务应用分页显示

11 篇文章 0 订阅
1 篇文章 0 订阅

JSP分页显示数据

分页实现

实现分页的方式有多种,例如将所有的查询结果以集合等形式保存在内存中,翻页时从中取出一页所需要的数据显示。这种方式有两个主要缺点;一是用户看到的可能是过期的数据;二是如果数据量非常大,查询一次数据集会耗费很长时间,并且存储的数据也会占用大量内存开销。
另一种做法是每次翻页时只从数据库检索出本页需要的数据。虽然每次翻页都查询数据库,但查询出的记录结果相对较少,总体开销不大,再配以连接池技术及其其他查询优化,可以达到比较高的效率。下面以mysql数据库为后台数据库,以分页实现并且显示分页数据。
不同数据库厂商实现分页的SQl语句之间存在差异,因此在实际应用中根据数据库的不同,需要修改相应的SQL语句。
实现数据的分页显示,需要以下几个关键步骤:
(1) 确定每页显示的数据数量。
(2) 计算显示的总页数。
(3) 编写SQL语句。

后台

1.确定每页显示的数据数量
根据实际页面设计,确定在数据列表中每次显示多少条记录,即每次从数据库中需要查询出多少条记录用于页面显示,通常这个数量可以在开发时定义好,也可以由用户来选择。
2.计算显示的页数
既然要进行分页显示,还需要清楚按照每页显示的记录数量总共会产生多少页数据。在页面中显示的记录数量是已知的,而数据库中符合展示条件的记录总数是未知的,因此要想得到总页数,需要经过以下几个步骤。

(1) 通过查询获取符合展示条件的总记录,可以借助count()聚合函数实现,
(2) 有了需要展示的记录总数后,就可以根据每页显示的记录条数计算共需要划分多少页。基于方便代码管理的考虑,将有关分页的数据分装到一个Page类中,其中包括每页显示的数据数量,数据的总数量,显示的总页数,当前的页码,每页显示的数据集合。

类:

package org.news.util;

import java.util.List;
import org.news.entity.News;

public class Page {
    // 总页数
    private int totalPageCount = 0;
    // 页面大小,即每页显示记录数
    private int pageSize = 5;
    // 记录总数
    private int totalCount;
    // 当前页码
    private int currPageNo = 1;
    // 每页新闻集合
    private List<News> newsList;

    public int getCurrPageNo() {
        if (totalPageCount == 0)
            return 0;
        return currPageNo;
    }

    public void setCurrPageNo(int currPageNo) {
        if (currPageNo > 0)
            this.currPageNo = currPageNo;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        if (pageSize > 0)
            this.pageSize = pageSize;
    }

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        if (totalCount > 0) {
            this.totalCount = totalCount;
            // 计算总页数
            totalPageCount = this.totalCount % pageSize == 0 ? (this.totalCount / pageSize)
                    : (this.totalCount / pageSize + 1);
        }
    }

    public int getTotalPageCount() {
        return totalPageCount;
    }

    public void setTotalPageCount(int totalPageCount) {
        this.totalPageCount = totalPageCount;
    }

    public List<News> getNewsList() {
        return newsList;
    }

    public void setNewsList(List<News> newsList) {
        this.newsList = newsList;
    }
}

3.编写SQl语句
实现数据分页显示的关键是如何编写SQl查询语句,MySQL数据库中,可以使用LIMT字句实现分页需求。假如每页显示三条记录,若要是显示第一页记录,则SQL语句如下:

select * from news LIMIT 0,3

这段语句中limit的字句的两个参数分别代表起始行偏移量和最大返回行数。最大返回行数相当于每页显示的记录数,是一个固定值,而每页数据起始行的偏移量是动态的,应该如何确定呢?假设每条显示三条,取第一页数据时,不需要偏移,即起始偏移是0;而第二页则偏移是在3条之后才能取得值;第三条就是偏移2*3条记录。所以我们可以得出一个结论。
起始偏移量 = (当前页页码数-1) * 每页显示的记录数

所以SQL语句可以这样进行表示:select * from news limit (当前页页码-1)*每页显示的记录数,每页现实的记录数

剩下的就是dao层的逻辑了。

前台

在分页功能测试成功之后,下面获取数据在jsp页面进行显示。
首先分析在JSP页面中如何进行分页的设置。

(1) 确定当前的页:试想一下,当页面打开的时候,应该显示第几页?肯定是第一页,但如果页面时通过用户点击分页执行查询后显示的结果,当前的页码还是第一页吗?答案是不确定的,所以我们需要在请求的时候设置一个pageindex 变量用来表示当前的页码。如果这个变量不存在,则默认当前页为第一页;否则当前页为pageIndex变量的值。

<%
 String pageIndex = request.getParameter("pageIndex");// 获得当前页数
                if (pageIndex == null
                        || (pageIndex = pageIndex.trim()).length() == 0) {
                    pageIndex = "1";
                }
                int currPageNo = Integer.parseInt(pageIndex);

%>

(2) 分页的设置:有了当前页,就可以通过当前页码来确定首页,上一页和下一页以及末页的页码。注意:在设置分页时,需要将对应的页码作为请求参数pageindex的值进行传递。index.jsp页面生成分页操作连接的代码如下:

<%
 int totalPages = pageObj.getTotalPageCount();     //总页数
    int pageIndex = pageObj.getCurrPageNo();          //当前页码
%>

.......//省略其他

<p align="center"> 当前页数:[<%=pageIndex%>/<%=totalPages%>]&nbsp;
     
          <a href=".....&pageIndex=1">首页</a>&nbsp;
          <a href="........&pageIndex=<%=pageIndex-1%>">上一页</a>
      <%}
      if (pageIndex < totalPages) {//控制页面显示风格
      %>
          <a href=".........&pageIndex=<%=pageIndex+1%>">下一页</a>
          <a href="...........&pageIndex=<%=totalPages%>">末页</a> 
      <%}%></p>

在这种情况下如果当前页已经是第一页或者是最后一页,name当用户单击上一页或者下一页时,页面该如何显示?显然,当前页码不能小于第一页,而下一页不能大于最末页,所以还要进行控制。

(3) 首页与末页的控制。首页与末页控制的原理很简单,当在JSP获取pageIndex变量时,首先将其与首页和末页进行比较判断。如果pageIndex变量的值小于1,则将值修改为1。如果pageIndex变量的值大于末页(即总页数),则值修改为末页页码。从而避免页码出现-1或者大于总页数的情况,代码如下。

	<p align="center"> 当前页数:[<%=pageIndex%>/<%=totalPages%>]&nbsp;
      <%
      if (pageIndex > 1) { //控制页面显示风格
      %>   
          <a href="........&pageIndex=1">首页</a>&nbsp;
          <a href="........&pageIndex=<%=pageIndex-1%>">上一页</a>
      <%}
      if (pageIndex < totalPages) {//控制页面显示风格
      %>
          <a href="........&pageIndex=<%=pageIndex+1%>">下一页</a>
          <a href=".........&pageIndex=<%=totalPages%>">末页</a> 
      <%}%></p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值