JQuery Datatable用法

原文出处:http://sgyyz.blog.51cto.com/5069360/1408251

目标:

使用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官网上去下载一份jQuery和jQuery Datatable的js库。https://datatables.net/examples/server_side/simple.html。

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,    全部数据值可以通过属性列名获取

具体效果图如下:

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 ================

时间: 2024-11-08 08:59:37

JQuery Datatable用法的相关文章

jQuery Datatable系列文章(一)用法以及属性

废话不多说上效果图 jQuery Datatable 插件可以去官网下载 先说说如何用法 戳此处看 我还是在这稍微说下 (声明一下html代码里面有各种类,是因为做项目的时候用的bootstrap,你可以不用加) 在js里面如何调用呢 如下 来具体解释下用法 1 if (typeof gp.dataTable != 'undefined' && gp.dataTable != null) { //为了避免多次初始化datatable() 2 3 gp.dataTable.fnClearTa

jQuery 事件用法详解

jQuery 事件用法详解 目录 简介 实现原理 事件操作 绑定事件 解除事件 触发事件 事件委托 事件操作进阶 阻止默认事件 阻止事件传播 阻止事件向后执行 命名空间 自定义事件 事件队列 jquery中文文档 简介 jquery 之所以成为最受欢迎的前端库,很大一部分是得益于它的事件具有良好的语义,优秀的兼容性,并且便于管理和扩展. 在这里我会介绍 jquery 事件的一些比较基础的用法. 实现原理 jquery 事件脱胎于浏览器的 addEventListener (W3) 和 attac

jQuery $.each用法[转]

jQuery $.each用法 以下内容非原创,来自百度文库http://wenku.baidu.com/view/4796b6145f0e7cd18425368e.html 通过它,你可以遍历对象.数组的属性值并进行处理. each函数根据参数的类型实现的效果不完全一致: 1.遍历对象(有附加参数) $.each(Object, function(p1, p2) { this;       //这里的this指向每次遍历中Object的当前属性值 p1; p2;     //访问附加参数 },

JQuery datepicker 用法

JQuery datepicker 用法 jQuery UI很强大,其中的日期选择插件Datepicker是一个配置灵活的插件,我们可以自定义其展示方式,包括日期格式.语言.限制选择日期范围.添加相关按钮以及其它导航等.官方地址:http://docs.jquery.com/UI/Datepicker,官方示例: http://jqueryui.com/demos/datepicker/. 一个不错的地址,用来DIY jQuery UI界面效果的站点http://jqueryui.com/the

jQuery tmpl用法总结

原文:jQuery tmpl用法总结 之前很是头疼循环数据的渲染,搞一大堆的命名,一点点的赋值,很是麻烦,今天学习了一下jQuery插件tmpl,下面抛出一些使用方法,供以后参考: 官方网址:http://web.archive.org/web/20121014080309/http://api.jquery.com/jquery.tmpl/ github网址:https://github.com/jquery/jquery-tmpl        http://jquery.github.co

jquery.fn.extend与jquery.extend用法与区别

关于jquery.fn.extend与jquery.extend用法与区别. jQuery为开发插件提拱了两个方法,分别是:  代码如下 复制代码 jQuery.fn.extend(object);  和   jQuery.extend(object); jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法. jQuery.fn.extend(object);给jQuery对象添加方法. fn 是什么东西呢.查看jQuery代码,就不难发现.  代码如下 复制

jquery.datatable插件从数据库读取数据

一.分页 分页的基本思想是根据datatable的页码及每页显示的行数,将数据从数据库分段提出,然后再填充到表格中,以达到分页的效果. 这里需要用到datatable插件的几个属性: "sEcho":这个属性需要原封不动地传回给datatable,具体的作用我也不清楚,但是根据它值的变化情况来看,好像是一个操作次数的计数(之前我一直把它当做是pageindex来用,结果发现,不论我在datatable中是翻下一页还是翻上一页,它一直在增加.) "iDisplayStart&q

分享在MVC3.0中使用jQuery DataTable 插件

前不久在网络上看见一个很不错的jQuery的DataTable表格插件.后来发现在MVC中使用该插件的文章并不多.本文将介绍在MVC3.0如何使用该插件.在介绍该插件之前先简单介绍一下,推荐该插件的原因.在项目中我使用jqgrid比较多.但是发现当进行样式调整时jqgrid的样式常常会让美工头疼.而datatable插件却是一个轻量级的jQuery插件.当我通过浏览器查看该js插件rander后的源码.发现只是一个简单的html table,非常简洁.那么在没有特殊要求的情况下使用这个插件,开发

jquery dataTable的学习

分页 bPaginite:true;是否启用分页功能 sPaginationType:two_button  或者full_numbers 分页风格 sFirst:告诉他第一页怎么写 sLast:告诉他最后一页怎么写 sNext:告诉他下一页怎么写 sPrevious:告诉他上一页怎么写 语言 "sInfo":"共_TOTAL_页 第_START_到_END_页", "sEmptyTable":"没有数据" "sIn