1. 程式人生 > >Java實現分頁效果

Java實現分頁效果

步驟

1.使用者發出請求,傳遞條件
2.SpringMVC獲取條件,資料庫查詢,傳回結果
3.ajax得到資料進行處理,最終呈現

HTML設計

<!---分頁查詢-->
                <div class="tab-pane active in " id="add-get-bill">
                <!--表格-->
                    <div>
                        <table class="table table-condensed table-hover table-striped"
id="viewPageTable" style="width: 100%;table-layout:fixed;word-wrap:break-word;font-size: 15px;">
<tr> <th hidden="hidden">id</th> <th width="200px">時間</th> <th
width="200px">
操作IP</th> <th width="200px">操作人</th> <th>操作內容</th> </tr> <tbody id="viewPageBody"></tbody> </table
>
</div> <!--分頁導航欄--> <div class="page_nav"> <span>總共<span id="pageTotalSizeLabel"></span></span> <button class="pageButton" value="firstPage">首頁</button> <button class="pageButton" value="pageUp">上一頁</button> <button class="pageButton" id="labOne"></button> <button class="pageButton" id="labTwo"></button> <button class="pageButton" id="labThree"></button> <button class="pageButton" id="labFour"></button> <button class="pageButton" id="labFive"></button> <button class="pageButton" value="pageDown">下一頁</button> <button class="pageButton" value="lastPage">尾頁</button> </div> </div>

java後臺獲取資料,進行分頁處理

/**
     * 查詢當月記錄
     * */
    @ResponseBody
    @RequestMapping(value = "/findLogPageMonth/{logMonth}/{pageNumber}",method = RequestMethod.GET,produces = "text/html;charset=UTF-8")
    public String findLogPageMonth(@PathVariable("logMonth")String logMonth,@PathVariable("pageNumber")int pageNumber,Map<Object,Object>map){
        try{
            int pageTotalNumber=0;      //資料記錄總條數
            int pageSize=0;             //總頁數
            int k = 0;                  //迴圈判斷條件
            List<EntityLog> entityLogList=null;
            List<EntityLog> entityLogListTwo=new ArrayList<>();
            entityLogList=userService.findLogMonth(logMonth);   //查詢取出該條件下資料庫所有記錄
            //得到總記錄數
            pageTotalNumber=entityLogList.size();
            //得到總頁數,每一頁10條記錄
            if(pageTotalNumber%10==0){
                pageSize=pageTotalNumber/10;
            }else{
                //有餘數,那麼總頁數要+1
                pageSize=pageTotalNumber/10+1;
            }
            //對頁面傳回的頁數進行判斷
            if(pageNumber<=pageSize) {
                /**
                 * 根據訪問的頁數,取得相應資料
                 * i:表示從哪裡開始取資料
                 * pageNumber*10:表示現在第幾條記錄
                 * */
                for (int i = pageNumber * 10 - 10; i < pageTotalNumber; i++, k++) {
                    if (k < 10) {
                        //把資料從原來List集合中,轉移到新的List集合
                        entityLogListTwo.add(entityLogList.get(i));
                    }
                }
                //把資訊放在map中,傳回使用者介面
                map.put("pageSize",pageSize);
                map.put("dataList", entityLogListTwo);
                map.put("RESULT_STATUS", "SUCCESS");
            }else {
                //超出總頁數,傳回錯誤資訊
                map.put("RESULT_STATUS","MORE_THAN_PAGENUMBER");
            }
        }catch (Exception e){
            e.printStackTrace();
            map.put("RESULT_STATUS","EXCEPTION");
        }
        return JSON.toJSONString(map);
    }

JQuery獲取資料

var pageTotalSize;
//操作日誌--製表
function findPageMakeTable(pageNumber) {
    //先清空原來table內容
    $("#viewPageTable  tr:not(:first)").html("");
    //得到table主體
    var tbody=window.document.getElementById("viewPageBody");
    if(pageNumber==1){
        //分頁導航欄--內容填寫
        $("#labOne").val(1).html(1);
        $("#labTwo").val(2).html(2);
        $("#labThree").val(3).html(3);
        $("#labFour").val(4).html(4);
        $("#labFive").val(5).html(5);
    }
    //請求獲取資料
    $.ajax({
        url: 'findLogPageMonth/'+'2017-08/'+pageNumber,
        type: 'GET',
        contentType: "application/json;charset-utf-8",
        dataType: 'text',
        data: {},
        success:function(data){
            //轉化資料格式
            var datalist =JSON.parse(data);
            //得到資料結果,進行一個判斷
            var RESULT_STATUS=datalist.RESULT_STATUS;
            if(pageNumber==pageTotalSize){
                $("#labOne").val(parseInt(pageTotalSize)-4).html(parseInt(pageTotalSize)-4);
                $("#labTwo").val(parseInt(pageTotalSize)-3).html(parseInt(pageTotalSize)-3);
                $("#labThree").val(parseInt(pageTotalSize)-2).html(parseInt(pageTotalSize)-2);
                $("#labFour").val(parseInt(pageTotalSize)-1).html(parseInt(pageTotalSize)-1);
                $("#labFive").val(parseInt(pageTotalSize)).html(parseInt(pageTotalSize));
            }
            if(RESULT_STATUS=="SUCCESS") {
                //取數資料記錄
                var emps = datalist.dataList;
                //得到資料記錄總數,儲存在全域性變數中
                pageTotalSize=datalist.pageSize;
                $("#pageTotalSizeLabel").html(pageTotalSize);
                var str = "";
                for (var i = 0; i < emps.length; i++) {
                    str += "<tr>" +
                        "<td hidden='hidden'>" + i + "</td>" +
                        "<td >" + emps[i].logTime + "</td>" +
                        "<td>" + emps[i].logIp + "</td>" +
                        "<td>" + emps[i].logName + "</td>" +
                        "<td>" + emps[i].logDesc + "</td>" +
                        "</tr>";
                }
                //表格內容填寫
                tbody.innerHTML = str;
            }else if(RESULT_STATUS=="EXCEPTION"){
                alert("資料後臺異常!");
            }else if(RESULT_STATUS=="MORE_THAN_PAGENUMBER"){
                alert("超出最大頁數!");
            }
        }
    });
}

$("#li-threety").click(function () {
    //首次進入頁面--預設獲取第一頁記錄
    findPageMakeTable(1);
});

//之後為button點選事件,獲取其他頁面記錄
$(".pageliststy").click(function () {
    //得到這個button的值
    var thisValue=$(this).val();
    if(thisValue=="firstPage"){             //首頁
        alert("已經是第一頁!");
        findPageMakeTable(1);
    }
    else if(thisValue=="lastPage"){         //尾頁
        alert("已經是最後一頁!");
        findPageMakeTable(parseInt(pageTotalSize));
    }
    else if(thisValue=="pageUp"){           //上一頁
        var valueBackSize=$(this).next().val();
        if(valueBackSize==1){
            alert("已經是第一頁!");
            findPageMakeTable(1);
        }else{
            findPageMakeTable(parseInt(valueBackSize)-1);
            $("#labOne").val(parseInt(valueBackSize)-1).html(parseInt(valueBackSize)-1);
            $("#labTwo").val(parseInt(valueBackSize)).html(parseInt(valueBackSize));
            $("#labThree").val(parseInt(valueBackSize)+1).html(parseInt(valueBackSize)+1);
            $("#labFour").val(parseInt(valueBackSize)+2).html(parseInt(valueBackSize)+2);
            $("#labFive").val(parseInt(valueBackSize)+3).html(parseInt(valueBackSize)+3);
        }
    }
    else if(thisValue=="pageDown"){         //下一頁
        var valuePreSize=$(this).prev().val();
        if(valuePreSize==pageTotalSize){
            alert("已經是最後一頁!");
            findPageMakeTable(parseInt(pageTotalSize));
        }else{
            findPageMakeTable(parseInt(valuePreSize)+1);
            $("#labOne").val(parseInt(valuePreSize)-3).html(parseInt(valuePreSize)-3);
            $("#labTwo").val(parseInt(valuePreSize)-2).html(parseInt(valuePreSize)-2);
            $("#labThree").val(parseInt(valuePreSize)-1).html(parseInt(valuePreSize)-1);
            $("#labFour").val(parseInt(valuePreSize)).html(parseInt(valuePreSize));
            $("#labFive").val(parseInt(valuePreSize)+1).html(parseInt(valuePreSize)+1);
        }
    }else{                                  //中間數值點選
        findPageMakeTable(thisValue);
    }
});

效果截圖

這裡寫圖片描述

總結

今天在做專案的時候遇見這個坎兒,以前並沒有做過分頁查詢,只有自己分析邏輯,只要思路清晰,最終肯定是能行的,中途遇見一些問題再慢慢解決。以上程式碼是Version 1.0版本,只是把功能實現了,並沒有再考慮整麼設計更合理。樓主是初學者,還請大神們多多指點!

以上是在Controller中分頁處理,先取出該條件下所有記錄,再在這個總集合中取出相應資料。而以下是我對上次程式碼進行了改進,在資料庫查詢時只查詢第幾頁的記錄,而不是全部取出

Version 2.0思路

建立一個javaBean類,單獨作為分頁處理類,包括以下屬性:

    private int pageNumber;         //當前頁數,從前端獲取
    private int pageTotalNumber;    //總記錄條數
    private int totalPage;          //總頁數
    private int pageSize;           //每頁記錄條數

    private List<T> countList;      //每頁記錄

    private int firstNumber;        //分頁導航欄--第一個顯示的頁碼
    private int lastNumber;        //分頁導航欄--最後一個顯示的頁碼

    private String findInfo;        //查詢結果

然後在daoImpl類中,查詢後返回的是javaBean類物件,把查詢結果封裝在這個物件中,在Controller中直接 get 結果,把結果傳回給前臺。下面是詳細步驟:

javaBean類設計

package com.SystemMag.entity;

import java.util.List;

/**
 * 分頁處理
 */
public class PageCompute<T> {
    private int pageNumber;         //當前頁數,從前端獲取
    private int pageTotalNumber;    //總記錄條數
    private int totalPage;          //總頁數
    private int pageSize;           //每頁記錄條數

    private List<T> countList;      //每頁記錄

    private int firstNumber;        //分頁導航欄--第一個顯示的頁碼
    private int lastNumber;        //分頁導航欄--最後一個顯示的頁碼

    private String findInfo;        //查詢結果

    public PageCompute(){}
    //構造器傳入引數,分頁導航欄顯示頁碼計算
    public PageCompute(int pageNumber,int pageTotalNumber,int pageSize){
        this.pageNumber=pageNumber;
        this.pageTotalNumber=pageTotalNumber;
        this.pageSize=pageSize;
        //獲取總頁數
        if(pageTotalNumber%pageSize==0){
            this.firstNumber=1;
            this.totalPage=pageTotalNumber/pageSize;
        }else{
            //有餘數,那麼總頁數要+1
            this.totalPage=pageTotalNumber/pageSize+1;
        }

        //分頁導航欄--頁碼顯示處理,這裡顯示5個頁碼
        if(totalPage<=5){
            //如果總頁數小於或等於5頁,令最後一個頁碼為總頁碼
            this.lastNumber=this.totalPage;
        }else{
            //以中間頁碼顯示為準
            this.firstNumber=pageNumber-2;
            this.lastNumber=pageNumber+2;
            //排除兩種特殊情況
            if(this.firstNumber<=0){
                this.firstNumber=1;
                this.lastNumber=5;
            }
            if(this.lastNumber>=this.totalPage){
                this.firstNumber=totalPage-4;
                this.lastNumber=totalPage;
            }
        }
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getTotalPage() {

        return totalPage;
    }

    public void setFirstNumber(int firstNumber) {
        this.firstNumber = firstNumber;
    }

    public void setLastNumber(int lastNumber) {
        this.lastNumber = lastNumber;
    }

    public int getFirstNumber() {

        return firstNumber;
    }

    public int getLastNumber() {
        return lastNumber;
    }

    public void setPageTotalNumber(int pageTotalNumber) {

        this.pageTotalNumber = pageTotalNumber;
    }

    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
    }

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

    public void setCountList(List<T> countList) {
        this.countList = countList;
    }

    public int getPageTotalNumber() {

        return pageTotalNumber;
    }

    public int getPageNumber() {
        return pageNumber;
    }

    public int getPageSize() {
        return pageSize;
    }

    public List<T> getCountList() {
        return countList;
    }

    public void setFindInfo(String findInfo) {
        this.findInfo = findInfo;
    }

    public String getFindInfo() {

        return findInfo;
    }

    @Override
    public String toString() {
        return "PageCompute{" +
                "pageNumber=" + pageNumber +
                ", pageTotalNumber=" + pageTotalNumber +
                ", totalPage=" + totalPage +
                ", pageSize=" + pageSize +
                ", countList=" + countList +
                ", firstNumber=" + firstNumber +
                ", lastNumber=" + lastNumber +
                ", findInfo='" + findInfo + '\'' +
                '}';
    }
}

daoImpl類中–查詢記錄

@SuppressWarnings("unchecked")
    public PageCompute<EntityLog> findLogPageMonth(String logMonth, int pageNumber)throws ExceptionCountents {
        int pageSize=10;            //每頁10條記錄
        int pageTotalNumber=0;

        String jpql="FROM EntityLog log where log.logTime like'%"+logMonth+"%'";

        Query query = entityManager.createQuery(jpql);
        //第一次查詢,獲取總記錄數
        pageTotalNumber=query.getResultList().size();
        //初始化構造器,傳遞引數
        PageCompute<EntityLog> pageCompute=new PageCompute<>(pageNumber,pageTotalNumber,pageSize);
        if(pageTotalNumber!=0){
            query.setFirstResult(pageNumber*pageSize-pageSize);       //設定從哪裡開始查詢
            query.setMaxResults(pageSize);      //設定查詢多少條記錄
            //第二次查詢,獲取指定頁碼的記錄
            pageCompute.setCountList(query.getResultList());
            pageCompute.setFindInfo("SUCCESS");
        }else{
            pageCompute.setFindInfo("NODATA");
        }
        return pageCompute;
    }

serviceImpl–傳遞結果

@Transactional
    @SuppressWarnings("unchecked")
    public PageCompute<EntityLog> findLogPageMonth(String logMonth, int pageNumber)throws Exception{
      return  userDAO.findLogPageMonth(logMonth,pageNumber);
    }

Controller–獲取結果,傳遞給前臺

    /**
     * 查詢當月記錄
     * */
    @ResponseBody
    @RequestMapping(value = "/findLogPageMonth/{logMonth}/{pageNumber}",method = RequestMethod.GET,produces = "text/html;charset=UTF-8")
    public String findLogPageMonth(@PathVariable("logMonth")String logMonth,@PathVariable("pageNumber")int pageNumber,Map<Object,Object>map){
        try{
            PageCompute<EntityLog> entityLogList=null;
            entityLogList=userService.findLogPageMonth(logMonth,pageNumber);
            if(entityLogList.getFindInfo().equals("SUCCESS")) {
                map.put("totalPage", entityLogList.getTotalPage());//記錄總頁數
                map.put("entityLogList", entityLogList.getCountList());//記錄
                map.put("firstNumber", entityLogList.getFirstNumber());//第一頁
                map.put("lastNumber", entityLogList.getLastNumber());//最後一頁
                map.put("RESULT_STATUS", "SUCCESS");
            }else{
                map.put("RESULT_STATUS", "NODATA");
            }
        }catch (Exception e){
            e.printStackTrace();
            map.put("RESULT_STATUS","EXCEPTION");
        }
        return JSON.toJSONString(map);
    }

js獲取資料–事件觸發+顯示處理

var pageTotalSize;
//操作日誌--製表
function findPageMakeTable(pageNumber) {
    //先清空原來table內容
    $("#viewPageTable  tr:not(:first)").html("");
    //得到table主體
    var tbody=window.document.getElementById("viewPageBody");
    //請求獲取資料
    $.ajax({
        url: 'findLogPageMonth/'+'2017-08/'+pageNumber,
        type: 'GET',
        contentType: "application/json;charset-utf-8",
        dataType: 'text',
        data: {},
        success:function(data){
            var firstNumber,lastNumber;
            var str = "";
            //轉化資料格式
            var datalist =JSON.parse(data);
            //得到資料結果,進行一個判斷
            var RESULT_STATUS=datalist.RESULT_STATUS;
            if(RESULT_STATUS=="SUCCESS") {
                //取數資料記錄
                var emps = datalist.entityLogList;
                //得到資料記錄總頁數,儲存在全域性變數中
                pageTotalSize=datalist.totalPage;
                firstNumber=datalist.firstNumber;
                lastNumber=datalist.lastNumber;
                $("#pageTotalSizeLabel").html(pageTotalSize);
                $("#pageNowLabel").html(pageNumber);

                if(pageTotalSize<5){
                    for(var i=1;i<=pageTotalSize;i++){
                        $("#lab"+i).val(parseInt(i)).html(parseInt(i));
                        if(i==pageTotalSize){
                            for(var j=pageTotalSize+1;j<=5;j++){
                                $("#lab"+j).css("display","none");
                            }
                        }
                    }
                    $("#pageUp").css("display","none");
                    $("#pageDown").css("display","none");
                }else{
                    $(".pageliststy").css("display","initial"); //刪除導航欄css效果
                    $("#lab1").val(parseInt(firstNumber)).html(parseInt(firstNumber));
                    $("#lab2").val(parseInt(firstNumber)+1).html(parseInt(firstNumber)+1);
                    $("#lab3").val(parseInt(firstNumber)+2).html(parseInt(firstNumber)+2);
                    $("#lab4").val(parseInt(firstNumber)+3).html(parseInt(firstNumber)+3);
                    $("#lab5").val(parseInt(lastNumber)).html(parseInt(lastNumber));
                }

                for (var i = 0; i < emps.length; i++) {
                    str += "<tr>" +
                        "<td hidden='hidden'>" + emps[i].logId + "</td>" +
                        "<td >" + emps[i].logTime + "</td>" +
                        "<td>" + emps[i].logIp + "</td>" +
                        "<td>" + emps[i].logName + "</td>" +
                        "<td>" + emps[i].logDesc + "</td>" +
                        "</tr>";
                }
                //表格內容填寫
                tbody.innerHTML = str;
            }else if(RESULT_STATUS=="EXCEPTION"){
                alert("資料後臺異常!");
            }else if(RESULT_STATUS=="NODATA"){
                alert("暫無資料!");
            }
        }
    });
}

$("#li-threety").click(function () {
    //進入頁面預設獲取第一條記錄
    findPageMakeTable(1);
});

//button點選事件
$(".pageliststy").click(function () {
    //得到這個button的值
    var thisValue=$(this).val();
    if(thisValue=="firstPage"){             //首頁
        findPageMakeTable(1);
    }
    else if(thisValue=="lastPage"){         //尾頁
        findPageMakeTable(parseInt(pageTotalSize));
    }
    else if(thisValue=="pageUp"){           //上一頁
        var valueBackSize=$(this).next().val();
        if(valueBackSize==1){
            findPageMakeTable(1);
        }else{
            findPageMakeTable(parseInt(valueBackSize)-1);
        }
    }
    else if(thisValue=="pageDown"){         //下一頁
        var valuePreSize=$(this).prev().val();
        if(valuePreSize==pageTotalSize){
            findPageMakeTable(parseInt(pageTotalSize));
        }else{
            findPageMakeTable(parseInt(valuePreSize)+1);
        }
    }else{                              //中間數值點選
        findPageMakeTable(thisValue);
    }
});

jsp頁面–顯示

<!---分頁查詢-->
                <div class="tab-pane active in " id="add-get-bill">
                    <div>
                        <table class="table table-condensed table-hover table-striped" id="viewPageTable" style="width: 100%;table-layout:fixed;word-wrap:break-word;font-size: 15px;">
                            <tr>
                                <th hidden="hidden">id</th>
                                <th width="200px">時間</th>
                                <th width="200px">操作IP</th>
                                <th width="200px">操作人</th>
                                <th>操作內容</th>
                            </tr>
                            <tbody id="viewPageBody"></tbody>
                        </table>
                    </div>
                    <div class="page_nav">
                        <span>總共<span id="pageTotalSizeLabel"></span></span>
                        <span>當前<span id="pageNowLabel"></span></span>
                        <button class="pageliststy" value="firstPage">首頁</button>
                        <button class="pageliststy" value="pageUp" id="pageUp">上一頁</button>
                        <button class="pageliststy" id="lab1"></button>
                        <button class="pageliststy" id="lab2"></button>
                        <button class="pageliststy" id="lab3"></button>
                        <button class="pageliststy" id="lab4"></button>
                        <button class="pageliststy" id="lab5"></button>
                        <button class="pageliststy" value="pageDown" id="pageDown">下一頁</button>
                        <button class="pageliststy" value="lastPage">尾頁</button>
                    </div>
                </div>

結果與上次一樣,這是Version 2.0程式碼,如果後面還有更好的方法,還會繼續更新!