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">«</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">«</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">»</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">»</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">«</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">«</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">»</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">»</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">«</span> </a> </li> <li><a href="#">1</a></li> <li> <a href="#" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> <span style="font-size: 24px" id="total_sp">共2條記錄,共1頁</span> </ul> </nav> </div> </div> </body> </html>
七、效果展示
這隻是一個簡單的分頁條,沒有百度分頁條“前五後四”的效果。當數據量變得非常龐大時,這個分頁條就會占據很大的空間。有時間的話再優化一下吧。至於Jquery代碼,代碼的註釋裡已經寫得夠清楚瞭,這裡就不再做過多的解釋。
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。