2019独角兽企业重金招聘Python工程师标准>>>

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

原文地址:http://blog.csdn.net/hy840429/article/details/5626878

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. <th>身高</th>
  6. </tr>
  7. </thead>
  8. <tbody>
  9. <tr>
  10. <td colspan="8"></td>
  11. </tr>
  12. </tbody>
  13. <tfoot>
  14. <tr>
  15. <th>ID</th>
  16. <th>身高</th>
  17. </tr>
  18. </tfoot>
  19. </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. $.ajax( {
  5. "type": "POST",
  6. "contentType": "application/json",
  7. "url": sSource,
  8. "dataType": "json",
  9. "data": JSON.stringify(aoData), //以json格式传递
  10. "success": function(resp) {
  11. fnCallback(resp.returnObject); //服务器端返回的对象的returnObject部分是要求的格式
  12. }
  13. });
  14. }

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

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

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

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

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

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. public DataTableReturnObject(long totalRecords, long totalDisplayRecords, String echo, String[][] d) {
  7. //略
  8. }
  9. //略
  10. }

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

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. //customerService.search返回的第一个元素是满足查询条件的记录总数,后面的是
  11. //页面当前页需要显示的记录数据
  12. List<Object> customerList = customerService.search(customerName, start, length);
  13. Long count = (Long)customerList.get(0);
  14. //将查询结果转换为一个二维数组
  15. int record = customerList.size() - 1;
  16. String[][] data = new String[record][];
  17. for(int i=0; i<record; i++) {
  18. Customer customer = (Customer)customerList.get(i+1);
  19. JSONCustomer jsonCustomer = new JSONCustomer();
  20. BeanUtils.copyProperties(jsonCustomer, customer);
  21. data[i] = jsonCustomer.toArray();
  22. }
  23. return successed(new DataTableReturnObject(count.longValue(), count.longValue(), sEcho, data));
  24. }

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

转载于:https://my.oschina.net/u/2260184/blog/540575

DataTables—服务器端翻页相关推荐

  1. 用AjaxPro实现无刷新翻页效果及数据库分页技术介绍

    在看本文之前,建议查看本人的系列文章: <AjaxPro与服务器端交互过程中如何传值>:http://blog.csdn.net/zhoufoxcn/archive/2008/01/05/ ...

  2. 关于Page翻页效果--Page View Controller

    Page View Controllers 你使用一个page view controller用page by page的方式来展示内容.一个page view controller管理一个self- ...

  3. elementUI 写一个表头列名、表体单元格样式、翻页器相对较为动态的表格el-table

    <template><!-- 表格---------------------------------------- --><div class="table&q ...

  4. 翻页导航条页码计算方法

    在开发搜索引擎等应用时,提供一个翻页导航条是必须的.我看过网上一些相关的代码,搞得很复杂.晕~~~ 其实其数学计算公式非常简单,本文提供两种最常用的算法. 翻页式 样式如下.每次显示10个页码,并提供 ...

  5. 微信小程序实现滑动翻页效果源码附效果图

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: 微信小程序实现滑动翻页效果 效果图: 源码: <view class="mainFra ...

  6. 用jQuery写的一个翻页,并封装为插件,

    用jQuery写的一个翻页,并封装为插件, 1 *{ 2 margin:0; 3 padding: 0; 4 list-style: none; 5 text-decoration: none; 6 ...

  7. Linux之vim中翻页的命令

    Linux之vim中翻页的命令 当我们进入Linux的vim编辑器查看脚本时,按上下键查看是不是非常慢?这个时候就要用到我们的翻页快捷键了,快捷键命令如: 整页翻页 ctrl-f ctrl-b ctr ...

  8. Scrapy框架items数据建模、翻页请求、requests对象请求、meta参数的使用

    1. 数据建模 通常在做项目的过程中,在items.py中进行数据建模 1.1 为什么建模 定义item即提前规划好哪些字段需要抓,防止手误,因为定义好之后,在运行过程中,系统会自动检查 配合注释一起 ...

  9. oracle数据库如何写翻页_ORACLE数据库分页查询/翻页 最佳实践

    ORACLE数据库分页查询/翻页 最佳实践 一.示例数据: Select Count(*) From dba_objects ; ----------------------------------- ...

最新文章

  1. 计算机在档案管理中的应用,浅谈计算机在档案管理中的应用
  2. query插件之ajaxForm ajaxSubmit的理解用法
  3. 中南大学计算机辅助工艺设计,中南大学计算机辅助制造大作业.doc
  4. 几种TCP连接中出现RST的情况
  5. Storage medium
  6. 学习《FreeRTOS源码详解与应用开发》笔记
  7. Linux服务器SSH免密登录
  8. 计算机实验报告表九,北理大学计算机实验基础实验九实验报告表-20210617084645.pdf-原创力文档...
  9. pid算法matlab仿真程序和c程序,pid算法matlab仿真程序和c程序.doc
  10. anaconda下载太慢怎么办_Windows10下anaconda成功运行Cython
  11. python webdriver脚本例子_python-webdriver 开始第一个脚本
  12. Android——Intent总结
  13. MySQL数据库、表常用命令
  14. Kali之——菜单中各工具功能
  15. 诺基亚如何利用计算机上网,诺基亚手机连接wifi的方法步骤
  16. 7-16 约分最简分式
  17. Python的IDEL增加清屏功能
  18. created()和activated()的区别
  19. 转载——服务器误删文件的恢复过程
  20. HashMap存储自定义类型键值: 重写HashCode和equals方法

热门文章

  1. [jQuery基础] jQuery动效案例(一) -- 弹窗广告、对联广告
  2. javascirpt如何模仿块级作用域(js高程笔记)
  3. 服务器系统怎么找便签,Win10电脑怎么找回便签记录?如何恢复误删的内容?
  4. 4024-砾石的交换排序(C++,附思路)
  5. 3006基于二叉链表的二叉树最长路径的求解(附思路)
  6. 登录页面(通过数据库查询密码是否正确)
  7. Qt随笔 - QSettings
  8. 扫雷游戏(NOIP2015 普及组第二题)
  9. Edge好用么?几条你不知道的Edge小技巧
  10. C#递归遍历指定目录下文件和文件夹