DataTables—服务器端翻页

本文是jquery<--json-->spring(3.0)系列的第三篇。


jquery与yui相比,感觉写法很简洁,但也有个问题是配套的jquery ui中的页面控件 
不是很全,很多要借助plugin,而这些plugin良莠不齐,选用时要自己好好挑一挑。 
列表是一个常用的页面控件,我选了半天发现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代码 

  1. $('#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代码 

  1. function retrieveData( sSource, aoData, fnCallback ) {   
  2.     //将客户名称加入参数数组   
  3.     aoData.push( { "name": "customerName", "value": $("#customerName").val() } );   
  4.   
  5.     $.ajax( {   
  6.         "type": "POST",    
  7.         "contentType": "application/json",   
  8.         "url": sSource,    
  9.         "dataType": "json",   
  10.         "data": JSON.stringify(aoData), //以json格式传递   
  11.         "success": function(resp) {   
  12.             fnCallback(resp.returnObject); //服务器端返回的对象的returnObject部分是要求的格式  
  13.         }   
  14.     });   
  15. }  



页面的初始化及查询按钮的处理函数如下所示:

Javascript代码 

  1. var oTable = null;   
  2.   
  3. $(function() {   
  4.     $("#customerInfo").hide();   
  5. } );   
  6.   
  7. //“检索”按钮的处理函数   
  8. function search() {   
  9.     if (oTable == null) { //仅第一次检索时初始化Datatable   
  10.         $("#customerInfo").show();   
  11.         oTable = $('#customerInfo').dataTable( {   
  12.             "bAutoWidth": false,                    //不自动计算列宽度   
  13.             "aoColumns": [                          //设定各列宽度   
  14.                             {"sWidth": "15px"},   
  15.                             {"sWidth": "80px"},   
  16.                             {"sWidth": "160px"},   
  17.                             {"sWidth": "110px"},   
  18.                             {"sWidth": "120px"},   
  19.                             {"sWidth": "140px"},   
  20.                             {"sWidth": "140px"},   
  21.                             {"sWidth": "*"}   
  22.                         ],   
  23.             "bProcessing": true,                    //加载数据时显示正在加载信息   
  24.             "bServerSide": true,                    //指定从服务器端获取数据   
  25.             "bFilter": false,                       //不使用过滤功能   
  26.             "bLengthChange": false,                 //用户不可改变每页显示数量   
  27.             "iDisplayLength": 8,                    //每页显示8条数据   
  28.             "sAjaxSource": "customerInfo/search.do",//获取数据的url   
  29.             "fnServerData": retrieveData,           //获取数据的处理函数   
  30.             "sPaginationType": "full_numbers",      //翻页界面类型   
  31.             "oLanguage": {                          //汉化   
  32.                 "sLengthMenu": "每页显示 _MENU_ 条记录",   
  33.                 "sZeroRecords": "没有检索到数据",   
  34.                 "sInfo": "当前数据为从第 _START_ 到第 _END_ 条数据;总共有 _TOTAL_ 条记录",   
  35.                 "sInfoEmtpy": "没有数据",   
  36.                 "sProcessing": "正在加载数据...",   
  37.                 "oPaginate": {   
  38.                     "sFirst": "首页",   
  39.                     "sPrevious": "前页",   
  40.                     "sNext": "后页",   
  41.                     "sLast": "尾页"  
  42.                 }   
  43.             }   
  44.         });   
  45.     }   
  46.   
  47.     //刷新Datatable,会自动激发retrieveData   
  48.     oTable.fnDraw();   
  49. }  



2 服务器端 
页面请求的参数是一个数组,其中每个元素是一个name-value对,我如下定义

Java代码 

  1. public class JSONParam {   
  2.     private String name;   
  3.     private String value;   
  4.        
  5.     //略   
  6. }  


对应的处理函数如下定义:

Java代码 

  1. @RequestMapping(value = "/search", method = RequestMethod.POST)   
  2. @ResponseBody  
  3. public JSONResponse search(@RequestBody JSONParam[] params){   
  4.     //略   
  5. }  


在这个函数里大致的处理是先取出所需的参数,然后检索数据,最后将DataTables期望的 
格式的数据放入返回对象JSONResponse的returnObject部分。 
DataTables期望的数据格式如下: 

    "sEcho": 页面发来的参数,原样返回, 
    "iTotalRecords": 过滤前总记录数, 
    "iTotalDisplayRecords": 过滤后总记录数,我没有使用过滤,不太清楚和iTotalRecords的区别, 
    "aaData": 包含数据的2维数组 


对应的java定义如下:

Java代码 

  1. public class DataTableReturnObject {   
  2.     private long iTotalRecords;   
  3.     private long iTotalDisplayRecords;   
  4.     private String sEcho;   
  5.     private String[][] aaData;   
  6.        
  7.     public DataTableReturnObject(long totalRecords, long totalDisplayRecords, String echo, String[][] d) {   
  8.         //略   
  9.     }   
  10.        
  11.     //略   
  12. }  



完整的服务器端处理函数如下:

Java代码 

  1. @RequestMapping(value = "/search", method = RequestMethod.POST)   
  2. @ResponseBody  
  3. public JSONResponse search(@RequestBody JSONParam[] params) throws IllegalAccessException, InvocationTargetException    
  4.     //convertToMap定义于父类,将参数数组中的所有元素加入一个HashMap   
  5.     HashMap<String, String> paramMap = convertToMap(params);   
  6.     String sEcho = paramMap.get("sEcho");   
  7.     String customerName = paramMap.get("customerName");   
  8.     int start = Integer.parseInt(paramMap.get("iDisplayStart"));   
  9.     int length = Integer.parseInt(paramMap.get("iDisplayLength"));   
  10.        
  11.     //customerService.search返回的第一个元素是满足查询条件的记录总数,后面的是   
  12.     //页面当前页需要显示的记录数据   
  13.     List<Object> customerList = customerService.search(customerName, start, length);   
  14.     Long count = (Long)customerList.get(0);   
  15.        
  16.     //将查询结果转换为一个二维数组   
  17.     int record = customerList.size() - 1;   
  18.     String[][] data = new String[record][];   
  19.     for(int i=0; i<record; i++) {   
  20.         Customer customer = (Customer)customerList.get(i+1);   
  21.         JSONCustomer jsonCustomer = new JSONCustomer();   
  22.         BeanUtils.copyProperties(jsonCustomer, customer);   
  23.         data[i] = jsonCustomer.toArray();   
  24.     }   
  25.        
  26.     return successed(new DataTableReturnObject(count.longValue(), count.longValue(), sEcho, data));   
  27. }  



数据返回到页面后,如上所述,取出response中的returnObject交给DataTables的函数进行处理 
就可以了 

### 回答1: 你可以通过以下两种方式来设置DataTables大量分页: 1. 通过设置每页显示的记录条数来减少分页数。可以通过设置每页显示的记录条数,比如每页显示50条记录,来减少分页数。这样可以减少服务器端的负载,并提高页面加载速度。 2. 通过使用服务器端分页来实现。服务器端分页是将数据库中的所有记录一次性获取并存储在服务器内存中,然后根据需要分页显示记录。这样可以避免前端页面与服务器端的多次通信,降低服务器端的负载,提高页面加载速度。 请注意,以上两种方式需要根据实际的业务需求和数据量进行选择。如果数据量很大或者涉及到多表关联查询,那么使用服务器端分页会更加合适。如果数据量比较小,且分页查询比较频繁,那么就可以考虑使用前端分页。 ### 回答2: DataTables是一个常用的数据表格插件,用于在网页上展示和处理大量数据。要设置DataTables的大量分页,可以按照以下步骤进行: 1. 导入DataTables插件:在网页中引入DataTables的相关文件,包括CSS和JavaScript文件。 2. 创建一个HTML表格:在网页中创建一个HTML表格,用于展示数据。 3. 初始化DataTables:使用JavaScript代码初始化DataTables插件,并关联到HTML表格上。可以指定一些参数来配置DataTables的行为,比如分页大小、排序方式等。 4. 加载数据:根据需要,可以使用Ajax或其他方式加载大量的数据,并填充到HTML表格中。 5. 分页设置:根据需要,可以设置DataTables的分页大小和显示页码的数量。分页大小定义了每页显示的数据条数,而显示页码的数量决定了页面下方的页码导航栏上可见的页码数量。 6. 自定义分页样式:可以自定义CSS样式来美化分页导航栏,使其更符合网页的设计风格。 7. 配置分页回调函数:DataTables提供了一些回调函数,可以在分页事件发生时执行自定义的处理逻辑。例如,可以在翻页时重新加载新的数据。 通过以上步骤,我们可以设置DataTables插件以处理大量数据的分页展示需求。根据具体的情况,可以根据DataTables提供的参数和回调函数进行更高级的设置和定制。 ### 回答3: DataTables是一个用于处理大量数据的JavaScript插件,它提供了丰富的功能和选项来进行数据分页。下面是一些设置DataTables进行大量分页的方法: 1. 分页器设置:使用`paging`选项来设置分页器的样式和显示。可以设置每页显示的记录数量,以及是否显示分页器。例如,通过将`paging: true`设置为`paging: false`,可以禁用分页器。 2. 分页模式设置:使用`pagingType`选项来设置分页模式。DataTables提供了多种分页模式,如简单数字导航、多页块以及滚动分页等。选择合适的分页模式可以提升用户体验。 3. AJAX分页:对于大量数据,可以使用Ajax加载数据,并通过`serverSide`选项将分页交由服务器处理。这样可以避免一次性加载大量数据,提高分页的性能和响应速度。 4. 自定义分页按钮:使用`pagingNumbers`选项可以自定义分页按钮的显示。你可以通过修改分页按钮模板来更改其样式或添加自定义的元素。 5. 页码跳转:可以使用`pagingType`选项的`input`值来在分页器中添加页码跳转输入框。用户可以在输入框中输入页码,然后按下回车键或单击跳转按钮来跳转到指定页。 6. 分页事件:DataTables提供了多个分页相关的事件,如`page`和`length`事件。你可以通过监听这些事件来执行自定义操作,如加载其他数据、更新页面元素等。 总的来说,要设置DataTables进行大量分页,需要根据具体的需求和情况来选择适当的配置选项,并可以利用其提供的丰富功能和事件来进行自定义操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值