天天看點

jquery表格插件datatables應用執行個體

jquery表格插件datatables應用執行個體

DataTables的首頁是http://www.datatables.net/

先上個這個demo的截圖,設想的操作是輸入客戶名稱,按檢索後進行模糊檢索進

行分 頁顯示,每頁顯示8條記錄。

1 頁面部分

使用DataTables時,html需要如下書寫,其中tfoot部分是表表格的下部标題,

可以不

要。

Html代碼

  1. < table   class = "display"   id = "customerInfo" >   
  2.      < thead >   
  3.          < tr >   
  4.              < th > ID </ th >   
  5.             略   
  6.              < th > 身高 </ th >   
  7.          </ tr >   
  8.      </ thead >   
  9.      < tbody >   
  10.          < tr >   
  11.              < td   colspan = "8" > </ td >     
  12.          </ tr >   
  13.      </ tbody >   
  14.      < tfoot >   
  15.          < tr >   
  16.              < th > ID </ th >   
  17.             略   
  18.              < th > 身高 </ th >   
  19.          </ tr >   
  20.      </ tfoot >   
  21. </ table >   

js部分這樣寫:

Javascript代碼

$('#customerInfo').dataTable();

對于從伺服器端取資料,還要指定幾個參數:

bServerSide:true

sAjaxSource:擷取資料的url

這樣,在DataTables需要資料時會調用jquery的getJSON擷取資料,其中url就

是sAjaxSource,

同時傳遞一堆自定義的參數,包括需要顯示的起始記錄數,需要顯示的記錄數,

列數,排序

列等等,具體可以參看這裡http://www.datatables.net/usage/server-side。其中一個比較

特殊的是sEcho,這個參數需要以後原封不動地傳回給頁面。

由于預設是以$.getJSON發送請求,是以http指令是GET,參數是以url參數的方

式傳遞的,我

希望以POST指令,以json方式發送請求,而且要加上客戶名稱這個參數,是以這

裡需要做些修

改。

DataTables通過fnServerData提供了這樣一個接口,fnServerData是與伺服器端交換資料時被

調用的函數,預設實作是如上所說的通過getJSON發送請求,然後接收特定格式的json資料(這

個在伺服器端處理部分再說)。fnServerData會接到3個參數:

sSource: 接收資料的url,就是sAjaxSource中指定的位址

aoData:DataTables定義的參數,是一個數組,其中每個元素是一個name-value對,我需要

把客戶名稱這個參數加進去

fnCallback:伺服器傳回資料後的處理函數,我需要按DataTables期望的格式傳

入傳回資料

最後自定義的fnServerData如下所示:

Javascript代碼

function retrieveData( sSource, aoData, fnCallback ) {

//将客戶名稱加入參數數組

aoData.push( { "name": "customerName", "value": $("#customerName").val() } );

$.ajax( {

"type": "POST",

"contentType": "application/json",

"url": sSource,

"dataType": "json",

"data": JSON.stringify(aoData), //以json格式傳遞

"success": function(resp) {

fnCallback(resp.returnObject); //伺服器端傳回的對象的returnObject部分是要求的格式

}

});

}

function retrieveData( sSource, aoData, fnCallback ) {

//将客戶名稱加入參數數組

aoData.push( { "name": "customerName", "value": $("#customerName").val() } );

$.ajax( {

"type": "POST",

"contentType": "application/json",

"url": sSource,

"dataType": "json",

"data": JSON.stringify(aoData), //以json格式傳遞

"success": function(resp) {

fnCallback(resp.returnObject); //伺服器端

傳回的對象的returnObject部分是要求的格式

}

});

}

頁面的初始化及查詢按鈕的處理函數如下所示:

Javascript代碼

var oTable = null;

$(function() {

$("#customerInfo").hide();

} );

//“檢索”按鈕的處理函數

function search() {

if (oTable == null) { //僅第一次檢索時初始化Datatable

$("#customerInfo").show();

oTable = $('#customerInfo').dataTable( {

"bAutoWidth": false, //不自動計算列寬度

"aoColumns": [ //設定各列寬度

{"sWidth": "15px"},

{"sWidth": "80px"},

{"sWidth": "160px"},

{"sWidth": "110px"},

{"sWidth": "120px"},

{"sWidth": "140px"},

{"sWidth": "140px"},

{"sWidth": "*"}

],

"bProcessing": true, //加載資料時顯示正在加載資訊

"bServerSide": true, //指定從伺服器端擷取資料

"bFilter": false, //不使用過濾功能

"bLengthChange": false, //使用者不可改變每頁顯示數量

"iDisplayLength": 8, //每頁顯示8條資料

"sAjaxSource": "customerInfo/search.do",//擷取資料的url

"fnServerData": retrieveData, //擷取資料的處理函數

"sPaginationType": "full_numbers", //翻頁界面類型

"oLanguage": { //漢化

"sLengthMenu": "每頁顯示 _MENU_ 條記錄",

"sZeroRecords": "沒有檢索到資料",

"sInfo": "目前資料為從第 _START_ 到第 _END_ 條資料;總共有 _TOTAL_ 條記錄",

"sInfoEmtpy": "沒有資料",

"sProcessing": "正在加載資料...",

"oPaginate": {

"sFirst": "首頁",

"sPrevious": "前頁",

"sNext": "後頁",

"sLast": "尾頁"

}

}

});

}

//重新整理Datatable,會自動激發retrieveData

oTable.fnDraw();

}

var oTable = null;

$(function() {

$("#customerInfo").hide();

} );

//“檢索”按鈕的處理函數

function search() {

if (oTable == null) { //僅第一次檢索時初始化Datatable

$("#customerInfo").show();

oTable = $('#customerInfo').dataTable( {

"bAutoWidth": false, //不自動計算列寬度

"aoColumns": [ //設定各列寬度

{"sWidth": "15px"},

{"sWidth": "80px"},

{"sWidth": "160px"},

{"sWidth": "110px"},

{"sWidth": "120px"},

{"sWidth": "140px"},

{"sWidth": "140px"},

{"sWidth": "*"}

],

"bProcessing": true, //加載資料時顯示正在加載資訊

"bServerSide": true, //指定從伺服器端擷取資料

"bFilter": false, //不使用過濾功能

"bLengthChange": false, //使用者不可改變每頁顯示數量

"iDisplayLength": 8, //每頁顯示8條資料

"sAjaxSource": "customerInfo/search.do",

//擷取資料的url

"fnServerData": retrieveData, //擷取資料的處理函數

"sPaginationType": "full_numbers", //翻頁界面類型

"oLanguage": { //漢化

"sLengthMenu": "每頁顯示 _MENU_ 條記錄",

"sZeroRecords": "沒有檢索到資料",

"sInfo": "目前資料為從第 _START_ 到第 _END_ 條資料;總共有 _TOTAL_ 條記錄",

"sInfoEmtpy": "沒有資料",

"sProcessing": "正在加載資料...",

"oPaginate": {

"sFirst": "首頁",

"sPrevious": "前頁",

"sNext": "後頁",

"sLast": "尾頁"

}

}

});

}

//重新整理Datatable,會自動激發retrieveData

oTable.fnDraw();

}

2 伺服器端

頁面請求的參數是一個數組,其中每個元素是一個name-value對,我如下定義

Java代碼

public class JSONParam {

private String name;

private String value;

//略

}

public class JSONParam {

private String name;

private String value;

//略

}

對應的處理函數如下定義:

Java代碼

@RequestMapping(value = "/search", method = RequestMethod.POST)

@ResponseBody

public JSONResponse search(@RequestBody JSONParam[] params)

{

//略

}

@RequestMapping(value = "/search",

method = RequestMethod.POST)

@ResponseBody

public JSONResponse search(@RequestBody JSONParam[] params){

//略

}

在這個函數裡大緻的處理是先取出所需的參數,然後檢索資料,最後将

DataTables期望的

格式的資料放入傳回對象JSONResponse的returnObject部分。

DataTables期望的資料格式如下:

{

"sEcho": 頁面發來的參數,原樣傳回,

"iTotalRecords": 過濾前總記錄數,

"iTotalDisplayRecords": 過濾後總記錄數,我沒有使用過濾,不太清楚和iTotalRecords的差別,

"aaData": 包含資料的2維數組

}

對應的java定義如下:

Java代碼

public class DataTableReturnObject {

private long iTotalRecords;

private long iTotalDisplayRecords;

private String sEcho;

private String[][] aaData;

public DataTableReturnObject(long totalRecords, long totalDisplayRecords, String echo, String[][] d) {

//略

}

//略

}

public class DataTableReturnObject {

private long iTotalRecords;

private long iTotalDisplayRecords;

private String sEcho;

private String[][] aaData;

public DataTableReturnObject(long totalRecords, long totalDisplayRecords, String echo, String[][] d) {

//略

}

//略

}

完整的伺服器端處理函數如下:

Java代碼

@RequestMapping(value = "/search", method = RequestMethod.POST)

@ResponseBody

public JSONResponse search(@RequestBody JSONParam[] params) throws IllegalAccessException, InvocationTargetException

//convertToMap定義于父類,将參數數組中的所有元素加入一個HashMap

HashMap paramMap = convertToMap(params);

String sEcho = paramMap.get("sEcho");

String customerName = paramMap.get("customerName");

int start = Integer.parseInt(paramMap.get("iDisplayStart"));

int length = Integer.parseInt(paramMap.get("iDisplayLength"));

  1. //customerService.search傳回的第一個元素是滿足查詢條件的記錄總數,

    後面的是

    //頁面目前頁需要顯示的記錄資料

    List<Object> customerList = customerService.search(customerName, start, length);   

  2.     Long count = (Long)customerList.get( 0 );   
  3.      //将查詢結果轉換為一個二維數組   
  4.      int  record = customerList.size() -  1 ;   
  5.     String[][] data =  new  String[record][];   
  6.      for ( int  i= 0 ; i<record; i++) {   
  7.         Customer customer = (Customer)customerList.get(i+ 1 );   
  8.         JSONCustomer jsonCustomer =  new  JSONCustomer();   
  9.         BeanUtils.copyProperties(jsonCustomer, customer);   
  10.         data[i] = jsonCustomer.toArray();   
  11.     }   
  12.      return  successed( new  DataTableReturnObject(count.longValue(), count.longValue(), sEcho, data));