欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java Web中常用的分頁(yè)組件(Java端實(shí)現(xiàn))

 更新時(shí)間:2017年05月22日 09:12:53   作者:天空中的一縷微風(fēng)  
本文通過(guò)使用場(chǎng)景分析給大家介紹了Java Web中常用的分頁(yè)組件(Java端實(shí)現(xiàn)),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧

 前言

好久沒(méi)寫(xiě)Web程序了,這一段時(shí)間看了看原來(lái)師弟們做的一些程序,感覺(jué)還是有很多不足,一個(gè)比較典型的例子就是分頁(yè)查詢的實(shí)現(xiàn),正好借著這個(gè)機(jī)會(huì)簡(jiǎn)單記錄一下。

分析

使用場(chǎng)景

“分頁(yè)”在Web程序里非常常見(jiàn),比如我們?cè)陧?yè)面上經(jīng)常要展示一些列表信息,通常情況下,如果數(shù)據(jù)過(guò)多,我們?cè)谝黄辽想y以羅列出所有的記錄,而且很多時(shí)候我們可能只是看看比較Top的一些記錄,因此,在這種情況下使用“分頁(yè)”查詢只展示部分?jǐn)?shù)據(jù)是比較合適的。

實(shí)現(xiàn)原理

從數(shù)據(jù)庫(kù)角度上來(lái)說(shuō),分頁(yè)查詢實(shí)現(xiàn)的難度并不是很大,當(dāng)然不同的數(shù)據(jù)庫(kù)實(shí)現(xiàn)是有一些差異的。以MySQL為例,我們通常會(huì)寫(xiě)出如下的SQL語(yǔ)句:

# 簡(jiǎn)單的單表查詢
select [fields] from [table_name] where [expression] order by [field] [asc|desc] limit [offset], [size]

其中有幾處地方我們比較關(guān)注,第一個(gè)就是order by后的字段field和排順規(guī)則,第二個(gè)就是limit之后的數(shù)據(jù)偏移量offset和大小size。

所以,以上幾個(gè)參數(shù)是我們實(shí)現(xiàn)分頁(yè)查詢一個(gè)關(guān)鍵。

實(shí)現(xiàn)

這里的實(shí)現(xiàn)主要是指Java后臺(tái)的實(shí)現(xiàn),關(guān)于如何編寫(xiě)一個(gè)前端分頁(yè)插件不在此文的討論之列。我們來(lái)簡(jiǎn)單梳理一下整個(gè)業(yè)務(wù)邏輯的交互過(guò)程,就是”前端查詢參數(shù)”->”后臺(tái)業(yè)務(wù)邏輯查詢”->”返回結(jié)果集到前端”。

那么問(wèn)題來(lái)了,前端一般要傳遞哪些參數(shù)到服務(wù)器后臺(tái)呢?

回到上面的實(shí)現(xiàn)原理上,我們發(fā)現(xiàn),這4個(gè)參數(shù)我們都是需要的,而且它們不是固定的。從開(kāi)發(fā)角度上來(lái)講,我們首先需要的參數(shù)是sortField,sortOrder,即排一定的計(jì)算序字段和排序方式,offset我們通常會(huì)根據(jù)一定的計(jì)算規(guī)則進(jìn)行計(jì)算,一般在頁(yè)面上我們使用的是pageCurrent,即用戶需要查詢的頁(yè)數(shù),另外頁(yè)面還必須傳遞一個(gè)參數(shù)即pageSize,即每頁(yè)要顯示的數(shù)據(jù)總量,這樣,我們就可以根據(jù)pageCurrent和pageSize來(lái)計(jì)算出offset和size,計(jì)算公式如下所示:

offset=(pageCurrent−1)∗pageSize
size=pageSize

OK,我們梳理出來(lái)了4個(gè)字段,即sortField,sorOrder,pageCurrent和pageSize。這些參數(shù)是前臺(tái)應(yīng)該傳遞給后臺(tái)服務(wù)的,當(dāng)然,從程序的健壯性來(lái)說(shuō),如果用戶不傳遞這些字段,我們也應(yīng)該有一些默認(rèn)的實(shí)現(xiàn),比如說(shuō)如果不傳遞當(dāng)前頁(yè)數(shù),我們默認(rèn)就是第一頁(yè),如果不傳遞pageSize,我們可以默認(rèn)其大小為每頁(yè)30條……那么,第一個(gè)Java Bean就出來(lái)了,我們稱(chēng)為PageParam類(lèi)。

 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;
  /**
   * 查詢的當(dāng)前頁(yè)
   */
  private Integer pageCurrent = DEFAULT_PAGE_CURRENT;
  /**
   * 查詢的數(shù)據(jù)條目
   */
  private Integer pageSize = DEFAULT_PAGE_SIZE;
  ......
}

現(xiàn)在,我們先忽略服務(wù)器端的具體處理流程,來(lái)思考一下服務(wù)器端需要返回哪些信息到前端頁(yè)面上進(jìn)行展示。
下面是我從網(wǎng)上截取的一個(gè)典型分頁(yè)界面(如不能引用請(qǐng)私信我):

這里寫(xiě)圖片描述 

通過(guò)分析,可以看到,當(dāng)前頁(yè)pageCurrent是需要的,且通常會(huì)特殊展示。另外如果頁(yè)數(shù)過(guò)多,在前端界面里通常只會(huì)展示部分頁(yè)值,那么我們也需要來(lái)進(jìn)行判斷,通常情況下我們通過(guò)判斷總頁(yè)數(shù)即可,那么總頁(yè)數(shù)totalPage是需要的。當(dāng)然,還有一些隱含的參數(shù)我們通常也是要傳遞給前端進(jìn)行相關(guān)的業(yè)務(wù)處理的,比如說(shuō)數(shù)據(jù)的總條目totalSize和一頁(yè)顯示的數(shù)量pageSize,這些通常都會(huì)在頁(yè)面進(jìn)行展示。第二個(gè)Java Bean我們成為PageResult類(lèi):

public class PageResult<T> {
  /**
   * 返回的數(shù)據(jù)結(jié)果集
   */
  private List<T> resultList;
  /**
   * 總數(shù)據(jù)條目
   */
  private Integer totalSize;
  /**
   * 總頁(yè)數(shù)
   */
  private Integer totalPage;
  /**
   * 當(dāng)前頁(yè)
   */
  private Integer pageCurrent;
  /**
   * 顯示的數(shù)據(jù)條目
   */
  private Integer pageSize;
  ......
}

這里totalPage其實(shí)是可以根據(jù)pageSize和totalSize進(jìn)行計(jì)算出來(lái)的,計(jì)算公式如下:

totalPage=totalSize%pageSize==0?totalSize/pageSize:(totalSize/pageSize+1)

在實(shí)現(xiàn)里,我們對(duì)結(jié)果集使用了泛型,主要是為了通用處理。還差最后一點(diǎn),就是服務(wù)器端的處理邏輯,這里不太好說(shuō)的原因在于現(xiàn)在服務(wù)器端的框架太多,如MyBatis,spring JDBC,hibernate等等。不同的框架使用上是有較大差別的,不過(guò)有一些比較通用的做法這里簡(jiǎn)單記錄一下。

對(duì)任何前端傳遞過(guò)來(lái)的參數(shù)都必須進(jìn)行校驗(yàn)。這里主要是pageCurrent和pageSize,因?yàn)橛脩艉芸赡軅鬟f過(guò)來(lái)一些無(wú)效值,比如負(fù)值-1以及一些不合適值如pageSize取100000000等。

排序字段不是必須的。要根據(jù)業(yè)務(wù)來(lái)處理,因?yàn)楹芏鄷r(shí)候通過(guò)id或者其它字段默認(rèn)實(shí)現(xiàn)就可以了,不需要進(jìn)行重新排序。
pageSize的值要合適。如果太小會(huì)造成頁(yè)面過(guò)于空洞,頁(yè)數(shù)過(guò)多;而取值過(guò)大則會(huì)使頁(yè)面內(nèi)容繁雜,通常在一屏比較合適,不需要用戶拉動(dòng)滑動(dòng)條。

以上所述是小編給大家介紹的Java Web中常用的分頁(yè)組件(Java端實(shí)現(xiàn)),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 使用Spring boot標(biāo)記一個(gè)方法過(guò)時(shí)

    使用Spring boot標(biāo)記一個(gè)方法過(guò)時(shí)

    這篇文章主要介紹了使用Spring boot標(biāo)記一個(gè)方法過(guò)時(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Spring boot 跳轉(zhuǎn)到j(luò)sp頁(yè)面的實(shí)現(xiàn)方法

    Spring boot 跳轉(zhuǎn)到j(luò)sp頁(yè)面的實(shí)現(xiàn)方法

    本篇文章主要介紹了Spring boot 跳轉(zhuǎn)到j(luò)sp頁(yè)面的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Java中可變長(zhǎng)度參數(shù)代碼詳解

    Java中可變長(zhǎng)度參數(shù)代碼詳解

    這篇文章主要介紹了Java中可變長(zhǎng)度參數(shù)代碼詳解,涉及了實(shí)參個(gè)數(shù)可變的定義方法,數(shù)組包裹實(shí)參等幾個(gè)問(wèn)題,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • Java Swing編寫(xiě)一個(gè)簡(jiǎn)單的計(jì)算器軟件

    Java Swing編寫(xiě)一個(gè)簡(jiǎn)單的計(jì)算器軟件

    大家好,本篇文章主要講的是Java Swing編寫(xiě)一個(gè)簡(jiǎn)單的計(jì)算器軟件,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • spring boot 加載web容器tomcat流程源碼分析

    spring boot 加載web容器tomcat流程源碼分析

    本文章主要描述spring boot加載web容器 tomcat的部分,為了避免文章知識(shí)點(diǎn)過(guò)于分散,其他相關(guān)的如bean的加載,tomcat內(nèi)部流程等不做深入討論,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-06-06
  • java使用JSONObject實(shí)例

    java使用JSONObject實(shí)例

    JAVA中JSONObject對(duì)象的使用方法
    2013-11-11
  • springboot動(dòng)態(tài)定時(shí)任務(wù)的實(shí)現(xiàn)方法示例

    springboot動(dòng)態(tài)定時(shí)任務(wù)的實(shí)現(xiàn)方法示例

    這篇文章主要給大家介紹了關(guān)于springboot動(dòng)態(tài)定時(shí)任務(wù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 在Java中Collection的一些常用方法總結(jié)

    在Java中Collection的一些常用方法總結(jié)

    今天給大家?guī)?lái)的知識(shí)是關(guān)于Java的,文章圍繞著Java中Collection的一些常用方法展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • ArrayList的自動(dòng)擴(kuò)充機(jī)制實(shí)例解析

    ArrayList的自動(dòng)擴(kuò)充機(jī)制實(shí)例解析

    本文主要介紹了ArrayList的自動(dòng)擴(kuò)充機(jī)制,由一個(gè)題目切入主題,逐步向大家展示了ArrayList的相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • java使用this調(diào)用構(gòu)造函數(shù)的實(shí)現(xiàn)方法示例

    java使用this調(diào)用構(gòu)造函數(shù)的實(shí)現(xiàn)方法示例

    這篇文章主要介紹了java使用this調(diào)用構(gòu)造函數(shù)的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了java面向?qū)ο蟪绦蛟O(shè)計(jì)中函數(shù)調(diào)用相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08

最新評(píng)論