jquery+Ajax實現(xiàn)簡單分頁條效果
本文實例為大家分享了jquery+Ajax實現(xiàn)分頁條效果的具體代碼,供大家參考,具體內容如下
一、如果是jsp頁面的話,可以用EL表達式和JSTL標簽制作一個分頁條,沒有什么難度。用EL表達式和JSTL標簽實現(xiàn)的缺點就是無法實現(xiàn)異步效果,整個頁面是重新刷新了一遍的。
二、如果是普通的html頁面,當然是無法使用EL表達式和JSTL標簽的,這時只能通過異步Ajax的方式去實現(xiàn)。當然了,JSP頁面兩種方式都是可以使用的。
三、分頁條,這里我是用Ajax和Jquery去做的。實現(xiàn)起來比較繁瑣,代碼特別長,因為都是拼接一大堆的字符串,然后使用html()方法或是append()方法去改變文檔的內容。
四、事前分析
瀏覽器端需要發(fā)送給服務器端的參數(shù)有兩個:
①當前的頁碼currentPage;
②頁面的大小(一頁顯示幾條記錄)pageSize。
服務器端給瀏覽器端發(fā)送的是Json格式的數(shù)據(jù),也就是一個頁面實體類PageBean。其中PageBean有如下字段:
①總記錄數(shù)totalCount;
②總頁碼totalPage;
③每頁的數(shù)據(jù) List list;
④當前頁碼currentPage;
⑤每頁顯示的記錄數(shù)pageSize。
這個PageBean支持泛型,代碼如下:
public class PageBean<T>
{
private int totalCount; // 總記錄數(shù)
private int totalPage ; // 總頁碼
private List<T> list ; // 每頁的數(shù)據(jù)
private int currentPage ; //當前頁碼
private int rows;//每頁顯示的記錄數(shù),也就是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語句中的“l(fā)imit”。舉個例子說明一下含義。
select * from student limit 2,5;
具體含義:從student表當中查詢數(shù)據(jù),從索引為“2”的記錄開始查詢,往后查5條。
索引是從0開始的,所以上面的語句相當于查詢了第3、第4、第5、第6、第7條記錄,總共5條記錄。
總而言之,第一個數(shù)字就是“從哪開始查”的意思,第二個數(shù)字就是“往后查幾條”的意思。
這里的“從哪開始查”,需要計算出來。公式如下:
(currentPage-1)×pageSize
也就是當前頁碼減去一,括號,在乘以頁面大小。
所以查詢語句的偽代碼如下:
select * from student limit (currentPage-1)×pageSize,pageSize;
對于總頁碼totalPage,可以通過總記錄數(shù)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();//從數(shù)據(jù)庫獲取總記錄數(shù)
int totalPage;//先聲明一下總的頁碼,總的頁碼需要根據(jù)客戶端發(fā)送過來的數(shù)據(jù)進行計算
String currentPage = request.getParameter("currentPage");
String pageSize = request.getParameter("pageSize");
int intCurrentPage = Integer.parseInt(currentPage);//用戶發(fā)來的當前頁碼
if(intCurrentPage==0)//用戶點擊上一頁按鈕,currentPage就減1,會出現(xiàn)減到0的情況
{
intCurrentPage=1;//如果用戶的currentPage=0,直接把頁碼設為1,把第一頁的數(shù)據(jù)返回給客戶端
}
int intPageSize = Integer.parseInt(pageSize);//用戶發(fā)來的頁面大小
totalPage=totalCount%intPageSize==0?totalCount/intPageSize:(totalCount/intPageSize+1);//計算出總的頁數(shù)
if(intCurrentPage>totalPage)//用戶點擊下一頁按鈕,currentPage就加1,會出現(xiàn)大于總頁數(shù)的情況
{
intCurrentPage=totalPage;//把當前頁碼設為總頁數(shù)
}
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");//設置響應數(shù)據(jù)類型和字符編碼
PageBean<RainFall> pageBean=new PageBean<>();//創(chuàng)建PageBean對象
//封裝PageBean對象
pageBean.setTotalCount(totalCount);
pageBean.setTotalPage(totalPage);
pageBean.setList(list);
pageBean.setCurrentPage(intCurrentPage);
pageBean.setRows(intPageSize);
//將數(shù)據(jù)寫回客戶端
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 () //入口函數(shù)
{
$.post("ViewRainByPageServlet",{currentPage:1,pageSize:5},function (data)//頁面加載完成之后發(fā)送ajax請求,請求前5條記錄,完成界面的初始化
{
var totalCount=data.totalCount;//總記錄數(shù)
var totalPage=data.totalPage;//總頁數(shù)
var currentPage=data.currentPage;//當前頁碼
if(currentPage==1)//如果當前頁碼為1,用戶還點擊上一頁的話,設置class="disabled" ,即出現(xiàn)一個“禁用”圖標
{
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++)//遍歷頁碼,這是兩個圖標(上一頁和下一頁)之間的數(shù)字
{
if(i==currentPage)//如果當前的這個數(shù)字等于當前頁碼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" ,即出現(xiàn)一個“禁用”圖標
{
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>');
}
});//頁面加載完成之后發(fā)送ajax請求end
});//入口函數(shù)end
//頁面按鈕的點擊回調函數(shù),不需要寫在入口函數(shù)里面,因為只有頁面按鈕被點擊時,這個函數(shù)才會被調用
function findByPage(curPage,paSize) //被調用的時候,需要傳遞兩個參數(shù):當前頁碼和頁碼的大?。ㄒ豁撚袔讞l記錄)
{
$.post("ViewRainByPageServlet",{currentPage:curPage,pageSize:paSize},function (data) //發(fā)送ajax請求
{
var totalCount=data.totalCount;//總記錄數(shù)
var totalPage=data.totalPage;//總頁數(shù)
var currentPage=data.currentPage;//當前頁碼
if(currentPage==1)//如果當前頁碼為1,用戶還點擊上一頁的話,設置class="disabled" ,即出現(xiàn)一個“禁用”圖標
{
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>';
}
//分頁條中間數(shù)字部分
for(var i=1;i<=totalPage;i++)
{
if(i==currentPage)//如果當前的這個數(shù)字等于當前頁碼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" ,即出現(xiàn)一個“禁用”圖標
{
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">地區(qū)</th>\n' +
' <th style="text-align: center">降雨量(mm)</th>\n' +
' <th style="text-align: center">月份</th>\n' +
' <th style="text-align: center">發(fā)布日期</th>\n' +
' </tr>';
var array=data.list;//具體內容的對象數(shù)組
for(var i=0;i<array.length;i++)//遍歷數(shù)對象組
{
var obj=array[i];//數(shù)組的一個元素就是一個對象
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
}//頁面按鈕的點擊函數(shù)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">地區(qū)</th>
<th style="text-align: center">降雨量(mm)</th>
<th style="text-align: center">月份</th>
<th style="text-align: center">發(fā)布日期</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>
七、效果展示

這只是一個簡單的分頁條,沒有百度分頁條“前五后四”的效果。當數(shù)據(jù)量變得非常龐大時,這個分頁條就會占據(jù)很大的空間。有時間的話再優(yōu)化一下吧。至于Jquery代碼,代碼的注釋里已經寫得夠清楚了,這里就不再做過多的解釋。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
jQuery+css3實現(xiàn)轉動的正方形效果(附demo源碼下載)
這篇文章主要介紹了jQuery+css3實現(xiàn)轉動的正方形效果,可實現(xiàn)圖片組集體轉動的功能,通過jQuery結合時間函數(shù)定時操作css3屬性實現(xiàn)旋轉效果,并附帶demo源碼供讀者下載,需要的朋友可以參考下2016-01-01
jQuery插件Echarts實現(xiàn)的雙軸圖效果示例【附demo源碼下載】
這篇文章主要介紹了jQuery插件Echarts實現(xiàn)的雙軸圖效果,結合完整實例形式分析了Echarts插件制作雙軸圖效果的操作步驟與相關實現(xiàn)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-03-03
jQuery實現(xiàn)form表單基于ajax無刷新提交方法實例代碼
在本篇文章里小編給大家整理了關于jQuery實現(xiàn)form表單基于ajax無刷新提交方法實例代碼,需要的朋友們參考下。2019-11-11
3Z版基于jquery的圖片復選框(asp.net+jquery)
最近在做一個彩票縮水工具,找了幾個圖片復選框插件始終感覺不太滿意,自己動手山寨了一下imageTick插件.2010-04-04

