您好,登錄后才能下訂單哦!
前言
好久沒寫Web程序了,這一段時間看了看原來師弟們做的一些程序,感覺還是有很多不足,一個比較典型的例子就是分頁查詢的實現,正好借著這個機會簡單記錄一下。
分析
使用場景
“分頁”在Web程序里非常常見,比如我們在頁面上經常要展示一些列表信息,通常情況下,如果數據過多,我們在一屏上難以羅列出所有的記錄,而且很多時候我們可能只是看看比較Top的一些記錄,因此,在這種情況下使用“分頁”查詢只展示部分數據是比較合適的。
實現原理
從數據庫角度上來說,分頁查詢實現的難度并不是很大,當然不同的數據庫實現是有一些差異的。以MySQL為例,我們通常會寫出如下的SQL語句:
# 簡單的單表查詢 select [fields] from [table_name] where [expression] order by [field] [asc|desc] limit [offset], [size]
其中有幾處地方我們比較關注,第一個就是order by后的字段field和排順規則,第二個就是limit之后的數據偏移量offset和大小size。
所以,以上幾個參數是我們實現分頁查詢一個關鍵。
實現
這里的實現主要是指Java后臺的實現,關于如何編寫一個前端分頁插件不在此文的討論之列。我們來簡單梳理一下整個業務邏輯的交互過程,就是”前端查詢參數”->”后臺業務邏輯查詢”->”返回結果集到前端”。
那么問題來了,前端一般要傳遞哪些參數到服務器后臺呢?
回到上面的實現原理上,我們發現,這4個參數我們都是需要的,而且它們不是固定的。從開發角度上來講,我們首先需要的參數是sortField,sortOrder,即排一定的計算序字段和排序方式,offset我們通常會根據一定的計算規則進行計算,一般在頁面上我們使用的是pageCurrent,即用戶需要查詢的頁數,另外頁面還必須傳遞一個參數即pageSize,即每頁要顯示的數據總量,這樣,我們就可以根據pageCurrent和pageSize來計算出offset和size,計算公式如下所示:
offset=(pageCurrent−1)∗pageSize size=pageSize
OK,我們梳理出來了4個字段,即sortField,sorOrder,pageCurrent和pageSize。這些參數是前臺應該傳遞給后臺服務的,當然,從程序的健壯性來說,如果用戶不傳遞這些字段,我們也應該有一些默認的實現,比如說如果不傳遞當前頁數,我們默認就是第一頁,如果不傳遞pageSize,我們可以默認其大小為每頁30條……那么,第一個Java Bean就出來了,我們稱為PageParam類。
public class PageParam { private static final Integer DEFAULT_PAGE_CURRENT = 1; private static final Integer DEFAULT_PAGE_SIZE = 30; /** * 排序字段 */ private String sortField; /** * 排序方式 * asc | desc */ private String sortOrder; /** * 查詢的當前頁 */ private Integer pageCurrent = DEFAULT_PAGE_CURRENT; /** * 查詢的數據條目 */ private Integer pageSize = DEFAULT_PAGE_SIZE; ...... }
現在,我們先忽略服務器端的具體處理流程,來思考一下服務器端需要返回哪些信息到前端頁面上進行展示。
下面是我從網上截取的一個典型分頁界面(如不能引用請私信我):
通過分析,可以看到,當前頁pageCurrent是需要的,且通常會特殊展示。另外如果頁數過多,在前端界面里通常只會展示部分頁值,那么我們也需要來進行判斷,通常情況下我們通過判斷總頁數即可,那么總頁數totalPage是需要的。當然,還有一些隱含的參數我們通常也是要傳遞給前端進行相關的業務處理的,比如說數據的總條目totalSize和一頁顯示的數量pageSize,這些通常都會在頁面進行展示。第二個Java Bean我們成為PageResult類:
public class PageResult<T> { /** * 返回的數據結果集 */ private List<T> resultList; /** * 總數據條目 */ private Integer totalSize; /** * 總頁數 */ private Integer totalPage; /** * 當前頁 */ private Integer pageCurrent; /** * 顯示的數據條目 */ private Integer pageSize; ...... }
這里totalPage其實是可以根據pageSize和totalSize進行計算出來的,計算公式如下:
totalPage=totalSize%pageSize==0?totalSize/pageSize:(totalSize/pageSize+1)
在實現里,我們對結果集使用了泛型,主要是為了通用處理。還差最后一點,就是服務器端的處理邏輯,這里不太好說的原因在于現在服務器端的框架太多,如MyBatis,spring JDBC,hibernate等等。不同的框架使用上是有較大差別的,不過有一些比較通用的做法這里簡單記錄一下。
對任何前端傳遞過來的參數都必須進行校驗。這里主要是pageCurrent和pageSize,因為用戶很可能傳遞過來一些無效值,比如負值-1以及一些不合適值如pageSize取100000000等。
排序字段不是必須的。要根據業務來處理,因為很多時候通過id或者其它字段默認實現就可以了,不需要進行重新排序。
pageSize的值要合適。如果太小會造成頁面過于空洞,頁數過多;而取值過大則會使頁面內容繁雜,通常在一屏比較合適,不需要用戶拉動滑動條。
以上所述是小編給大家介紹的Java Web中常用的分頁組件(Java端實現),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。