Springmvc 结合 jquery插件Datatables的使用(基于java支持的服务器处理)

前言

觉得Datatables的中文文档写的太差劲了,开发手册和文档都是很不友好,demo也不够完善,不适合直接想使用的人来看, 需要用过一段时间之后再来看可能才会有柳暗花明的发现,不然就有点不明所以的感觉。但是这个插件本身还是挺不错的,对于报表的支持比较好。
正文

我定义了一个User对象,现在需要在某个页面上展示一些数据,这个页面就是下面的html(不好意思作为java开发者, 我还是使用了jsp),

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
    <link href="/resource/assets/DataTables-1.10.15/media/css/jquery.dataTables.css" rel="stylesheet" type="text/css">
    <script src="/resource/assets/jquery/jquery-3.2.1.js" type="text/javascript" charset="UTF-8"></script>
    <link href="/resource/assets/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet" charset="UTF-8">
    <script src="/resource/assets/DataTables-1.10.15/media/js/jquery.dataTables.js" type="text/javascript" charset="UTF-8"></script>
    <script src="/resource/assets/bootstrap-3.3.7-dist/js/bootstrap.min.js" type="text/javascript"></script>
    <script src="/resource/js/mian.js" type="text/javascript" charset="UTF-8"></script>
</head>
<body>
</div>
<table id="table_id_example" class="display">
    <thead>
    <tr>
        <th>id</th>
        <th>username</th>
        <th>password</th>
        <th>age</th>
        <th>name</th>
        <th>nickname</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>Row 1 Data 1</td>
        <td>Row 1 Data 2</td>
        <td>Row 1 Data 1</td>
        <td>Row 1 Data 2</td>
        <td>Row 1 Data 1</td>
        <td>Row 1 Data 2</td>
    </tr>
    </tbody>
</table>

</body>
</html>
就是一个简单的六列的表格, 不用过多的解释了, 但是这里有个id=“table_id_example” 需要用的到, 还有一点需要注意, datatables兼容bootstrap。

然后应该要看js了, 我是这样写的:


$(function () {
    $('#table_id_example').DataTable({
        draw: 1,//标识可以避免因ajax的异步性而导致展示错误数据
        recordsFiltered: 10,//过滤后数据总条数
        recordsTotal: 10,//过滤前数据总条数
        scrollY: 300,//滚动条高度
        paging: true,//是否支持分页
        serverSide: true,//是否支持服务器处理
        'bStateSave': true,// 状态保存
        'processing': true, // 打开数据加载时的等待效果
        'sAjaxSource': '/user/getTableData',
        'fnServerData': function (sSource,aoData,fnCallback,oSettings) {
            oSettings.jqXHR = $.ajax({
                'dataType': 'json',
                'type': 'GET',
                'url': sSource,
                'data': aoData,
                'success': function (data) {
                    fnCallback(data);
                },
                'error': function (e) {
                    console.log(e.message);
                }
            });
        },
        columns: [
            { title: 'id',data: 'id' },
            { title: 'username',data: 'username' },
            { title: 'password',data: 'password' },
            { title: 'age',data: 'age' },
            { title: 'name',data: 'name' },
            { title: 'nickname',data: 'nickname' }
        ]
    });
});
这里可以重新制定列名,也要定义数据值, 还要定义请求, 参数在注释中写了。

下面应该写服务端了,这呢:

@RestController
@RequestMapping("/user")
public class UserController {

    /**
     * Method Description:
     * 〈随机获取表格数据〉
     *
     * @param:      null
     * @return:     表格数据以String格式返回, 返回json
     * @author:     Andy
     * @date:       3/30/2018 4:46 PM
     */
    @RequestMapping(value = "/getTableData", method = RequestMethod.GET)
    public String getTableData() {
        List<UserDO> users = new ArrayList<UserDO>();
        for (int i = 0; i < 10; i++) {
            int temp = (int) (Math.random() * 10);
            String strTemp = String.valueOf(temp);
            UserDO user = new UserDO(i + "", "wang" + temp, "123", temp, "wang" + temp, ("andy" + strTemp));
            users.add(user);
        }
        ResultData<UserDO> data = new ResultData<UserDO>();
        data.setData(users);
        data.setDraw(1);
        data.setRecordsTotal(Integer.valueOf(users.size()));
        data.setRecordsFiltered(Integer.valueOf(users.size()));
        System.out.println(users.toString());
        String listJsonString = JSON.toJSONString(data);
        return listJsonString;
    }
}

ResultData:

public class ResultData<T> {

    private Integer draw;
    private Integer recordsTotal;
    private Integer recordsFiltered;
    private List<T> data;

    public Integer getDraw() {
        return draw;
    }

    public void setDraw(Integer draw) {
        this.draw = draw;
    }

    public Integer getRecordsTotal(Integer integer) {
        return recordsTotal;
    }

    public void setRecordsTotal(Integer recordsTotal) {
        this.recordsTotal = recordsTotal;
    }

    public Integer getRecordsFiltered() {
        return recordsFiltered;
    }

    public void setRecordsFiltered(Integer recordsFiltered) {
        this.recordsFiltered = recordsFiltered;
    }

    public List<T> getData() {
        return data;
    }

    public void setData(List<T> data) {
        this.data = data;
    }
}  

UserDO:

public class UserDO implements Comparable<UserDO> {
    /**
     * The id will use uuid
     */
    private String id;

    /**
     * This username should be applied with email
     */
    private String username;

    private String password;

    private int age;

    /**
     * True name
     */
    private String name;

    /**
     * Virtual name
     */
    private String nickname;

    public UserDO() {
    }

    public UserDO(String id, String username, String password, int age, String name, String nickname) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
        this.name = name;
        this.nickname = nickname;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof UserDO)) {
            return false;
        }
        UserDO userDO = (UserDO) o;
        return id == userDO.id &&
                Objects.equals(username, userDO.username) &&
                Objects.equals(password, userDO.password) &&
                Objects.equals(age, userDO.age) &&
                Objects.equals(name, userDO.name) &&
                Objects.equals(nickname, userDO.nickname);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, username, password, age, name, nickname);
    }

    @Override
    public String toString() {
        return "UserDO{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age='" + age + '\'' +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }

    @Override
    public int compareTo(UserDO o) {
        return 0;
    }
}

大概就是这样了。

使用方法: 支持JAVA和PHP两种后台。 PHP:直接将WebRoot下的文件放到php服务器上直接运行即可,记得启用sqlite3。 JAVA:修改user-manage.js,将访问后台的url由"datasource.php"改为"datasource.jsp",然后将WebRoot下的文件放到tomcat下直接运行。也可使用Eclipse直接导入此项目文件。 简要说明: 使用DataTable默认的ajax交互功能,对传给后台和从后台获取的数据都有命名格式要求,这样一来耦合度较高,不利于后期扩展,不能直接适用于需要跟多种不同前端或其他业务交互的项目。本例子主要展示了自行封装请求参数和返回数据的用法,对后台的交互没有任何格式和命名限制。 基于Bootstrap 2.3.2,相关的其他插件包括图标控件FontAwesome、等待提示控件Spinjs(修改版)、弹窗控件lhgdialog(修改版) 主要展现: 封装请求参数(查询、排序、分页,不再需要data、dataFilter和dataSrc) 封装返回数据 自定义查询参数 服务器分页 自行控制和自定义遮罩效果 生成自定义效果的单元格(在线离线) 生成复选框单元格 响应复选框选择事件 生成操作按钮单元格 响应操作栏按钮点击事件 响应行点击事件 渲染回调事件(默认选中第一行) 分页栏增加跳页功能(直接修改了dataTables.bootstrap.js和dataTables.bootstrap.css) CSS实现单元格超长文字省略号显示 CSS实现单元格连续纯字母数字强制换行显示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值