jquery+Ajax實現簡單分頁條效果

本文實例為大傢分享瞭jquery+Ajax實現分頁條效果的具體代碼,供大傢參考,具體內容如下

一、如果是jsp頁面的話,可以用EL表達式和JSTL標簽制作一個分頁條,沒有什麼難度。用EL表達式和JSTL標簽實現的缺點就是無法實現異步效果,整個頁面是重新刷新瞭一遍的。

二、如果是普通的html頁面,當然是無法使用EL表達式和JSTL標簽的,這時隻能通過異步Ajax的方式去實現。當然瞭,JSP頁面兩種方式都是可以使用的。

三、分頁條,這裡我是用Ajax和Jquery去做的。實現起來比較繁瑣,代碼特別長,因為都是拼接一大堆的字符串,然後使用html()方法或是append()方法去改變文檔的內容。

四、事前分析

瀏覽器端需要發送給服務器端的參數有兩個:

①當前的頁碼currentPage;
②頁面的大小(一頁顯示幾條記錄)pageSize。

服務器端給瀏覽器端發送的是Json格式的數據,也就是一個頁面實體類PageBean。其中PageBean有如下字段:

①總記錄數totalCount;
②總頁碼totalPage;
③每頁的數據 List list;
④當前頁碼currentPage;
⑤每頁顯示的記錄數pageSize。

這個PageBean支持泛型,代碼如下:

public class PageBean<T> 
{
    private int totalCount; // 總記錄數
    private int totalPage ; // 總頁碼
    private List<T> list ; // 每頁的數據
    private int currentPage ; //當前頁碼
    private int rows;//每頁顯示的記錄數,也就是pageSize

    public int getTotalCount() 
    {
        return totalCount;
    }

    public void setTotalCount(int totalCount)
    {
        this.totalCount = totalCount;
    }

    public int getTotalPage() 
    {
        return totalPage;
    }

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

    public List<T> getList() 
    {
        return list;
    }

    public void setList(List<T> list) 
    {
        this.list = list;
    }

    public int getCurrentPage() 
    {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) 
    {
        this.currentPage = currentPage;
    }

    public int getRows() 
    {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    @Override
    public String toString() 
    {
        return "PageBean{" +
                "totalCount=" + totalCount +
                ", totalPage=" + totalPage +
                ", list=" + list +
                ", currentPage=" + currentPage +
                ", rows=" + rows +
                '}';
    }
}

要想做到分頁,肯定要用到SQL語句中的“limit”。舉個例子說明一下含義。

select * from student limit 2,5;

具體含義:從student表當中查詢數據,從索引為“2”的記錄開始查詢,往後查5條。

索引是從0開始的,所以上面的語句相當於查詢瞭第3、第4、第5、第6、第7條記錄,總共5條記錄。

總而言之,第一個數字就是“從哪開始查”的意思,第二個數字就是“往後查幾條”的意思。

這裡的“從哪開始查”,需要計算出來。公式如下:

(currentPage-1)×pageSize

也就是當前頁碼減去一,括號,在乘以頁面大小。

所以查詢語句的偽代碼如下:

select * from student limit (currentPage-1)×pageSize,pageSize;

對於總頁碼totalPage,可以通過總記錄數totalCount和頁面大小pageSize計算出來。代碼如下:

totalPage=totalCount%pageSize==0?totalCount/pageSize:(totalCount/pageSize+1);

五、服務器端主要代碼

import com.fasterxml.jackson.databind.ObjectMapper;
import domain.PageBean;
import domain.RainFall;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import util.JDBCUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/ViewRainByPageServlet")
public class ViewRainByPageServlet extends HttpServlet
{
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="select * from rain_fall limit ?,?";//查詢部分元組
        String sql2="select * from rain_fall";//查詢所有元組
        List<RainFall> countList = template.query(sql2, new BeanPropertyRowMapper<RainFall>(RainFall.class));
        int totalCount=countList.size();//從數據庫獲取總記錄數
        int totalPage;//先聲明一下總的頁碼,總的頁碼需要根據客戶端發送過來的數據進行計算

        String currentPage = request.getParameter("currentPage");
        String pageSize = request.getParameter("pageSize");
        int intCurrentPage = Integer.parseInt(currentPage);//用戶發來的當前頁碼
        if(intCurrentPage==0)//用戶點擊上一頁按鈕,currentPage就減1,會出現減到0的情況
        {
            intCurrentPage=1;//如果用戶的currentPage=0,直接把頁碼設為1,把第一頁的數據返回給客戶端
        }

        int intPageSize = Integer.parseInt(pageSize);//用戶發來的頁面大小
        totalPage=totalCount%intPageSize==0?totalCount/intPageSize:(totalCount/intPageSize+1);//計算出總的頁數
        if(intCurrentPage>totalPage)//用戶點擊下一頁按鈕,currentPage就加1,會出現大於總頁數的情況
        {
            intCurrentPage=totalPage;//把當前頁碼設為總頁數
        }

        int startIndex=(intCurrentPage-1)*intPageSize;//從索引為幾的記錄開始查詢?

        List<RainFall> list = template.query(sql, new BeanPropertyRowMapper<RainFall>(RainFall.class),startIndex,intPageSize);
        ObjectMapper mapper=new ObjectMapper();
        response.setContentType("application/json;charset=utf-8");//設置響應數據類型和字符編碼
        PageBean<RainFall> pageBean=new PageBean<>();//創建PageBean對象
        //封裝PageBean對象
        pageBean.setTotalCount(totalCount);
        pageBean.setTotalPage(totalPage);
        pageBean.setList(list);
        pageBean.setCurrentPage(intCurrentPage);
        pageBean.setRows(intPageSize);
        //將數據寫回客戶端
        System.out.println(pageBean);
        mapper.writeValue(response.getOutputStream(),pageBean);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {

        this.doPost(request, response);

    }
}

六、前端代碼(很長)

<%--
  Created by Yingyong Lao.
  User: laoyingyong
  Date: 2019-12-10
  Time: 19:28
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>查看降雨信息</title>
    <!-- 1. 導入CSS的全局樣式 -->
    <link href="css/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery導入,建議使用1.9以上的版本 -->
    <script src="js/jquery-2.1.0.min.js"></script>
    <!-- 3. 導入bootstrap的js文件 -->
    <script src="js/bootstrap.min.js"></script>
    <script>
        $(function () //入口函數
        {
            $.post("ViewRainByPageServlet",{currentPage:1,pageSize:5},function (data)//頁面加載完成之後發送ajax請求,請求前5條記錄,完成界面的初始化
            {
               var totalCount=data.totalCount;//總記錄數
               var totalPage=data.totalPage;//總頁數
               var currentPage=data.currentPage;//當前頁碼

                if(currentPage==1)//如果當前頁碼為1,用戶還點擊上一頁的話,設置class="disabled" ,即出現一個“禁用”圖標
                {
                    var str=' <li class="disabled" οnclick="findByPage('+(currentPage-1)+',5)">\n' +
                        '                    <a href="#" aria-label="Previous">\n' +
                        '                        <span aria-hidden="true">&laquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>';

                }
                else//否則上一頁的按鈕就是正常的樣式
                {
                    var str=' <li οnclick="findByPage('+(currentPage-1)+',5)">\n' +
                        '                    <a href="#" aria-label="Previous">\n' +
                        '                        <span aria-hidden="true">&laquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>';

                }

                for(var i=1;i<=totalPage;i++)//遍歷頁碼,這是兩個圖標(上一頁和下一頁)之間的數字
                {
                    if(i==currentPage)//如果當前的這個數字等於當前頁碼currentPage,就設置class="active",即頁碼呈高亮樣式
                    {
                        var item='<li οnclick="findByPage('+i+',5);" class="active"><a href="#">'+i+'</a></li>';
                    }
                    else
                    {
                        var item='<li οnclick="findByPage('+i+',5);"><a href="#">'+i+'</a></li>';
                    }
                    str=str+item;

                }
                if(currentPage==totalPage)//如果當前頁碼為最後一頁,用戶還點擊下一頁的話,設置class="disabled" ,即出現一個“禁用”圖標
                {
                    var strend='<li class="disabled" οnclick="findByPage('+(currentPage+1)+',5)">\n' +
                        '                    <a href="#" aria-label="Next">\n' +
                        '                        <span aria-hidden="true">&raquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>\n' +
                        '                <span style="font-size: 24px" id="total_sp">共'+totalCount+'條記錄,共'+totalPage+'頁</span>';

                }
                else //不是最後一頁,就是正常的樣式
                {
                    var strend='<li οnclick="findByPage('+(currentPage+1)+',5)">\n' +
                        '                    <a href="#" aria-label="Next">\n' +
                        '                        <span aria-hidden="true">&raquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>\n' +
                        '                <span style="font-size: 24px" id="total_sp">共'+totalCount+'條記錄,共'+totalPage+'頁</span>';

                }

                str=str+strend;
                $("#fenyelan").html(str);//分頁條初始化

                var array=data.list;
                for(var i=0;i<array.length;i++)
                {
                    var obj=array[i];
                    var id=obj.id;
                    var area=obj.area;
                    var precipitation=obj.precipitation;
                    var month=obj.month;
                    var releaseDate=obj.releaseDate;
                    //表格的初始化
                    $("#rain_table").append('<tr class="info">\n' +
                        '                <td style="text-align: center">'+id+'</td>\n' +
                        '                <td style="text-align: center">'+area+'</td>\n' +
                        '                <td style="text-align: center">'+precipitation+'</td>\n' +
                        '                <td style="text-align: center">'+month+'</td>\n' +
                        '                <td style="text-align: center">'+releaseDate+'</td>\n' +
                        '            </tr>');
                }

            });//頁面加載完成之後發送ajax請求end

        });//入口函數end



        //頁面按鈕的點擊回調函數,不需要寫在入口函數裡面,因為隻有頁面按鈕被點擊時,這個函數才會被調用
        function findByPage(curPage,paSize) //被調用的時候,需要傳遞兩個參數:當前頁碼和頁碼的大小(一頁有幾條記錄)
        {
            $.post("ViewRainByPageServlet",{currentPage:curPage,pageSize:paSize},function (data) //發送ajax請求
            {
                var totalCount=data.totalCount;//總記錄數
                var totalPage=data.totalPage;//總頁數
                var currentPage=data.currentPage;//當前頁碼


                if(currentPage==1)//如果當前頁碼為1,用戶還點擊上一頁的話,設置class="disabled" ,即出現一個“禁用”圖標
                {
                    var str=' <li class="disabled" οnclick="findByPage('+(currentPage-1)+',5)">\n' +
                        '                    <a href="#" aria-label="Previous">\n' +
                        '                        <span aria-hidden="true">&laquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>';

                }
                else//不為第一頁,上一頁按鈕就是正常的樣式
                {
                    var str=' <li οnclick="findByPage('+(currentPage-1)+',5)">\n' +
                        '                    <a href="#" aria-label="Previous">\n' +
                        '                        <span aria-hidden="true">&laquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>';

                }


                //分頁條中間數字部分
                for(var i=1;i<=totalPage;i++)
                {
                    if(i==currentPage)//如果當前的這個數字等於當前頁碼currentPage,就設置class="active",即頁碼呈高亮樣式
                    {

                        var item='<li οnclick="findByPage('+i+',5);" class="active"><a href="#">'+i+'</a></li>';
                    }
                    else
                    {
                        var item='<li οnclick="findByPage('+i+',5);"><a href="#">'+i+'</a></li>';
                    }


                    str=str+item;

                }
                if(currentPage==totalPage)//如果當前頁碼為最後一頁,用戶還點擊下一頁的話,設置class="disabled" ,即出現一個“禁用”圖標
                {
                    var strend='<li class="disabled" οnclick="findByPage('+(currentPage+1)+',5)">\n' +
                        '                    <a href="#" aria-label="Next">\n' +
                        '                        <span aria-hidden="true">&raquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>\n' +
                        '                <span style="font-size: 24px" id="total_sp">共'+totalCount+'條記錄,共'+totalPage+'頁</span>';

                }
                else //不是最後一頁,就是正常的樣式
                {
                    var strend='<li οnclick="findByPage('+(currentPage+1)+',5)">\n' +
                        '                    <a href="#" aria-label="Next">\n' +
                        '                        <span aria-hidden="true">&raquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>\n' +
                        '                <span style="font-size: 24px" id="total_sp">共'+totalCount+'條記錄,共'+totalPage+'頁</span>';

                }
                str=str+strend;
                $("#fenyelan").html(str);//改變分頁條的內容

                //表格的字符串
                var tableStr='<caption style="text-align: center;font-size: 24px">降雨信息一覽</caption>\n' +
                    '            <tr class="success">\n' +
                    '                <th style="text-align: center">id</th>\n' +
                    '                <th style="text-align: center">地區</th>\n' +
                    '                <th style="text-align: center">降雨量(mm)</th>\n' +
                    '                <th style="text-align: center">月份</th>\n' +
                    '                <th style="text-align: center">發佈日期</th>\n' +
                    '            </tr>';
                var array=data.list;//具體內容的對象數組
                for(var i=0;i<array.length;i++)//遍歷數對象組
                {
                    var obj=array[i];//數組的一個元素就是一個對象
                    var id=obj.id;
                    var area=obj.area;
                    var precipitation=obj.precipitation;
                    var month=obj.month;
                    var releaseDate=obj.releaseDate;
                    //一行記錄的字符串
                    var oneRecord='<tr class="info">\n' +
                        '                <td style="text-align: center">'+id+'</td>\n' +
                        '                <td style="text-align: center">'+area+'</td>\n' +
                        '                <td style="text-align: center">'+precipitation+'</td>\n' +
                        '                <td style="text-align: center">'+month+'</td>\n' +
                        '                <td style="text-align: center">'+releaseDate+'</td>\n' +
                        '            </tr>';

                    tableStr=tableStr+oneRecord;//表格字符串的追加,每遍歷一條記錄,就會追加一行
                }
                $("#rain_table").html(tableStr);//改變表格裡面的內容

            });//ajax請求end

        }//頁面按鈕的點擊函數end

    </script>
</head>
<body>
<div class="container">
    <div class="row">

        <table class="table table-bordered table-hover" id="rain_table">
            <caption style="text-align: center;font-size: 24px">降雨信息一覽</caption>
            <tr class="success">
                <th style="text-align: center">id</th>
                <th style="text-align: center">地區</th>
                <th style="text-align: center">降雨量(mm)</th>
                <th style="text-align: center">月份</th>
                <th style="text-align: center">發佈日期</th>
            </tr>
        </table>


        <nav aria-label="Page navigation">
            <ul class="pagination" id="fenyelan">
                <li>
                    <a href="#" aria-label="Previous">
                        <span aria-hidden="true">&laquo;</span>
                    </a>
                </li>
                <li><a href="#">1</a></li>
                <li>
                    <a href="#" aria-label="Next">
                        <span aria-hidden="true">&raquo;</span>
                    </a>
                </li>
                <span style="font-size: 24px" id="total_sp">共2條記錄,共1頁</span>
            </ul>
        </nav>



    </div>

</div>

</body>
</html>

七、效果展示

這隻是一個簡單的分頁條,沒有百度分頁條“前五後四”的效果。當數據量變得非常龐大時,這個分頁條就會占據很大的空間。有時間的話再優化一下吧。至於Jquery代碼,代碼的註釋裡已經寫得夠清楚瞭,這裡就不再做過多的解釋。

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: