Datatables 實現前端分頁處理


引言

Datatables 是一款 jquery 表格插件。它是一個高度靈活的工具,可以將任何 HTML 表格添加高級的交互功能。

  • 支持分頁(包括即時搜索和排序)

  • 支持幾乎任何數據源(DOM、javascript、Ajax 和 服務器處理)

  • 支持不同主題 DataTables, jQuery UI, Bootstrap, Foundation

  • 支持各式各樣的擴展: Editor, TableTools, FixedColumns ……

  • 豐富多樣的option和強大的API

  • 支持國際化

更多特性請到官網查看 http://datatables.club/

Datatables 前端分頁

前端

引入 Datatables 相關的 css 和 js 文件
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/plugins/datatables/dataTables.bootstrap.css">
<script src="/static/plugins/datatables/jquery.dataTables.min.js"></script>
<script src="/static/plugins/datatables/dataTables.bootstrap.min.js"></script>
html 頁面
<div class="box-body">
     <table id="example2" class="table table-bordered table-hover">
                <thead>
                        <tr role="row">
                            <th>列1</th>
                            <th>列2</th>
                            <th>列3</th>
                            <th>列4</th>
                            <th>列5</th>
                            <th>列6</th>
                        </tr>
               </thead>
               <tbody class="tdoby_student_data">
 
               </tbody>
               <tfoot>
               </tfoot>
        </table>
    
 </div>
js 代碼

<script>
    var table;
 
    $(function () {
        //提示信息
        $.fn.dataTable.ext.errMode = 'none';
 
        var lang = {
            "sProcessing": "處理中...",
            "sLengthMenu": "每頁 _MENU_ 項",
            "sZeroRecords": "沒有匹配結果",
            "sInfo": "當前顯示第 _START_ 至 _END_ 項,共 _TOTAL_ 項。",
            "sInfoEmpty": "當前顯示第 0 至 0 項,共 0 項",
            "sInfoFiltered": "(由 _MAX_ 項結果過濾)",
            "sInfoPostFix": "",
            "sSearch": "搜索:",
            "sUrl": "",
            "sEmptyTable": "表中數據為空",
            "sLoadingRecords": "載入中...",
            "sInfoThousands": ",",
            "oPaginate": {
                "sFirst": "首頁",
                "sPrevious": "上頁",
                "sNext": "下頁",
                "sLast": "末頁",
                "sJump": "跳轉"
            },
            "oAria": {
                "sSortAscending": ": 以升序排列此列",
                "sSortDescending": ": 以降序排列此列"
            }
        };
 
        //初始化表格
        table = $("#example2")
            .on('error.dt', function (e, settings, techNote, message) {
                console.warn(message)
            }).dataTable({
                language: lang, //提示信息
                autoWidth: false, //禁用自動調整列寬
                stripeClasses: ["odd", "even"], //為奇偶行加上樣式,兼容不支持CSS偽類的場合
                processing: true, //隱藏加載提示,自行處理
                serverSide: false, //啟用服務器端分頁
                searching: false, //禁用原生搜索
                orderMulti: false, //啟用多列排序
                order: [], //取消默認排序查詢,否則復選框一列會出現小箭頭
                renderer: "bootstrap", //渲染樣式:Bootstrap和jquery-ui
                pagingType: "simple_numbers", //分頁樣式:simple,simple_numbers,full,full_numbers
                columnDefs: [{
                    "targets": 'nosort', //列的樣式名
                    "orderable": false //包含上樣式名‘nosort'的禁止排序
                }],
                ajax: function (data, callback, settings) {
                    //封裝請求參數
                    var param = {};
                    param.pageSize = data.length;//頁面顯示記錄條數,在頁面顯示每頁顯示多少項的時候
                    param.start = data.start;//開始的記錄序號
                    param.currentPage = (data.start / data.length) + 1;//當前頁碼
                    //console.log(param);
                    //ajax請求數據
                    $.ajax({
                        type: "GET",
                        url: "/fw/user/myStudentList",
                        cache: false, //禁用緩存
                        data: param, //傳入組裝的參數
                        dataType: "json",
                        success: function (result) {
                            var returnData = {};
                            returnData.draw = data.startRow;//這里直接自行返回了draw計數器,應該由后台返回
                            returnData.recordsTotal = result.totalRows;//返回數據全部記錄
                            returnData.recordsFiltered = result.totalRows;//后台不實現過濾功能,每次查詢均視作全部結果
                            returnData.data = result.items;//返回的數據列表
                            //此時的數據需確保正確無誤,異常判斷應在執行此回調前自行處理完畢
                            callback(returnData);
                        }
                    });
                },
                "columns": [   
                    //跟你要顯示的字段是一一對應的。我這里只顯示八列
                    {'data': 'username'},
                    {'data': 'realName'},
                    {'data': 'sex'},
                    {'data': 'age'},
                    {'data': 'address'},
                    {'data': 'grade'},
                    {'data': 'headImage'},
                    {
                        "data": "謹慎操作",
                        render: function (data, type, full) {
                            //可對數據進行處理,再顯示
                        }
                    },
                ],
                "fnRowCallback": function (nRow, aData, iDisplayIndex, iDisplayIndexFull)            {                    //列樣式處理
                }
            })
            .api();
        //此處需調用api()方法,否則返回的是JQuery對象而不是DataTables的API對象
    });
</script>

后端

頁面控制器類
    @RequestMapping(value = "/myStudentList",method = RequestMethod.GET)
    @ResponseBody
    public PageQueryBean myAllStudent(HttpServletRequest request) {
        List<User> list = userService.myAllStudent(currentUser);   //直接把所有用戶都查出來了
        if (list == null) {
            log.warn("UserController:115 警告!");
        }
        PageQueryBean pageQueryBean = new PageQueryBean();     //自己創建的一個分頁類,直接返回List集合會有問題。
        pageQueryBean.setItems(list);
        pageQueryBean.setTotalRows(list.size());
        return pageQueryBean;
    }
 
返回前端模型數據 Bean
public class PageQueryBean {
 
    private static final int DEFAULT_PAGE_SIZE = 10;
    /** 當前頁 */
    private Integer currentPage;
    /** 每頁顯示數據條數 */
    private Integer pageSize;
    /** 所有記錄數 */
    private int totalRows;
    /** sql查詢起始行 */
    private Integer startRow;
    /** 總頁數 */
    private Integer totalPage;
    /** 查詢所得數據集 */
    private List<?> items;
 
    public final Integer getStartRow() {
        if (startRow == null)
            startRow = (currentPage == null ? 0 : (currentPage - 1) * getPageSize()) ;
        return startRow;
    }
 
 
    public void setStartRow(Integer startRow) {
        this.startRow = startRow;
    }
 
    public final Integer getPageSize() {
        return pageSize == null ? DEFAULT_PAGE_SIZE : pageSize;
    }
 
    public final void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }
 
    public final int getTotalRows() {
        return totalRows;
    }
 
    public final void setTotalRows(int totalRows) {
        this.totalRows = totalRows;
        int totalPage = totalRows % getPageSize() == 0 ? totalRows / getPageSize() : totalRows / getPageSize() + 1;
        setTotalPage(totalPage);
    }
 
    public final List<?> getItems() {
        return items == null ? Collections.EMPTY_LIST : items;
    }
 
    public final void setItems(List<?> items) {
        this.items = items;
    }
 
    public final Integer getCurrentPage() {
        return currentPage;
    }
 
    public final void setCurrentPage(Integer currentPage) {
        this.currentPage = currentPage;
    }
 
    public final Integer getTotalPage() {
        return totalPage == null || totalPage == 0 ? 1 : totalPage;
    }
 
    public final void setTotalPage(Integer totalPage) {
        this.totalPage = totalPage;
    }
 
 
    @Override
    public String toString() {
        return "PageQueryBean [currentPage=" + currentPage + ", pageSize="
                + pageSize + ", totalRows=" + totalRows + ", startRow="
                + startRow + ", totalPage=" + totalPage + ", items=" + items
                + "]";
    }
 
}

最終效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM