首页 > 现在我已经将数据全部查询出来并在页面显示了,在这个前提下 我怎么把已经查询出来的数据 分页

现在我已经将数据全部查询出来并在页面显示了,在这个前提下 我怎么把已经查询出来的数据 分页

内容已经在jsp页面 显示出来了
现在是单纯的 把已经查询出来的98条数据 做个分页


这样的话你可以看看jquery easyui的客户端分页。


hibernate自带了支持多数据库的分页,或者你也可以写一个Page类在后台获取数据的时候就分页。网上也有很多分页算法,例如:百度的分页,google的分页。然后前台就好做了,只是让分页的内容显示出来就可以。
以下是百度分页算法参考:

public class BaiduPage {
    /**
     * 数据库一共多少行
     */
    private int rowCount;
    /**
     * 数据库查询其实行
     */
    private int startRow;
    /**
     * 当前页面导航序号
     */
    private int num;
    /**
     * 一页查询多少行
     */
    private int pageSize=10;
    /**
     * 一共有多少导航
     */
    private int navCount;
    /**
     * 上一页
     */
    private int prev;
    /**
     * 下一页
     */
    private int next;
    /**
     * 首页
     */
    private int first=1;
    /**
     * 尾页
     */
    private int last;
    /**
     *显示导航的起始
     */
    private int begin ;
    /**
     * 显示导航的结束
     */
    private int end;
    public BaiduPage() {
        super();
    }
    
    /**
     * @param rowCount
     * @param num
     * @param pageSize
     */
    public BaiduPage(int rowCount, int num, int pageSize) {
        super();
        //查询到的行数
        this.rowCount = rowCount;
        //每页显示数量
        this.pageSize = pageSize;
        //导航页面数=(向上取整)(行数/每页显示数量)
        this.navCount=(int) Math.ceil(this.rowCount*1.0/this.pageSize);
        this.last=this.navCount;
        //小于最小值 显示为第一页
        this.num =  Math.max(this.first, num);
        //大于最大值 显示为最后一页
        this.num=Math.min(this.last, num);
        //当前页面显示的起始行 =(当前页面-1)*10且大于等于0
        this.startRow=Math.max(0,(this.num-1)*this.pageSize);
        
        this.prev=Math.max(this.first, (this.num-1));
        this.next=Math.min(this.last, this.num+1);
        //显示导航的起始 小于10从第一页显示,大于10只显示10页
        this.begin=(this.num-this.first)<=10?this.first:(this.num-10);
        //显示导航的结束 小于9显示到最后一页,大于9显示9页
        this.end=(this.last-this.num)<9?this.last:(this.num+9);
    }
    public int getRowCount() {
        return rowCount;
    }
    public void setRowCount(int rowCount) {
        this.rowCount = rowCount;
    }
    public int getStartRow() {
        return startRow;
    }
    public void setStartRow(int startRow) {
        this.startRow = startRow;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getNavCount() {
        return navCount;
    }
    public void setNavCount(int navCount) {
        this.navCount = navCount;
    }
    public int getPrev() {
        return prev;
    }
    public void setPrev(int prev) {
        this.prev = prev;
    }
    public int getNext() {
        return next;
    }
    public void setNext(int next) {
        this.next = next;
    }
    public int getFirst() {
        return first;
    }
    public void setFirst(int first) {
        this.first = first;
    }
    public int getLast() {
        return last;
    }
    public void setLast(int last) {
        this.last = last;
    }
    public int getBegin() {
        return begin;
    }
    public void setBegin(int begin) {
        this.begin = begin;
    }
    public int getEnd() {
        return end;
    }
    public void setEnd(int end) {
        this.end = end;
    }    
}

以下是Google分页算法参考:

import java.util.List;

/**
 * google 和baidu不同之处在于google只显示10页导航
 * @author Administrator
 *
 */
public class GooglePage {
    /**
     * 数据库一共多少行
     */
    private int rowCount;
    /**
     * 数据库查询其实行
     */
    private int startRow;
    /**
     * 当前页面导航序号
     */
    private int num;
    /**
     * 一页查询多少行
     */
    private int pageSize=10;
    /**
     * 一共有多少导航
     */
    private int navCount;
    /**
     * 上一页
     */
    private int prev;
    /**
     * 下一页
     */
    private int next;
    /**
     * 首页
     */
    private int first=1;
    /**
     * 尾页
     */
    private int last;
    /**
     *显示导航的起始
     */
    private int begin ;
    /**
     * 显示导航的结束
     */
    private int end;
    /**
     * 控制导航显示数量
     */
    private int navNum;
    
    private List pageData;
    
    public GooglePage() {
        super();
    }
    
    /**
     * @param rowCount
     * @param num
     * @param pageSize
     */
    public GooglePage(int rowCount, int num, int pageSize,int navNum) {
        super();
        //查询到的行数
        this.rowCount = rowCount;
        //每页显示数量
        this.pageSize = pageSize;
        //导航页面数=(向上取整)(行数/每页显示数量)
        this.navCount=(int) Math.ceil(this.rowCount*1.0/this.pageSize);
        this.last=this.navCount;
        //小于最小值 显示为第一页
        this.num =  Math.max(this.first, num);
        //大于最大值 显示为最后一页
        this.num=Math.min(this.last, num);
        //当前页面显示的起始行 =(当前页面-1)*10且大于等于0
        this.startRow=Math.max(0,(this.num-1)*this.pageSize);
        
        this.prev=Math.max(this.first, (this.num-1));
        this.next=Math.min(this.last, this.num+1);
        //显示导航的起始 
//        this.begin=(this.num-this.first)<=10?this.first:(this.num-10);
        //显示导航的结束 小于9显示到最后一页,大于9显示9页
//        this.end=(this.last-this.num)<9?this.last:(this.num+9);
        this.navNum=navNum;
        //google 如果显示10个,前5后4
        this.begin=Math.max(this.first, this.num-this.navNum/2);
        this.end=Math.min(this.last, this.begin+this.navNum-1);
        //如果begin到end不够10个,显示后10个
        if ((this.end-this.begin)<(this.navNum-1)) {
            this.begin=Math.max(this.first, this.last-this.navNum+1);
        }        
    }
    public int getRowCount() {
        return rowCount;
    }
    public void setRowCount(int rowCount) {
        this.rowCount = rowCount;
    }
    public int getStartRow() {
        return startRow;
    }
    public void setStartRow(int startRow) {
        this.startRow = startRow;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getNavCount() {
        return navCount;
    }
    public void setNavCount(int navCount) {
        this.navCount = navCount;
    }
    public int getPrev() {
        return prev;
    }
    public void setPrev(int prev) {
        this.prev = prev;
    }
    public int getNext() {
        return next;
    }
    public void setNext(int next) {
        this.next = next;
    }
    public int getFirst() {
        return first;
    }
    public void setFirst(int first) {
        this.first = first;
    }
    public int getLast() {
        return last;
    }
    public void setLast(int last) {
        this.last = last;
    }
    public int getBegin() {
        return begin;
    }
    public void setBegin(int begin) {
        this.begin = begin;
    }
    public int getEnd() {
        return end;
    }
    public void setEnd(int end) {
        this.end = end;
    }

    public int getNavNum() {
        return navNum;
    }

    public void setNavNum(int navNum) {
        this.navNum = navNum;
    }

    public List getPageData() {
        return pageData;
    }

    public void setPageData(List pageData) {
        this.pageData = pageData;
    }
    
}

为啥要全部一次性加载出来。。。

就算你全部加载出来了,你可以把数据放在jsp的一个变量里,分页的时候从那里拿数据。但是太蠢了,为什么不分页提取数据呢?


你在servlet里面获得数据库的条数,按照你的设计每页显示多少条数据和第几页,这两个参数,选出你要得到的数据,再发给页面,然后页面显示。


jtable


可以使用 一些 成熟的分页第三方代码库。如果第一次拿出来全部的数据。可使用bootstarp-tables类似于这样的代码库来分页,但是这样只是把数据在前端进行分页。并不好,应该在取数据时就分页。


分页就是sql语句中的limit a, b 你把这两个参数传递到Dao层,分页查数据库就可以了,你要是有100万数据,难道一次全查出来么?页面展示的也就最多20条数据吧,所以分页是必须要做的。

分页在controller层实现,然后调用service中的方法查询,并对查询的结果处理,具体的查询,由service层调dao层来执行。

【热门文章】
【热门文章】