DataTables+SpringMVC實現服務器端分頁處理

DataTables的主頁是 http://www.datatables.net/联予,中文主頁http://www.datatables.club/


  1. View層
jsp或者html代碼:
<table id="example" class="display" cellspacing="0" width="100%">
        <thead>
            <tr>
                <th>First name</th>
                <th>Last name</th>
            </tr>
        </thead>
        <tfoot>
            <tr>
                <th>First name</th>
                <th>Last name</th>      
            </tr>
        </tfoot>
    </table>
JS代碼:
$("#example").DataTable({
            "bLengthChange": false,
            "bFilter": false,
            "bSort": false,
            "bInfo": true,
            "bProcessing": true, // 加載條
            "iDisplayLength": 10,
            "columns" : [ {
                "data" : "firstName"
            }, {
                "data" : "lastName"
            }],
            "bProcessing": false, // 是否顯示取數據時的那個等待提示
            "bServerSide": true,//這個用來指明是通過服務端來取數據
            "sAjaxSource": "items/list",//這個是請求的地址连舍,Rest API or JSP的action
            "fnServerData": retrieveData, // 獲取數據的處理函數
            "oLanguage": {

                "sProcessing": "正在加載中......",

                "sLengthMenu": "每頁顯示 _MENU_ 條記錄",

                "sZeroRecords": "對不起脐雪,查詢不到相關數據!",

                "sEmptyTable": "表中無數據存在春贸!",

                "sInfo": "當前顯示 _START_ 到 _END_ 條求类,共 _TOTAL_ 條記錄",

                "sInfoFiltered": "數據表中共為 _MAX_ 條記錄",

                "oPaginate": {

                    "sFirst": "首頁",

                    "sPrevious": "上一頁",

                    "sNext": "下一頁",

                    "sLast": "末頁"

                }

            }
        });

對于從服務器端取數據,還要指定幾個參數:
bServerSide:true
sAjaxSource:獲取數據的url

這樣挎春,在DataTables需要數據時會調用jquery的getJSON獲取數據,其中url就是sAjaxSource豆拨,
同時傳遞一堆自定義的參數,包括需要顯示的起始記錄數能庆,需要顯示的記錄數施禾,列數,排序
列等等搁胆,具體可以參看這里http://www.datatables.net/usage/server-side弥搞。其中一個比較
特殊的是sEcho,這個參數需要以后原封不動地返回給頁面渠旁。
由于默認是以$.getJSON發(fā)送請求攀例,所以http命令是GET,參數是以url參數的方式傳遞的顾腊,我
希望以POST命令粤铭,以json方式發(fā)送請求,而且要加上客戶名稱這個參數杂靶,所以這里需要做些修
改梆惯。
DataTables通過fnServerData提供了這樣一個接口,fnServerData是與服務器端交換數據時被
調用的函數吗垮,默認實現是如上所說的通過getJSON發(fā)送請求垛吗,然后接收特定格式的json數據(這
個在服務器端處理部分再說)。fnServerData會接到3個參數:
sSource: 接收數據的url烁登,就是sAjaxSource中指定的地址
aoData:DataTables定義的參數怯屉,是一個數組,其中每個元素是一個name-value對,我需要
把客戶名稱這個參數加進去
fnCallback:服務器返回數據后的處理函數锨络,我需要按DataTables期望的格式傳入返回數據
最后自定義的fnServerData如下所示:
// 3個參數的名字可以隨便命名,但必須是3個參數,少一個都不行

    function retrieveData(sSource, aoData, fnCallback ) {

        $.ajax({

            url : sSource,//這個就是請求地址對應sAjaxSource

            data : {"aoData":JSON.stringify(aoData)},//這個是把datatable的一些基本數據傳給后臺,比如起始位置,每頁顯示的行數

            type : 'post',

            dataType : 'json',

            async : false,

            success : function(result) {

                fnCallback(result);//把返回的數據傳給這個方法就可以了,datatable會自動綁定數據的

            },

            error : function(msg) {
                alert(msg);
            }

        });

    }

2.后臺服務器
2.1 實體類

    public class User{
    private String firstName;
    private String lastName;
    ...
    getter and setter
    ...
  }

2.2 Controller

@Controller
@RequestMapping("/users")
public class ItemController {
   
    @RequestMapping("/list")
    @ResponseBody
    public String listUsers(@RequestParam String aoData, HttpServletRequest request, Model model){
        
        List<User> list = new ArrayList<User>();
        list.add(new Item("jack","123#"));
        list.add(new Item(2,"jack2","1234#"));
        JSONArray ja = JSONArray.parseArray(aoData);
        String sEcho = null;
        int iDisplayStart = 0;
        int iDisplayLength = 0;
        for (int i = 0; i <ja.size() ; i++) {
            JSONObject jobj = ja.getJSONObject(i);
            if (jobj.get("name").equals("sEcho"))
                sEcho = jobj.get("value").toString();
            if (jobj.get("name").equals("iDisplayStart"))
                iDisplayStart = jobj.getIntValue("value");

            if (jobj.get("name").equals("iDisplayLength"))
                iDisplayLength = jobj.getIntValue("value");
        }
        JSONObject getObj = new JSONObject();
        getObj.put("sEcho",sEcho);
        getObj.put("iTotalRecords",2);
        getObj.put("iTotalDisplayRecords", 2);//顯示的行數,這個要和上面寫的一樣
        getObj.put("data",list);
            return  getObj.toString();

//        return  list;
    }
}

服務器端返回的JSON數據格式是規(guī)定好的赌躺,詳見https://datatables.net/examples/server_side/post.html
格式類似于:

{
  "draw": 1,
  "recordsTotal": 57,
  "recordsFiltered": 57,
  "data": [
    {
      "first_name": "Airi",
      "last_name": "Satou",
      "position": "Accountant",
      "office": "Tokyo",
      "start_date": "28th Nov 08",
      "salary": "$162,700"
    },
    {
      "first_name": "Angelica",
      "last_name": "Ramos",
      "position": "Chief Executive Officer (CEO)",
      "office": "London",
      "start_date": "9th Oct 09",
      "salary": "$1,200,000"
    }
  ]
}

其中,data字段的值可以是數組類型足删,也可以是對象寿谴。具體操作查看官網說明。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末失受,一起剝皮案震驚了整個濱河市讶泰,隨后出現的幾起案子,更是在濱河造成了極大的恐慌拂到,老刑警劉巖痪署,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異兄旬,居然都是意外死亡狼犯,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門领铐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悯森,“玉大人,你說我怎么就攤上這事绪撵∑耙觯” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵音诈,是天一觀的道長幻碱。 經常有香客問我,道長细溅,這世上最難降的妖魔是什么褥傍? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮喇聊,結果婚禮上恍风,老公的妹妹穿的比我還像新娘。我一直安慰自己誓篱,他們只是感情好邻耕,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著燕鸽,像睡著了一般兄世。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啊研,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天御滩,我揣著相機與錄音鸥拧,去河邊找鬼。 笑死削解,一個胖子當著我的面吹牛富弦,可吹牛的內容都是我干的。 我是一名探鬼主播氛驮,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼腕柜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矫废?” 一聲冷哼從身側響起盏缤,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蓖扑,沒想到半個月后唉铜,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡律杠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年潭流,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柜去。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡灰嫉,死狀恐怖,靈堂內的尸體忽然破棺而出嗓奢,到底是詐尸還是另有隱情熬甫,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布蔓罚,位于F島的核電站,受9級特大地震影響瞻颂,放射性物質發(fā)生泄漏豺谈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一贡这、第九天 我趴在偏房一處隱蔽的房頂上張望茬末。 院中可真熱鬧,春花似錦盖矫、人聲如沸丽惭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽责掏。三九已至,卻和暖如春湃望,著一層夾襖步出監(jiān)牢的瞬間换衬,已是汗流浹背痰驱。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞳浦,地道東北人担映。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像叫潦,于是被迫代替她去往敵國和親蝇完。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理矗蕊,服務發(fā)現短蜕,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網易云信 SDK 為 Web 應用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,674評論 0 15
  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,173評論 0 7
  • 1. Java基礎部分 基礎部分的順序:基本語法拔妥,類相關的語法忿危,內部類的語法,繼承相關的語法没龙,異常的語法铺厨,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 一解滓、關于推薦序 1.慢下來,用戰(zhàn)略的眼光看清楚再行動筝家。 的確洼裤,身處于這個時代的我深切地感受到被大量信息包圍。就拿微...
    冰_冰_閱讀 155評論 0 0