最近群里有很多人询问有关DataTables的问题,所以就抽空写出此篇,希望能够为各位提供一些帮助。

在正式阅读正文之前,我需要先声明以下几点:
1.我不是DataTables的专业开发人员,DT也不是我的主攻方向,实际上我研究DT也就1个多礼拜。所以很多深层次的问题,可能我并不懂,这也不是本文的讨论范围。
2.要达到某个目的可能有很多种方式,所以我接下来提出的解决方式可能并不是专业、完美、高效的。如果您有更好的解决方法,请在后面跟帖,如果确实有效,那我感谢您,反之就当做是多个了解。知识在于交流和共享!
3.有的朋友可能会问,为什么要这么写?这段代码的用意是什么?...对于这些问题,我还是希望你直接去群里问方便些(QQ群号:170222260)。同时告诉您一个道理,这世界上很多事情都是这样,别人说100遍不如你做1遍有效果,很多问题只要你自己把那段代码注释掉或者把自己的想法加进去,你就自然而然的知晓答案了。

以下是正文:

部分代码如下:

    1. var docrTable = $('#docrevisontable').dataTable({
    2.             "bProcessing" : true, //DataTables载入数据时,是否显示‘进度’提示
    3.             "bServerSide" : true, //是否启动服务器端数据导入
    4.             "bStateSave" : true, //是否打开客户端状态记录功能,此功能在ajax刷新纪录的时候不会将个性化设定回复为初始化状态
    5.             "bJQueryUI" : true, //是否使用 jQury的UI theme
    6.             "sScrollY" : 450, //DataTables的高
    7.             "sScrollX" : 820, //DataTables的宽
    8.             "aLengthMenu" : [20, 40, 60], //更改显示记录数选项
    9.             "iDisplayLength" : 40, //默认显示的记录数
    10.             "bAutoWidth" : false, //是否自适应宽度
    11.             //"bScrollInfinite" : false, //是否启动初始化滚动条
    12.             "bScrollCollapse" : true, //是否开启DataTables的高度自适应,当数据条数不够分页数据条数的时候,插件高度是否随数据条数而改变
    13.             "bPaginate" : true, //是否显示(应用)分页器
    14.             "bInfo" : true, //是否显示页脚信息,DataTables插件左下角显示记录数
    15.             "sPaginationType" : "full_numbers", //详细分页组,可以支持直接跳转到某页
    16.             "bSort" : true, //是否启动各个字段的排序功能
    17.             "aaSorting" : [[1, "asc"]], //默认的排序方式,第2列,升序排列
    18.             "bFilter" : true, //是否启动过滤、搜索功能
    19.                     "aoColumns" : [{
    20.                         "mDataProp" : "USERID",
    21.                         "sDefaultContent" : "", //此列默认值为"",以防数据中没有此值,DataTables加载数据的时候报错
    22.                         "bVisible" : false //此列不显示
    23.                     }, {
    24.                         "mDataProp" : "USERNAME",
    25.                         "sTitle" : "用户名",
    26.                         "sDefaultContent" : "",
    27.                         "sClass" : "center"
    28.                     }, {
    29.                         "mDataProp" : "EMAIL",
    30.                         "sTitle" : "电子邮箱",
    31.                         "sDefaultContent" : "",
    32.                         "sClass" : "center"
    33.                     }, {
    34.                         "mDataProp" : "MOBILE",
    35.                         "sTitle" : "手机",
    36.                         "sDefaultContent" : "",
    37.                         "sClass" : "center"
    38.                     }, {
    39.                         "mDataProp" : "PHONE",
    40.                         "sTitle" : "座机",
    41.                         "sDefaultContent" : "",
    42.                         "sClass" : "center"
    43.                     }, {
    44.                         "mDataProp" : "NAME",
    45.                         "sTitle" : "姓名",
    46.                         "sDefaultContent" : "",
    47.                         "sClass" : "center"
    48.                     }, {
    49.                         "mDataProp" : "ISADMIN",
    50.                         "sTitle" : "用户权限",
    51.                         "sDefaultContent" : "",
    52.                         "sClass" : "center"
    53.                     }],
    54.                     "oLanguage": { //国际化配置
    55.                 "sProcessing" : "正在获取数据,请稍后...",  
    56.                 "sLengthMenu" : "显示 _MENU_ 条",  
    57.                 "sZeroRecords" : "没有您要搜索的内容",  
    58.                 "sInfo" : "从 _START_ 到  _END_ 条记录 总记录数为 _TOTAL_ 条",  
    59.                 "sInfoEmpty" : "记录数为0",  
    60.                 "sInfoFiltered" : "(全部记录数 _MAX_ 条)",  
    61.                 "sInfoPostFix" : "",  
    62.                 "sSearch" : "搜索",  
    63.                 "sUrl" : "",  
    64.                 "oPaginate": {  
    65.                     "sFirst" : "第一页",  
    66.                     "sPrevious" : "上一页",  
    67.                     "sNext" : "下一页",  
    68.                     "sLast" : "最后一页"  
    69.                 }
    70.             },
    71.                     
    72.                     "fnRowCallback" : function(nRow, aData, iDisplayIndex) {
    73.                         /* 用来改写用户权限的 */
    74.                         if (aData.ISADMIN == '1')
    75.                             $('td:eq(5)', nRow).html('管理员');
    76.                         if (aData.ISADMIN == '2')
    77.                             $('td:eq(5)', nRow).html('资料下载');
    78.                         if (aData.ISADMIN == '3')
    79.                             $('td:eq(5)', nRow).html('一般用户');
    80.                         
    81.                         return nRow;
    82.                     },
    83.                     
    84.                     "sAjaxSource" : "../use/userList.do?now=" + new Date().getTime(),
    85.                         //服务器端,数据回调处理
    86.                             "fnServerData" : function(sSource, aDataSet, fnCallback) {
    87.                                 $.ajax({
    88.                                     "dataType" : 'json',
    89.                                     "type" : "POST",
    90.                                     "url" : sSource,
    91.                                     "data" : aDataSet,
    92.                                     "success" : fnCallback
    93.                                 });
    94.                             }
    95.                 });
    96.                 
    97.                 $("#docrevisontable tbody").click(function(event) { //当点击表格内某一条记录的时候,会将此记录的cId和cName写入到隐藏域中
    98.                     $(docrTable.fnSettings().aoData).each(function() {
    99.                         $(this.nTr).removeClass('row_selected');
    100.                     });
    101.                     $(event.target.parentNode).addClass('row_selected');
    102.                     var aData = docrTable.fnGetData(event.target.parentNode);
    103.                     
    104.                     $("#userId").val(aData.USERID);
    105.                     $("#userN").val(aData.USERNAME);
    106.                 });
    107.                 
    108.                 $('#docrevisontable_filter').html('<span>用户管理列表');
    109.                 $('#docrevisontable_filter').append('   <input type="button" class="addBtn" id="addBut" value="创建"/>');
    110.                 $('#docrevisontable_filter').append('   <input type="button" class="addBtn" id="addBut" value="修改"/>');
    111.                 $('#docrevisontable_filter').append('   <input type="button" class="addBtn" id="addBut" value="删除"/>');
    112.                 $('#docrevisontable_filter').append('</span>');
    113.         }


    复制代码

    以上是生成第一张图片的DataTables初始化代码,后面的代码是DataTables初始化数据请求以及排序的java后台代码:


    Action:

      1. public class UserListAction extends ListAction {
      2.         private ListService userServiceList;
      3.         
      4.         public ListService getUserServiceList() {
      5.                 return userServiceList;
      6.         }
      7. 
      8.         public void setUserServiceList(ListService userServiceList) {
      9.                 this.userServiceList = userServiceList;
      10.         }
      11.         
      12.         private static List<String> getColumnList(){
      13.                 List columnList = new ArrayList();
      14.                 
      15.                 columnList.add("user_id");
      16.                 columnList.add("user_name");
      17.                 columnList.add("email");
      18.                 columnList.add("mobile");
      19.                 columnList.add("phone");
      20.                 columnList.add("name");
      21.                 columnList.add("isadmin");
      22.                 
      23.                 return columnList;
      24.         }
      25. 
      26.         public void getList() {
      27.                 try {
      28.                         Map<String, String> map = super.getParamMap();
      29.                         
      30.                         int len = Integer.parseInt(map.get("iDisplayLength") == null ? "0" : map.get("iDisplayLength")); //每页显示多少条数据
      31.                         
      32.                         int limt = Integer.parseInt(map.get("iDisplayStart") == null ? "0" : map.get("iDisplayStart")); //当前页的第一条纪录的索引号
      33.                         
      34.                         String orderCol = getColumnList().get(Integer.parseInt(map.get("iSortCol_0"))); //排序字段
      35.                         
      36.                         String sSortDir_0 = map.get("sSortDir_0"); //升、降序
      37.                         
      38.                         String sSearch = map.get("sSearch"); //搜索关键字
      39.                         
      40.                         List list = this.getUserServiceList().getPagingDataList(map, len, limt, orderCol, sSortDir_0);
      41.                         
      42.                         Map returnMap = new HashMap();
      43.                         
      44.                         returnMap.put("sEcho", super.getSEcho());
      45.                         returnMap.put("iTotalRecords", this.getUserServiceList().getCount(null));
      46.                         returnMap.put("iTotalDisplayRecords", this.getUserServiceList().getCount(null));
      47.                         returnMap.put("aaData", list);
      48.                         
      49.                         super.outJson(returnMap);
      50.                 } catch (Exception e) {
      51.                         Logger.error(e.getMessage());
      52.                         
      53.                         Map map = new HashMap();
      54.                         
      55.                         map.put("sEcho", super.getSEcho());
      56.                         map.put("iTotalRecords", 0);
      57.                         map.put("iTotalDisplayRecords", 0);
      58.                         map.put("aaData", new ArrayList());
      59.                         
      60.                         super.outJson(map);
      61.                 }
      62.         }
      63. }


      复制代码

      ServiceImpl:

        1. /**
        2. * “用户管理”页的DataTables获取数据的ServiceImpl
        3. */
        4. public class UserListServiceImpl implements ListService {
        5.         public List getPagingDataList(Map map, int len, int limt, String orderCol,String orderWay) {
        6.                 SqlBuilder.SELECT("a.user_id AS userId, a.user_name AS userName, a.email AS email, a.mobile AS mobile, a.phone AS phone, a.name AS name, a.isadmin AS isAdmin");
        7.                 SqlBuilder.FROM("t_users a");
        8.                 SqlBuilder.ORDER_BY(orderCol + " " + orderWay);
        9.             
        10.                 String sql = SqlBuilder.SQL();
        11.                 
        12.                 List list = DBUtils.executeSelectDynamic(sql, len, limt);
        13.                 
        14.                 return list;
        15.     }
        16. 
        17.     public int getCount(Map map) {
        18.         return Integer.parseInt(String.valueOf(((Map) DBUtils.executeSelectDynamic("select count(*) as count from t_users").get(0)).get("COUNT")));
        19.     }
        20. }


        复制代码

        最后附上一个很重要的Action,此Action中的get,set方法不要随意更改(包括方法名的大小写),因为我试过,更改了之后是取不到前台传过来的参数值的:

          1. /**
          2. * 用于获取前台DataTables插件一些参数的Action
          3. */
          4. public class ListAction extends BaseAction {
          5.         private String iSortCol_0; //排序字段所对应的索引号
          6.         private String sSortDir_0; //排序字段的排序方式,升、降序
          7.         private String iDisplayLength; //默认显示的记录数
          8.         private String iDisplayStart; //当前页的第一条纪录的索引号
          9.         private String sSearch; //用于搜索的关键字
          10.         private String sEcho; //当前页面的第N次请求数据
          11.         private String iSortingCols;
          12.         private String iSortCol_; 
          13.         
          14.         public String getISortCol_0() {
          15.     return iSortCol_0;
          16.         }
          17. 
          18.         public void setISortCol_0(String sortCol_0) {
          19.     iSortCol_0 = sortCol_0;
          20.         }
          21.         
          22.         public String getSSortDir_0() {
          23.     return sSortDir_0;
          24.         }
          25. 
          26.         public void setSSortDir_0(String sortDir_0) {
          27.     sSortDir_0 = sortDir_0;
          28.         }
          29. 
          30.         public String getIDisplayLength() {
          31.     return iDisplayLength;
          32.         }
          33. 
          34.         public void setIDisplayLength(String displayLength) {
          35.     iDisplayLength = displayLength;
          36.         }
          37.         
          38.         public String getIDisplayStart() {
          39.     return iDisplayStart;
          40.         }
          41. 
          42.         public void setIDisplayStart(String displayStart) {
          43.     iDisplayStart = displayStart;
          44.         }
          45.         
          46.         public String getSSearch() {
          47.     return sSearch;
          48.         }
          49. 
          50.         public void setSSearch(String search) {
          51.     sSearch = search;
          52.         }
          53.         
          54.         public String getSEcho() {
          55.     return sEcho;
          56.         }
          57. 
          58.         public void setSEcho(String echo) {
          59.     sEcho = echo;
          60.         }
          61.         
          62.         public String getISortingCols() {
          63.     return iSortingCols;
          64.         }
          65. 
          66.         public void setISortingCols(String sortingCols) {
          67.     iSortingCols = sortingCols;
          68.         }
          69.         
          70.         public String getISortCol_() {
          71.     return iSortCol_;
          72.         }
          73. 
          74.         public void setISortCol_(String sortCol_) {
          75.     iSortCol_ = sortCol_;
          76.         }
          77. 
          78.         public Map<String, String> getParamMap() {
          79.     Map map = new HashMap();
          80.                 
          81.     map.put("iSortCol_0", this.getISortCol_0());
          82.     map.put("sSortDir_0", this.getSSortDir_0());
          83.     map.put("iDisplayLength", this.getIDisplayLength());
          84.     map.put("iDisplayStart", this.getIDisplayStart());
          85.     map.put("sSearch", this.getSSearch());
          86.     map.put("sEcho", this.getSEcho());
          87. 
          88.     return map;
          89.         }
          90. 
          91.         protected void outString(String str) {
          92.     try {
          93.         this.getResponse().setContentType("text/html;charset=UTF-8");
          94.         PrintWriter out = getResponse().getWriter();
          95.         Logger.debug(str);
          96.         out.write(str);
          97.     } catch (IOException e) {
          98.         Logger.error(e.getMessage());
          99.     }
          100.         }
          101. 
          102. }


          复制代码


          顺带说一句,很多人不习惯使用firebug跟进去看具体内容,这样会造成很多时候看的云里雾里的。下面我放一些firebug的截图上来,其实对着自己的firebug看一下,很多简单的问题就自然揭晓了。



          最后感谢武汉-饭太稀-java朋友的提醒,添加了ListAction中缺少的getParamMap方法。