java ee 分页_【JavaEE】JavaEE分页实践
作者:鄒峰立,微博:zrunker,郵箱:zrunker@yahoo.com,微信公眾號:書客創(chuàng)作,個人平臺:www.ibooker.cc。
本文選自書客創(chuàng)作平臺第56篇文章。閱讀原文 。
書客創(chuàng)作
分頁功能是現(xiàn)在網(wǎng)站開發(fā)當中,在常見不過的功能,幾乎是所有網(wǎng)站都會用到這么一個功能,而實現(xiàn)分頁功能的方式也很多。
例如:采用subList()方法進行分割,簡單來說就是先查詢數(shù)據(jù)庫中所有相關(guān)的數(shù)據(jù),將查詢出來的數(shù)據(jù)保存到list列表當中,然后通過list.subList(fromIndex, toIndex);進行拆分每一頁要顯示的數(shù)據(jù)。
ArrayList allList = new ArrayList<>();
allList.subList(fromIndex, toIndex);
但是采用這種方式有一個很大的弊端,就是當數(shù)據(jù)庫中有很多數(shù)據(jù)(上百萬)的時候,那么第一次獲取數(shù)據(jù)將會非常緩慢,而且獲取出來的數(shù)據(jù)也非常龐大,這么龐大的數(shù)據(jù)也許用戶不會全部查看,浪費大量資源。
那么今天我要實現(xiàn)的一種分頁方式是通過數(shù)據(jù)庫分頁查詢(MySQL:limit、Oracle:rownum)結(jié)合前端框架jQuery Pagination來實現(xiàn),在本實例中采用的數(shù)據(jù)庫是MySQL。
jQuery Pagination簡介
官方:When you have a a large list of items (e.g. search results or news articles), you can display them grouped in pages and present navigational elements to move from one page to another. This plugin creates these navigational elements.
簡單來說該插件就是用來將一個龐大的列表,分頁顯示的。
參數(shù)介紹:
callback:回調(diào)方法,是用戶點擊分頁(上一頁,下一頁等)的時候執(zhí)行的函數(shù)。
current_page:當前頁。
items_per _page:每個頁面的數(shù)量,最小值1。注意:這個值只計算頁面的數(shù)量。默認值:10。
link_to:鏈接分頁鏈接的目標。通常通過一個onclick事件觸發(fā)頁面選擇。如果鏈接包含字符串id,它將替換為頁碼。默認值:#。
num_display _entries:最大數(shù)量的頁碼鏈接。設(shè)置為0顯示一個簡單的“前/下一個”導航。默認值:11。
next_text:下一頁,默認值:next。
next_show _always:是否總是展示下一頁,默認true。
prev_text:上一頁。
prev_show _always:是否總是展示上一頁,默認true。
num_edge _entries:如果這個數(shù)字設(shè)置為1時,第一個和最后一個鏈接頁面總是顯示,獨立于當前位置和能見度num_display _entries設(shè)定的約束。你可以設(shè)置更大數(shù)字顯示鏈接。默認值:0。
ellipse_text:頁碼之間的省略號, 默認:...。
load_first _page:頁面加載完后是否加載第一頁數(shù)據(jù),true/false。
MySQL分頁查詢,后臺處理
MySQL分頁查詢其實很簡單只需要使用limit關(guān)鍵字即可,通常為了優(yōu)化SQL,會在limit中添加order by。
SELECT
FROM tablenameORDER BY id DESC
LIMIT limit_start, limit_count
同時還要查詢數(shù)據(jù)庫中該數(shù)據(jù)的總數(shù):
SELECT IFNULL(COUNT(id), 0) FROM tablename
為了配合前端插件,需要在后臺寫一個dto,在這個dto類中至少需要包括每頁顯示多少條記錄,當前頁,總記錄,一共多少頁,要顯示的數(shù)據(jù)列表。
public class Pager {
private int pageSize;// 每頁顯示多少條記錄
private int currentPage;// 當前第幾頁數(shù)據(jù)
private int totalRecord;// 一共多少條記錄
private int totalPage;// 一共多少頁
private List dataList;// 要顯示的數(shù)據(jù)
// getter/setter方法
}
泛型T是要顯示的數(shù)據(jù)對象。
通常頁面上傳遞過來的數(shù)據(jù)是頁碼page (currentPage)和每頁要顯示的數(shù)據(jù)(pageSize),所以我們要重構(gòu)SQL查詢的參數(shù),LIMIT limit_start, limit_count。
int limit_start= (page -1) * pageSize;
int limit_count= pageSize;
通過相應(yīng)的SQL語句能夠查詢出當前頁要顯示的數(shù)據(jù),和總記錄數(shù)。
// 查詢列表數(shù)據(jù)總數(shù)
totalRecord = articleDao.queryArticleDataListCount(aIsdelete, aIsallow);
totalPage = totalRecord / pageSize;// 總頁數(shù)
if (totalRecord % pageSize != 0) {
totalPage++;
}
總頁數(shù)=總記錄/每頁數(shù)量。但是這里要注意一個細節(jié),計算總頁數(shù)的時候,當數(shù)據(jù)不滿一頁顯示的數(shù)據(jù)的時候,要將總頁數(shù)增加1。
這樣就把dto中類所需要的所有變量值得到:
currentPage,pageSize由頁面?zhèn)鬟f過來。totalRecord,dataList由數(shù)據(jù)查詢得到。totalPage是計算得到。
Web頁面處理,三步走
首頁jquery.pagination插件是依賴jQuery,所以在頁面中引入jquery和jquery.pagination。
其次添加div用來顯示頁碼,同時引入分頁樣式:
最后是設(shè)置jquery.pagination參數(shù)和回調(diào)方法:
$(function() {
$("#News-Pagination").pagination(${pager.totalRecord}, {
items_per_page : ${pager.pageSize},// 每頁顯示多少條記錄
current_page : ${pager.currentPage} - 1,// 當前頁數(shù)
num_display_entries : 5,// 分頁顯示條目數(shù)
next_text : "下一頁",
prev_text : "上一頁",
num_edge_entries : 0,// 連接分頁主體,顯示的條目數(shù)
load_first_page : false,
callback : handlePaginationClick
});
});
function handlePaginationClick(new_page_index, pagination_container) {
var url = "web/article/list/" + (new_page_index + 1);
window.location.href = url;
return false;
};
最后看看最終實現(xiàn)效果:
分頁效果圖
微信公眾號:書客創(chuàng)作
總結(jié)
以上是生活随笔為你收集整理的java ee 分页_【JavaEE】JavaEE分页实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 计算时间重叠_Python
- 下一篇: java spring异常处理_Java