DataTable 服务器端动态分页

本文介绍了如何使用服务器端动态分页来提高DataTable性能。通过在JavaScript中初始化表单并设置DataTable参数,如`sAjaxSource`、`bServerSide`,以及自定义`fnServerData`回调函数来实现分页。在后台,接收到分页参数后根据SQL查询进行数据处理。此外,还展示了如何在`initAsyncPagingDT`函数中添加额外参数传递。

原始的dataTable显示表单:一次性查找所需的所有数据(但对于若查找的数据有上万条效率太低)

所以用服务器端动态分页:一次访问几条,多次访问后台数据

(1)在js中初始化表单

     oTable = initAsyncPagingDT(tableObj, url, cols, colDefs);

/**
 * 初始化普通表格
 * @param tableObj table对象
 * @param url 请求地址
 * @param cols 列
 * @param colDefs 列设置
 * @param fixedColumns 锁定列
 * @param sScrollX 横向滚动条
 * @param bServerSide 服务器模式
 */

   var initAsyncPagingDT =function(tableObj, url, cols, colDefs, fixedColumns, sScrollX, rows) {
    var oTable = tableObj.DataTable({
        "sDom": "Tflt<'row DTTTFooter'<'col-sm-6'i><'col-sm-6'p>>",
        "iDisplayLength": rows || 10,
        "oTableTools": {
            "aButtons": [ ]
        },
        "deferRender": true,
        "language": {
            "search": "",
            "sLengthMenu": "_MENU_",
            "info": "显示 _START_ 到 _END_ 条记录 ( 总共 _TOTAL_ 条 )",
            "oPaginate": {
                "sPrevious": "上一页",
                "sNext": "下一页"
            },
            "sInfoEmpty": "没有数据",
            "sProcessing": "正在加载数据...",
            "sInfoFiltered": "(从 _MAX_ 条数据中检索)",
        },
        "sScrollX": sScrollX || "",
        "bDestroy": true,
        "bProcessing": true,
        "bServerSide": true, //开启服务器分页模式
        "sAjaxSource": url,
        "autoWidth": false,
        "aoColumns": cols,
        "aoColumnDefs": colDefs,    //列的设置
        "aaSorting": [ ],
        "fixedColumns": fixedColumns || null,
        "fnServerData" : returnData
        
    });
    return oTable;
};

/**
 * 处理服务器端分页返回数据
 * @param sSource 查询地址
 * @param aDataSet    
 * @param fnCallback 回调函数
 */

function returnData(sSource, aDataSet, fnCallback) {
    $.ajax({  
        "dataType" : 'json',
        "contentType": "application/json; charset=utf-8",
        "type" : "get",  
        "url" : sSource,  
        "data" :{
            "pagingData": JSON.stringify(aDataSet)//这个是把datatable的一些基本数据传给后台,比如起始位置,每页显示的行数
        },  
        "success" : function(resp){  
            fnCallback(resp);  
        }  
    });  
}  


(2)在后台获取参数 String  pagingData //它是以json字符串的形式

protected Map<String, Object> swapParam(String pagingData){
        Map<String, Object> params = new HashMap<String, Object>();
        if(!StringUtil.isEmpty(pagingData)){
            JSONObject jsonObject = JSONObject.fromObject(pagingData);  
            int iDisplayStart = (Integer) jsonObject.get("iDisplayStart");
            int iDisplayLength = (Integer) jsonObject.get("iDisplayLength");
            int sEcho = (Integer) jsonObject.get("sEcho");  

            params.put("sEcho", sEcho);
            params.put("start", iDisplayStart);
            params.put("length", iDisplayLength);
        }
        return params;
    }

//start 和length是SQL语句查找所需要的:从start条开始,查找length条



在Mapper 中的sql查找语句:需要2个

1.所需查找的总的个数  number接收

	<select id="queryContentCount" resultType="java.lang.Integer" >
		select 
			count(*) 
		from t_bus_content
  	</select>

2.所需查找列表信息(10条rows参数设置的) list接收

<select id="queryContentByParam" resultType="java.util.HashMap" parameterType="java.util.HashMap">
 	select 
			id, uuid, title
        from t_bus_content
        order by pubtime desc
        <if test="start !=null and length != null ">
		limit #{start} , #{length}
		</if>
  	</select>


(2)后台返回的参数信息

resultMap.put("sEcho", paramMap.get("sEcho"));

resultMap.put("iTotalRecords", number);

resultMap.put("iTotalDisplayRecords", number);

resultMap.put("aaData", list);

return return convertToJsonData(resultMap);

//将resultMap转为json字符串形式


/**
	 * list转为json字符串
	 * @param list
	 * @return
	 */
	protected String convertToJsonData(Object list) {
		try {
			ObjectMapper mapper = new ObjectMapper();
			// mapper.setDateFormat(new
			// SimpleDateFormat(DateTime.DATE_FORMAT_DATEONLY));
			String liststr = mapper.writeValueAsString(list);
			return liststr;
		} catch (JsonProcessingException jsone) {
			throw new RuntimeException(jsone);
		}
	}


分页时外加参数的传递

在 initAsyncPagingDT 中加 "fnServerParams": serOtherParams || null

   var initAsyncPagingDT =function(tableObj, url, cols, colDefs, fixedColumns, sScrollX, rows,serOtherParams )

function serOtherParams(aoData) {
    aoData.push(
        {
            "name": "cpyUUID",
            "value": $('#ratio_cpyUUID').val()
        },{
            "name": "compUUID",
            "value": $('#ratio_compUUID').val()
        }
    );
}

在后台获取参数 String  pagingData 中有
"cpyUUID" 和 "compUUID"






     

 


   





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值