JS分頁的實(shí)現(xiàn)(同步與異步)
分頁技術(shù)分為后端分頁和前端分頁。
前端分頁
將數(shù)據(jù)一次性全部取出來,然后通過js進(jìn)行分頁,有其弊端:假設(shè)有商品表dbgoods,存放99999萬條數(shù)據(jù) ,執(zhí)行查詢語句
select *from dbgoods where 1=1
將查詢結(jié)構(gòu)用List<goods>list
進(jìn)行接收,服務(wù)端將這么龐大的數(shù)據(jù)量傳遞給前端,會造成下載量大(流量都是錢),服務(wù)器壓力大等。
后端分頁
后端分頁是每次請求只查詢一頁的值,以mysql為例(查詢第一條開始,查詢8條)
select * from dbgoods order by id limit 0,8;
后端同步分頁
原理:需要有個(gè)Bean記錄分頁的信息,
public class PageBean{ private long total; //總記錄數(shù) private List<T> list; //結(jié)果集 private int pageNum; // 第幾頁 private int pageSize; // 每頁記錄數(shù) private int pages; // 總頁數(shù) private int size; // 當(dāng)前頁的數(shù)量 <= pageSize,該屬性來自ArrayList的size屬性
當(dāng)我們首次加載時(shí),加載的是第一頁的分頁數(shù)據(jù):
值得注意的是
以前我是這樣編寫sql語句得到總條數(shù)的:
select *from dbgoods ; //用Lits<goods> lists去存儲 得到的數(shù)據(jù),如果數(shù)據(jù)有幾萬條, //為了得到一個(gè)數(shù)字,去開辟這么大的空間,實(shí)屬浪費(fèi) PageBean page=new PageBean(); page.setTotal=lists.size();
其實(shí)正確的打開方式是:
select count(*) from dbgoods where 1=1 ; //查詢語句返回的是一個(gè)表的總記錄數(shù),int型, //where 1==1是為了查詢搜索,做sql語句拼接
同步實(shí)現(xiàn)異步,從jsp界面?zhèn)鬟fcurrentpage參數(shù)到servlet,servlet通過request請求得到參數(shù),通過dao層數(shù)據(jù)庫查詢后將數(shù)據(jù)再傳會到j(luò)sp界面。
瀏覽器看到的界面效果是:jsp--->servlet----->jsp(跳轉(zhuǎn),用戶體驗(yàn)不好)
如果有搜索框,在進(jìn)行搜索分頁時(shí),點(diǎn)擊搜索按鈕,等到查詢數(shù)據(jù)傳遞到j(luò)sp界面時(shí),jsp已經(jīng)是個(gè)全新的頁面,搜索框里的文本框內(nèi)容已經(jīng)消失,解決方法就是在點(diǎn)擊搜索的時(shí)候,將文本框的值也放在request請求,一起發(fā)給servlet,再通過servlet傳遞到新的jsp (超級繁瑣)
兩種解決方法:
(1)做兩個(gè)界面一樣的,一個(gè)用于顯示全部數(shù)據(jù)情況下的分頁,當(dāng)點(diǎn)擊查詢時(shí),得到數(shù)據(jù)后用另外的頁面(下一頁點(diǎn)擊事件是去執(zhí)行搜索的情況)去顯示
(2)使用session:當(dāng)點(diǎn)擊搜索查詢時(shí),將搜索條件記錄在session里面,當(dāng)點(diǎn)擊下一頁時(shí),去判斷session的值,如果是空,則執(zhí)行全部數(shù)據(jù)的下一頁,如果不為空,則將session的值取出來,作為查詢的條件,下一頁執(zhí)行 有搜索條件的查詢語句。麻煩點(diǎn):session的銷毀不好控制,容易bug
總之,用同步實(shí)現(xiàn)分頁,會有各種不開心
Ajax異步分頁
//jsp界面一個(gè)函數(shù),傳遞查詢頁碼,繪制表格 function InitTable(currentpage) { $.ajax({ type:"get", url:"CustomServlet?type=search¤tpage="+currentpage, async:true, dataType:"json", success:function(data) { DrawTable(data); //繪制表格 } }); } function DrawTable(data) //根據(jù)傳遞過來的json繪制表格 { //給總頁數(shù)賦值 $("#custom_all").text(data.pagelist.total); //給當(dāng)前頁賦值 $("#custom_currunt_page").text(data.pagelist.pageNum); //給總頁數(shù)賦值 $("#custom_all_page").text(data.pagelist.pages); var _th="<th><input id='cb_all' type='checkbox'></th>" +"<th>ID</th>" +"<th>客戶名稱</th>" +"<th>公司名稱</th>" +"<th>聯(lián)系人</th>" +"<th>性別</th>" +"<th>聯(lián)系電話</th>" +"<th>手機(jī)</th>" +"<th>QQ</th>" +"<th>電子郵箱</th>" +"<th>通訊地址</th>" +"<th>創(chuàng)建時(shí)間</th>"; document.getElementsByTagName("tbody")[0].innerHTML=_th; for(var i=0;i<data.pagelist.list.length;i++) { var customerCreatetime= format(data.pagelist.list[i].customerCreatetime, 'yyyy-MM-dd'); var _tr=document.createElement('tr'); msg="<td><input type='checkbox'></td><td>"+data.pagelist.list[i].customerId+"</td><td>"+data.pagelist.list[i].customerName+"</td><td>"+data.pagelist.list[i].customerCompanyname+"</td><td>"+data.pagelist.list[i].customerContactname+"</td><td>"+data.pagelist.list[i].customerSex+"</td><td>"+data.pagelist.list[i].customerTelephone+"</td><td>"+data.pagelist.list[i].customerPhone+"</td><td>"+data.pagelist.list[i].customerQq+"</td><td>"+data.pagelist.list[i].customerEmail+"</td><td>"+data.pagelist.list[i].customerAddress+"</td><td>"+customerCreatetime+"</td>" _tr.innerHTML=msg; document.getElementsByTagName("tbody")[0].appendChild(_tr); } }
初次加載時(shí),默認(rèn)調(diào)用
//初始化表格 InitTable(1);
值得注意的是,重點(diǎn)來了:
我們進(jìn)行搜索的時(shí)候,定義一個(gè)全局的變量mydata,作用域?yàn)閜age
var mydata="";
下面看下點(diǎn)擊 搜索按鈕的事件代碼
btns.eq(1).click( //搜索按鈕點(diǎn)擊事件 function() { //custom_dialog_form是搜索的form表單,將其搜索條件序列化后賦值給一個(gè)全局變量 mydata=$("#custom_dialog_form").serialize(); $.ajax({ type:"post", url:"CustomServlet?type=search¤tpage=1", async:true, dataType:"json", data:mydata, //傳遞數(shù)據(jù) success:function(data) { DrawTable(data); $("#custom_dialog").css("display","none"); } }); } );
解決同步的搜索情況下的下一頁訪問到的是全部數(shù)據(jù)的下一頁問題:
function InitTable(currentpage) //無搜索條件下的查詢,傳遞一個(gè)頁碼 { $.ajax({ type:"get", url:"CustomServlet?type=search¤tpage="+currentpage, async:true, dataType:"json", success:function(data) { DrawTable(data); } }); } function InitTableSearch(currentpage)//有搜索添加的查詢,傳遞頁碼 { $.ajax({ type:"post", url:"CustomServlet?type=search¤tpage="+currentpage, async:true, dataType:"json", data:mydata, success:function(data) { DrawTable(data); $("#custom_dialog").css("display","none"); } }); } //下一頁 $("#custom_btn_next").click( function () { var currentpage=$("#custom_currunt_page").text(); //獲取頁面的當(dāng)前頁的值 var pages=$("#custom_all_page").text(); //獲取總頁數(shù) currentpage++; if(currentpage<=pages) { if(mydata=="") //判斷全局變量mydata是否為空,空表示沒有進(jìn)行搜索查詢 { InitTable(currentpage); } else { InitTableSearch(currentpage); //進(jìn)行條件搜索 } } });
由于是異步刷新,所以全局變量mydata是有值的,手動自己刷新頁面重新加載,mydata就會初始化為空,就又默認(rèn)執(zhí)行 無條件搜索語句。巧妙的解決了搜索和顯示全部的下一頁問題,上一頁首頁尾頁同理。
總結(jié)
以上所述是小編給大家介紹的JS分頁的實(shí)現(xiàn)(同步與異步),希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時(shí)回復(fù)大家的!
相關(guān)文章
JavaScript實(shí)現(xiàn)tab欄切換的幾種常用方法
這篇文章主要給大家介紹了關(guān)于JavaScript實(shí)現(xiàn)tab欄切換的幾種常用方法,在Web開發(fā)中Tab切換是一個(gè)常見的功能,它允許用戶在不同的頁面部分之間進(jìn)行切換,需要的朋友可以參考下2023-12-12找到了一篇jQuery與Prototype并存的沖突的解決方法
找到了一篇jQuery與Prototype并存的沖突的解決方法...2007-08-08js實(shí)現(xiàn)時(shí)間日期的相加相減代碼示例
這篇文章主要給大家介紹了關(guān)于利用js實(shí)現(xiàn)時(shí)間日期的相加相減的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用js具有一定的參考解決價(jià)值,需要的朋友可以參考下2023-09-09ECharts柱狀圖關(guān)閉鼠標(biāo)hover時(shí)的高亮樣式詳解
為了方便使用,echarts的餅圖中給加入了默認(rèn)的hover高亮效果,下面這篇文章主要給大家介紹了關(guān)于ECharts柱狀圖關(guān)閉鼠標(biāo)hover時(shí)的高亮樣式的相關(guān)資料,需要的朋友可以參考下2023-04-04javascript firefox不顯示本地預(yù)覽圖片問題的解決方法
在Firefox一直不能用js做出圖片預(yù)覽的效果,下面這個(gè)即可解決,用替換的方法實(shí)現(xiàn)firefox支持得的路徑格式2008-11-11JavaScript按位運(yùn)算符的應(yīng)用簡析
下面根據(jù)自己的認(rèn)知簡單的談一下js中的位操作使用(同樣適用于其他語言),如果有錯(cuò)誤,歡迎指正2014-02-02