2016-02-23 91 views
0

我在使用Spring MVC 4,thymeleaf和MySQL(JDBC是不使用休眠或JPA)..和我試圖做分頁和排序構建Web應用程序,但我認爲我有一個理解它的問題。分頁和Spring MVC中排序4

當我使用spring mvc尋找分頁時,我可以找到所有的PagedListHolder和MutableSortDefinition,但我不認爲這是正確的方法,因爲它會爲每個請求加載服務器內存中所有數據的列表,是對的嗎?如果是的話,那麼考慮到有數十萬條記錄(一個月內的房地產廣告,每天近2500條廣告),那麼實施分頁和排序的最佳方式是什麼?

那麼,有人可以把一個如何以大數據應用程序的方式實現分頁和排序的真實示例?

+1

如果你想讓你的數據在表中表示,我可以建議你[Dandelion Datatables](http://dandelion.github.io/components/datatables)。這個框架(基於JQuery Datatable構建)具有許多可以使用的功能(例如分頁,排序等)。由於「服務器端處理」功能,它適用於大數據。我們用它來代表超過一百萬個條目,並且一切都很好。 我寫了關於客戶端,順便說一句:) – Enigo

+0

Thx enigo ..我檢查了它,它看起來很好,使用簡單..所以它適用於高流量與百萬條目(頁面加載速度,內存和CPU消耗)? ..也出於好奇,你知道pagedListHolder如何工作?我的意思是它真的會爲每個用戶加載內存中的所有對象(因爲它通常保存在會話屬性中)?我的意思是如果你有成千上萬的記錄(甚至幾萬個),並且有數以千計的併發用戶和會話,那麼服務器會因超載而爆炸,對嗎? –

+0

是的,它的工作速度與您的服務器端能夠發回結果一樣快。這種類型的任務的Datatable的關鍵特性是「服務器端處理」。基本上它允許你只獲得一個特定頁面的條目,而不是幾萬條。但另一方面,用戶執行的每個操作(選擇下一個\ prev頁面,排序等)在服務器端完成。所以,任務是讓服務器工作非常快。不幸的是,我對pagedListHolder一無所知,根據google的結果,它似乎不是很流行:) – Enigo

回答

0

爲了擴大我的意見,我想分享一些代碼片段,以顯示它是多麼容易實現Dandelion Datatables與Thymeleaf。 因此,在客戶端上我有兩個文件:HTML的表格呈現

....  
<table id="dTable" class="display dataTable" dt:table="true"> 
    <thead> 
     <tr> 
      <th th:text="#{requestId}"></th> 
      <th th:text="#{clientTime}"></th> 
      <th th:text="#{requestDate}"></th> 
      <th th:text="#{receiver}"></th> 
     </tr> 
    </thead> 
</table> 
.... 
爲表初始化

$(document).ready(function() { 
    $('#dTable').DataTable({ 
     ajax: { url: "/bhost/dtable_list"}, 
     processing: true, 
     serverSide: true, 
     bFilter: false, 
     columns: [ 
      { data: "requestId" }, 
      { data: "clientTime" }, 
      { data: "requestDate" }, 
      { data: "receiver", orderable: false }, 
     ], 
     lengthMenu: [50, 100, 200, 500], 
     language: { 
     thousands: " " 
     } 
    }); 
}); 

即使它可以配置蒲公英數據表只在HTML我更喜歡使用

和js JQuery的方式來做到這一點,因爲它更靈活。

在我們用我們自己創建的數據庫訪問層服務器端(不太有用的共享)和蒲公英DatatablesCriterias類來獲取表的當前狀態(當前頁面索引,頁面長度,選擇排序列等)

Controller 
.... 
     @RequestMapping(value = "/dtable_list") 
     @ResponseBody 
     public DatatablesResponse<DataDTO> getTableData(HttpServletRequest request) { 
      HttpSession session = request.getSession(); 
      DataModel model = (DaatModel) session.getAttribute(MODEL_NAME); 
      DatatablesCriterias criterias = DatatablesCriterias.getFromRequest(request); 
      List<DataDTO> list = finder.getForCriterias(model, timeZoneOffset, criterias); 
      Long totalCount = model.getCount(); 
      return DatatablesResponse.build(new DataSet<>(list, totalCount, totalCount), criterias); 
     } 
.... 

這裏的關鍵特徵是DatatablesCriterias,因爲它包含了所有必要的數據檢索與用戶選擇相關條目。 而這幾乎是它(除了配置部分,我猜)

0

嘗試這樣

  • 的findAll方法與參數 「PageRequest()」 提供服務器端分頁
  • 有兩種方法

    PageRequest(int page,int size)

    PageRequest(INT頁面,詮釋大小,方向的方向,串...屬性)

查看

<table class="table"> 
      <thead style="background-color: #eee"> 
       <tr> 
        <td>Dispature</td> 
        <td>Service</td> 
        <td>Host</td> 
        <td>Value</td> 
       </tr> 
      </thead> 
      <tbody> 
       <tr ng-repeat="x in app.metricsList"> 
        <td>{{x.dispature}}</td> 
        <td>{{x.service}}</td> 
        <td>{{x.host}}</td> 
        <td>{{x.value}}</td> 
       </tr> 
      </tbody> 
     </table> 
     <div align="center"> 
      <uib-pagination items-per-page="app.itemPerPage" num-pages="numPages" 
       total-items="app.totalItems" boundary-link-numbers="true" 
       ng-model="app.currentPage" rotate="false" max-size="app.maxSize" 
       class="pagination-sm" boundary-links="true" 
       ng-click="app.getPagableRecords()"></uib-pagination>   

      <div style="float: right; margin: 15px"> 
       <pre>Page: {{app.currentPage}}/{{numPages}}</pre> 
      </div>   
     </div> 

的js控制器

app.controller('AllEntryCtrl',['$scope','$http','$timeout','$rootScope', function($scope,$http,$timeout,$rootScope){ 

    var app = this; 
    app.currentPage = 1; 
    app.maxSize = 5; 
    app.itemPerPage = 5; 
    app.totalItems = 0; 

    app.countRecords = function() { 
     $http.get("countRecord") 
     .success(function(data,status,headers,config){ 
      app.totalItems = data; 
     }) 
     .error(function(data,status,header,config){ 
      console.log(data); 
     }); 
    }; 

    app.getPagableRecords = function() { 
     var param = { 
       page : app.currentPage, 
       size : app.itemPerPage 
     }; 
     $http.get("allRecordPagination",{params : param}) 
     .success(function(data,status,headers,config){ 
      app.metricsList = data.content; 
     }) 
     .error(function(data,status,header,config){ 
      console.log(data); 
     }); 
    }; 

    app.countRecords(); 
    app.getPagableRecords(); 

}]); 

控制器

@RestController 
public class HomeController { 

@Autowired 
private HomeRepo repo; 

    @RequestMapping(value = "allRecordPagination", method = RequestMethod.GET) 
    public Page<Metrics> getAllRecordPagination(@RequestParam("page") int page, @RequestParam("size") int size){ 
     return repo.findAll(new PageRequest(page-1, size)); 
    } 
} 

@Repository 
    public interface HomeRepo extends JpaRepository<Table, String>{ 
}