JQuery dataTable Java后台实用教程总结

一、servlet+dataTable原生态

目标:

使用jQuery Datatable构造数据列表,并且增加或者隐藏相应的列,已达到数据显示要求。同时,jQuery Datatable强大的功能支持:排序,分页,搜索等。

Query Datatable能良好支持数据完全加载到本地后构建数据列表,排序、分页、搜索等功能就会自带,不需要我们去关心,在此主要说明通过后台动态的加载数据,已达到在大数据面前提高效率的效果。

1. 通过后台进行分页

2. 通过后台进行排序

3. 通过后台进行搜索


具体使用方法:

1. 首先构建我们需要的数据列表,以及页面显示表格。

1
2
3
4
5
6
7
8
9
10
< table  id = "datatable"  width = "100%"  border = "1" >
     < thead >
         < tr >
             < th >ID</ th >
             < th >First Name</ th >
             < th >Last Name</ th >
             < th >Operation</ th >
         </ tr >
     < thead >
</ table >

表格建立很简单,只需用将表格定义好id,以及表头定义好。


2. 我们可以到jQuery Datatable官网上去下载一份jQueryjQuery Datatablejs库。https://datatables.net/examples/server_side/simple.html

wKiom1Nq7d3BrrQmAACVHW5gAbY810.jpg


3. 然后将这两个文件引入到页面文件中,注意jQuery的库一定要在最前面,因为页面加载的有顺序,保证后面的扩展库能使用到jQuery。同时,请下载最新的jQuery Datatable版本,因为它的写法以及参数更加简洁,功能更加多。【注:参数区别会在附录写明】


4. 编写前端代码。我们是要使用Ajax对后台进行请求,因此在配置datatable时,加上{"serverSide"true},已保证页面在加载时就请求后台,以及每次对datatable进行操作时也是请求后台。【附:如果想加上一点加载效果,可以增加{"processing"true}】。

配置请求后台URL{"ajax""load"}


5. 配置数据返回对应具体的列。在Datatable中,属性columns用来配置具体列的属性,包括对应的数据列名,是否支持搜索,是否显示,是否支持排序等。根据上述页面配置我们具体的列。如下:

1
2
3
4
5
6
7
8
9
10
11
12
$(document).ready( function () {
         $( "#datatable" ).dataTable({
             "processing" true ,
             "serverSide" true ,
             "ajax"  "load" ,
             "columns" : [
                 { "data" "id" "bSortable" false },
                 { "data" "firstName" },
                 { "data" "lastName" }
             ]
         });
     });

第一列ID,设置为不允许排序。也可以增加不显示:{"visible"false}


6. 此时对于后台而言,返回的数据一定要按照一定规范。如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
     "draw" : 2,
     "recordsTotal" : 11,
     "recordsFiltered" : 11,
     "data" : [
         {
             "id" : 1,
             "firstName" "Troy" ,
             "lastName" "Young"
         },
         {
             "id" : 2,
             "firstName" "Alice" ,
             "lastName" "LL"
         },
         {
             "id" : 3,
             "firstName" "Larry" ,
             "lastName" "Bird"
         }
         // ......
     ]
}

参数解释:

draw:表示请求次数

recordsTotal:总记录数

recordsFiltered:过滤后的总记录数

data:具体的数据对象数组


7. 最后一列Operation,我们没有任何数据,用来放我们的通用操作列,如修改链接。 Datatable提供了自定义列columnDefs属性,他的值为数组对象,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$(document).ready( function () {
         $( "#datatable" ).dataTable({
             "processing" true ,
             "serverSide" true ,
             "ajax"  "load" ,
             "columns" : [
                 { "data" "id" "bSortable" false },
                 { "data" "firstName" },
                 { "data" "lastName" }
             ],
             "columnDefs" : [
                 {
                     "targets" : [3],
                     "data" "id" ,
                     "render" function (data, type, full) {
                         return  "<a href='/update?id="  + data +  "'>Update</a>" ;
                     }
                 }
             ]
         });
     });

targets表示具体需要操作的目标列,下标从0开始

data: 表示我们需要的某一列数据对应的属性名

render:返回需要显示的内容。在此我们可以修改列中样式,增加具体内容

  属性列表:data, 之前属性定义中对应的属性值

                                type, 未知

    full,    全部数据值可以通过属性列名获取

具体效果图如下:

wKiom1Nq712jvx_1AADkJifD5bc689.jpg


8. 我们再来看具体如何进行搜索、排序、分页。由于只是为了做demo,因此使用最简单的JDBC+Servlet的方式来实现。

首先我们来看,datatable给我们在做请求是传递过来的参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
=============== Request Paramerters ================
draw:  1
columns[ 0 ][data]: id
columns[ 0 ][name]:
columns[ 0 ][searchable]:  true
columns[ 0 ][orderable]:  true
columns[ 0 ][search][value]:
columns[ 0 ][search][regex]:  false
columns[ 1 ][data]: firstName
columns[ 1 ][name]:
columns[ 1 ][searchable]:  true
columns[ 1 ][orderable]:  true
columns[ 1 ][search][value]:
columns[ 1 ][search][regex]:  false
columns[ 2 ][data]: lastName
columns[ 2 ][name]:
columns[ 2 ][searchable]:  true
columns[ 2 ][orderable]:  true
columns[ 2 ][search][value]:
columns[ 2 ][search][regex]:  false
order[ 0 ][column]:  0
order[ 0 ][dir]: asc
start:  0
length:  10
search[value]:
search[regex]:  false
_:  1399345292266
=============== Request Paramerters ================


其中有用的数据就是start, length, order[0][column], order[0][dir], search[value]。具体参数意思:

start: 其实记录位置

length:页面显示数量

order[0][column]: 因为是二维的表格,因此只有一维需要排序,所以order的下标未0. 该属性表示第几列需要排序。

order[0][dir]: 排序方式ASC | DESC

search[value]: search输入框中的值


9. 这几个属性对后台进行排序、搜索、分页很有用。【注:因为是二维表,并且只是对一列进行操作,自然就是一维的,所以order下标始终为1。以后操作二维表有待研究。】

首先来看包含这几个功能的DAO层代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/**
      * This method includes the search, sort, pagination
      * @param pageSize
      * @param startRecord
      * @param sortColumn
      * @param sortDir
      * @param searchValue
      * @return
      */
     public  List<Data> loadDataList( int  pageSize,  int  startRecord, String sortColumn, String sortDir, String searchValue) {
         List<Data> results =  new  ArrayList<Data>();
         StringBuffer sql =  new  StringBuffer( "select * from data " );
                              
         // for search
         String[] columnsName = {  "id" "firstName" "lastName"  };
         boolean  searchAble =  false ;
         if (searchValue !=  null  && ! "" .equals(searchValue)) {
             sql.append( "where " );
             searchAble =  true ;
         }
                              
         if (searchAble) {
             StringBuffer temp =  new  StringBuffer();
             for  (String column : columnsName) {
                 temp.append( column+  " like '%"  + searchValue +  "%' or " );
             }
             sql.append(temp.substring( 0 , temp.length() -  3 ));
         }
                              
         // for order
         sql.append( " order by "  + sortColumn +  " "  + sortDir +  " " );
                              
         // for pagination
         sql.append( " limit ?,? " );
         System.out.println(sql.toString());
                              
         try  {
             stmt = conn.prepareStatement(sql.toString());
             stmt.setInt( 1 , startRecord);
             stmt.setInt( 2 , startRecord + pageSize);
                                  
             ResultSet rs = stmt.executeQuery();
             while (rs.next()) {
                 Data data =  new  Data();
                 data.setId(rs.getInt( 1 ));
                 data.setFirstName(rs.getString( 2 ));
                 data.setLastName(rs.getString( 3 ));
                                      
                 results.add(data);
             }
                                  
         catch  (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
                              
         return  results;
     }

DAO层中,统计代码类似,只用把分页和排序的SQL拼接去掉即可。

我们需要将我们的数据转换成JSON返回给前端,并且还要显示总记录数,过滤后总记录数。因此我们需要一个统一的类来将这些数据进行封装。由于在一个系统中不只一个对象需要展示到前端,因此统一的做一个为datatable封装类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package  com.web.vo;
import  java.util.List;
/**
  * This VO used to generate the JSON data for data table, so please ensure that the attribute name is correct.
  * If you want to define the fields name by yourself, please visit: https://datatables.net
  * @author troyyang
  *
  * @param <T>
  */
public  class  DataVO<T> {
     private  int  draw;  // Client request times
     private  int  recordsTotal;  // Total records number without conditions
     private  int  recordsFiltered;  // Total records number with conditions
     private  List<T> data;  // The data we should display on the page
     // getter and setter method
}

万事具备,只欠前后交互代码。此处使用最简单的servlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// For pagination
         int  pageSize =  10 ;
         int  startRecord =  0 ;
         String size = request.getParameter( "length" );
         if  (! "" .equals(size) && size !=  null ) {
             pageSize = Integer.parseInt(size);
         }
         String currentRecord = request.getParameter( "start" );
         if  (! "" .equals(currentRecord) && currentRecord !=  null ) {
             startRecord = Integer.parseInt(currentRecord);
         }
         // For sortable
         String sortOrder = request.getParameter( "order[0][column]" );
         String sortDir = request.getParameter( "order[0][dir]" );
         System.out.println( "sortOrder: "  + sortOrder);
         System.out.println( "sortDir: "  + sortDir);
                      
         // For search
         String searchValue = request.getParameter( "search[value]" );
         int  count =  0 ;
         List<Data> results =  new  ArrayList<Data>();
         count = dao.count();
         results = dao.loadDataList(pageSize, startRecord, columnsName[Integer.parseInt(sortOrder)], sortDir, searchValue);
         DataVO<Data> result =  new  DataVO<Data>();
         result.setDraw(Integer.parseInt(request.getParameter( "draw" ) ==  null  "0"
                 : request.getParameter( "draw" )) +  1 );
         result.setData(results);
         result.setRecordsTotal(count);
         result.setRecordsFiltered(count);
         Gson gson =  new  Gson();
         String output = gson.toJson(result);
         System.out.println( "Output JSON: \n"  + output);
         PrintWriter out = response.getWriter();
         out.write(output);
         out.flush();
         out.close();

附录:

使用jQuery Datatable1.10之前的版本,必须使用sAjaxSource进行请求,但是请求数据和现在版本的请求数据不同,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
=============== Request Paramerters ================
sEcho:  1
iColumns:  4
sColumns: ,,,
iDisplayStart:  0
iDisplayLength:  10
mDataProp_0: id
sSearch_0:
bRegex_0:  false
bSearchable_0:  true
bSortable_0:  false
mDataProp_1: firstName
sSearch_1:
bRegex_1:  false
bSearchable_1:  true
bSortable_1:  true
mDataProp_2: lastName
sSearch_2:
bRegex_2:  false
bSearchable_2:  true
bSortable_2:  true
mDataProp_3: id
sSearch_3:
bRegex_3:  false
bSearchable_3:  true
bSortable_3:  true
sSearch:
bRegex:  false
iSortCol_0:  0
sSortDir_0: asc
iSortingCols:  1
_:  1399515247114
=============== Request Paramerters ================

二、springMVC+dataTable封装示例


本文章作为jQuery dataTable的简单应用实例,至于复杂的应用的样式修改参考官方文档。

(1)HTML代码

[html]  view plain  copy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>  
  2. <%--引入JSTL标签库的核心库 --%>  
  3. <%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>  
  4. <html>  
  5.     <head>  
  6.         <meta charset="utf-8" />  
  7.         <title>jQueryDataTable实例</title>  
  8.         <link rel="stylesheet" type="text/css" href="jquery.dataTables.min.css"/>  
  9.         <link rel="stylesheet" type="text/css" href="bootstrap.min.css"/>  
  10.         <link rel="stylesheet" type="text/css" href="dataTables.bootstrap.min.css"/>  
  11.     </head>  
  12.     <body>    
  13.     <table id="tb" class="display" >    
  14.         <thead>    
  15.             <tr>    
  16.                 <th>First Name</th>    
  17.                 <th>Last Name</th>  
  18.                 <th>Address</th>    
  19.             </tr>    
  20.         </thead>    
  21.         <tbody>    
  22.         </tbody>    
  23.     </table>    
  24.         
  25.     <script type="text/javascript" src="jquery-1.8.0.min.js"></script>    
  26.     <script type="text/javascript" src="jquery.dataTables.min.js"></script>    
  27.     <script type="text/javascript" src="dataTables.bootstrap.min.js"></script>    
  28.         
  29.     <script type="text/javascript">    
  30.         $(document).ready(function() {    
  31.             $("#tb").dataTable({      
  32.                 "bProcessing": false,                   // 是否显示取数据时的那个等待提示    
  33.                 "bServerSide": true,                    //这个用来指明是通过服务端来取数据    
  34.                 "sAjaxSource": "../tableDemoAjax",      //这个是请求的地址    
  35.                 "fnServerData": retrieveData            // 获取数据的处理函数    
  36.             });    
  37.         });    
  38.             
  39.         // 3个参数的名字可以随便命名,但必须是3个参数,少一个都不行    
  40.         function retrieveData( sSource,aoData, fnCallback) {    
  41.             $.ajax({    
  42.                 url : sSource,                              //这个就是请求地址对应sAjaxSource    
  43.                 data : {"aoData":JSON.stringify(aoData)},   //这个是把datatable的一些基本数据传给后台,比如起始位置,每页显示的行数 ,分页,排序,查询等的值   
  44.                 type : 'post',    
  45.                 dataType : 'json',    
  46.                 async : false,    
  47.                 success : function(result) {    
  48.                     fnCallback(result);                     //把返回的数据传给这个方法就可以了,datatable会自动绑定数据的    
  49.                 },    
  50.                 error : function(msg) {    
  51.                 }    
  52.             });    
  53.         }    
  54.     </script>    
  55.         
  56. </body>    
  57. </html>    


(2)java代码

[java]  view plain  copy
  1. <span style="font-size:14px;">package com.lt.dataTable;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import net.sf.json.JSONArray;  
  7. import net.sf.json.JSONObject;  
  8.   
  9. import org.springframework.stereotype.Controller;  
  10. import org.springframework.web.bind.annotation.RequestMapping;  
  11. import org.springframework.web.bind.annotation.RequestParam;  
  12. import org.springframework.web.bind.annotation.ResponseBody;  
  13.   
  14. @Controller  
  15. public class DataTableController {  
  16.       
  17.     @RequestMapping("tableDemoAjax")    
  18.     @ResponseBody    
  19.     public String tableDemoAjax(@RequestParam String aoData) {    
  20.         System.out.println("enter tableDemoAjax");  
  21.         JSONArray jsonarray = JSONArray.fromObject(aoData);    
  22.         String sEcho = null;      //记录操作的次数  
  23.         int iDisplayStart = 0;    // 起始索引    
  24.         int iDisplayLength = 0;   // 每页显示的行数    
  25.           
  26.           
  27.         //这里获取从前台传递过来的参数,从而确保是否分页、是否进行查询、是否排序等  
  28.         for (int i = 0; i < jsonarray.size(); i++) {    
  29.             JSONObject obj = (JSONObject) jsonarray.get(i);    
  30.             if (obj.get("name").equals("sEcho"))    
  31.                 sEcho = obj.get("value").toString();    
  32.         
  33.             if (obj.get("name").equals("iDisplayStart"))    
  34.                 iDisplayStart = obj.getInt("value");    
  35.         
  36.             if (obj.get("name").equals("iDisplayLength"))    
  37.                 iDisplayLength = obj.getInt("value");    
  38.         }   
  39.           
  40.         // 生成20条测试数据,在实际开发中这里的数据应该是根据分页、排序、查询等情况从数据库中进行查询的    
  41.         List<String[]> lst = new ArrayList<String[]>();  
  42.         for (int i = 0; i < 100; i++) {  
  43.             String[] d = { "firstname"+i,"lastname"+i,"address"+i };    
  44.             lst.add(d);    
  45.         }    
  46.             
  47.         JSONObject getObj = new JSONObject();    
  48.         System.out.println("sEcho:"+sEcho);  
  49.         getObj.put("sEcho", sEcho);    
  50.         getObj.put("iTotalRecords", lst.size());          //实际的行数    
  51.         getObj.put("iTotalDisplayRecords", lst.size());   //显示的行数,这个要和上面写的一样    
  52.             
  53.         getObj.put("aaData", lst.subList(iDisplayStart,iDisplayStart + iDisplayLength));//要以JSON格式返回,否则前台没法显示    
  54.         return getObj.toString();    
  55.     }    
  56. }  
  57. </span>  

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值