jquery datatable服务端分页


Posted in Javascript onAugust 31, 2016

OK,上次完成了客户端的分页,这次我们就在上一次的Demo上进行修改,来实现服务端的分页~

js代码:

<script type="text/javascript">
$(document).ready(function() {
 $('#table_id_example').DataTable({
 "bProcessing" : false, //是否显示加载
 "sAjaxSource" : '/datatableDemo/user/json', //请求资源路径
 "serverSide": true, //开启服务器处理模式
 /*
 使用ajax,在服务端处理数据
 sSource:即是"sAjaxSource"
 aoData:要传递到服务端的参数
 fnCallback:处理返回数据的回调函数
 */
 "fnServerData": function(sSource, aoData, fnCallback){
 $.ajax( { 
 'type' : 'post', 
 "url": sSource, 
 "dataType": "json", 
 "data": { "aodata" : JSON.stringify(aoData) },
 "success": function(resp) { 
  fnCallback(resp);
 } 
 }); 
 }, 
 "columns" : [ 
 { data : "id" }, 
 { data : "name" }, 
 { data : "age" }, 
 ]
 });
})
</script>

开启服务器处理模式,这时我们对表格的每次操作,datatable都会帮我们向服务器发起请求获取数据,默认是用GET方式传递参数,所以我们下面加上了”fnServerData”,这样可以修改参数传递的方式为POST,那么到底给服务端发送的”aoData”是个什么鬼呢,别急,我们直接从Servlet取出来看看就知道了
此时我们的Servlet也要做一点修改:

public class Action extends HttpServlet {

 /**
 * 
 */
 private static final long serialVersionUID = 5957315496919679612L;

 @Override
 protected void service(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 // 编码设置
 request.setCharacterEncoding("UTF-8");
 response.setContentType("text/html; charset=UTF-8");
 response.setCharacterEncoding("UTF-8");

 // 把传送过来的JSON字符串转成JSON数组
 JSONArray ja = JSONArray.fromObject(request.getParameter("aodata"));
 System.out.println(ja);

 // 从数据库获取数据
 List<User> listUser = Service.getInstance().getAll();

 // 数据封装并返回给客户端
 DataTableJSONResponse dtjs = new DataTableJSONResponse(listUser);
 JSONObject jsonObject = JSONObject.fromObject(dtjs);
 response.getWriter().print(jsonObject.toString());
 }

此时我们运行一下,OK,发现所谓的参数长这个模样

[{“name”:”sEcho”,”value”:1}, 
{“name”:”iColumns”,”value”:3}, 
{“name”:”sColumns”,”value”:”,,”}, 
{“name”:”iDisplayStart”,”value”:0}, 
{“name”:”iDisplayLength”,”value”:10}, 
{“name”:”mDataProp_0”,”value”:”id”}, 
{“name”:”sSearch_0”,”value”:”“}, 
{“name”:”bRegex_0”,”value”:false}, 
{“name”:”bSearchable_0”,”value”:true}, 
{“name”:”bSortable_0”,”value”:true}, 
{“name”:”mDataProp_1”,”value”:”name”}, 
{“name”:”sSearch_1”,”value”:”“}, 
{“name”:”bRegex_1”,”value”:false}, 
{“name”:”bSearchable_1”,”value”:true}, 
{“name”:”bSortable_1”,”value”:true}, 
{“name”:”mDataProp_2”,”value”:”age”}, 
{“name”:”sSearch_2”,”value”:”“}, 
{“name”:”bRegex_2”,”value”:false}, 
{“name”:”bSearchable_2”,”value”:true}, 
{“name”:”bSortable_2”,”value”:true}, 
{“name”:”sSearch”,”value”:”“}, 
{“name”:”bRegex”,”value”:false}, 
{“name”:”iSortCol_0”,”value”:0}, 
{“name”:”sSortDir_0”,”value”:”asc”}, 
{“name”:”iSortingCols”,”value”:1}]

 是不是感觉有点晦涩难懂,于是本菜上网查了下,勉强是看懂这个鬼东西,接下来就讲解一下几个我们需要的参数:
sEcho:客户端发送请求同时发送过来的一个标识,虽然有什么卵用不知道,不过我们服务端返回的数据中必须带有这个标识,哦,官网的文档里说,服务端取出标识最好转一下转成int,防止XXS攻击(懵逼,暂且不管,我们只知道需要这个就行)
iColumns:列数
iDisplayStart:起始索引
iDisplayLength:显示的行数
{“name”:”mDataProp_0”,”value”:”id”},
{“name”:”sSearch_0”,”value”:”“},
{“name”:”bRegex_0”,”value”:false},
{“name”:”bSearchable_0”,”value”:true},
{“name”:”bSortable_0”,”value”:true}

每一列的参数设置,_0即是第一列,这个我们不管,到下面也是提取列名而已
sSearch:全局搜索字段
iSortCol_0:被排序的列
sSortDir_0:排序方式

完成了参数解读,那么接下来就要提取我们的参数啦~~开工加代码

public class Action extends HttpServlet {

 /**
 * 
 */
 private static final long serialVersionUID = 5957315496919679612L;

 @Override
 protected void service(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 // 编码设置
 request.setCharacterEncoding("UTF-8");
 response.setContentType("text/html; charset=UTF-8");
 response.setCharacterEncoding("UTF-8");

 // 把传送过来的JSON字符串转成JSON数组
 JSONArray ja = JSONArray.fromObject(request.getParameter("aodata"));
 System.out.println(ja);

 // 获取需要的参数值
 String sEcho = null;
 Integer iColumns = null;
 Integer iDisplayStart = null;
 Integer iDisplayLength = null;
 List<String> mDataProp = new ArrayList<String>(); //存放列名
 String sSearch = null;
 Integer iSortCol_0 = null;
 String iSortCol = null;
 String sSortDir_0 = null;
 for (int i = 0; i < ja.size(); i++) {
 if (ja.getJSONObject(i).getString("name").equals("sEcho"))
 sEcho = ja.getJSONObject(i).getString("value");
 else if (ja.getJSONObject(i).getString("name").equals("iColumns"))
 iColumns = Integer.valueOf(ja.getJSONObject(i).getString("value"));
 else if (ja.getJSONObject(i).getString("name").equals("iDisplayStart"))
 iDisplayStart = Integer.valueOf(ja.getJSONObject(i).getString("value"));
 else if (ja.getJSONObject(i).getString("name").equals("iDisplayLength"))
 iDisplayLength = Integer.valueOf(ja.getJSONObject(i).getString("value"));
 else if (ja.getJSONObject(i).getString("name").equals("sSearch"))
 sSearch = ja.getJSONObject(i).getString("value");
 else if (ja.getJSONObject(i).getString("name").equals("iSortCol_0"))
 iSortCol_0 = Integer.valueOf(ja.getJSONObject(i).getString("value"));
 else if (ja.getJSONObject(i).getString("name").equals("sSortDir_0"))
 sSortDir_0 = ja.getJSONObject(i).getString("value");
 else if (iColumns != null) {
 for (int j = 0; j < iColumns; j++)
  if (ja.getJSONObject(i).getString("name").equals("mDataProp_" + j))
  mDataProp.add(ja.getJSONObject(i).getString("value"));
 }
 }
 iSortCol = mDataProp.get(iSortCol_0);
 System.out.println(sEcho);
 System.out.println(iColumns);
 System.out.println(iDisplayStart);
 System.out.println(iDisplayLength);
 System.out.println(sSearch);
 System.out.println(iSortCol);
 System.out.println(sSortDir_0);

 // 从数据库获取数据
 List<User> listUser = Service.getInstance().getAll();

 // 数据封装并返回给客户端
 DataTableJSONResponse dtjs = new DataTableJSONResponse(listUser);
 JSONObject jsonObject = JSONObject.fromObject(dtjs);
 response.getWriter().print(jsonObject.toString());
 }

好的,加工完毕,这时我们跑一跑看看是不是打出我们要的参数,这里我就不贴出来了,你们自己跑了看,好的发现拿到了我们要的参数,那么接下来可以拼接我们的sql语句了,同时我们要对我们的DataTableJSONResponse进行一下小小的修改,因为这里对于返回的数据也是有参数要求的,那我们就把需要的参数放进去,代码如下:

public class DataTableJSONResponse {
 Object sEcho;
 Object iTotalRecords; //查询的记录数
 Object iTotalDisplayRecords; //过滤后的记录数
 Object aaData;

 public DataTableJSONResponse() {
 super();
 }

 public DataTableJSONResponse(Object aaData) {
 super();
 this.aaData = aaData;
 }

 public DataTableJSONResponse(Object sEcho, Object iTotalRecords, Object iTotalDisplayRecords, Object aaData) {
 super();
 this.sEcho = sEcho;
 this.iTotalRecords = iTotalRecords;
 this.iTotalDisplayRecords = iTotalDisplayRecords;
 this.aaData = aaData;
 }

 public Object getAaData() {
 return aaData;
 }

 public void setAaData(Object aaData) {
 this.aaData = aaData;
 }

 public Object getsEcho() {
 return sEcho;
 }

 public void setsEcho(Object sEcho) {
 this.sEcho = sEcho;
 }

 public Object getiTotalRecords() {
 return iTotalRecords;
 }

 public void setiTotalRecords(Object iTotalRecords) {
 this.iTotalRecords = iTotalRecords;
 }

 public Object getiTotalDisplayRecords() {
 return iTotalDisplayRecords;
 }

 public void setiTotalDisplayRecords(Object iTotalDisplayRecords) {
 this.iTotalDisplayRecords = iTotalDisplayRecords;
 }
}

完整的Servlet:

public class Action extends HttpServlet {

 /**
 * 
 */
 private static final long serialVersionUID = 5957315496919679612L;

 @Override
 protected void service(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 // 编码设置
 request.setCharacterEncoding("UTF-8");
 response.setContentType("text/html; charset=UTF-8");
 response.setCharacterEncoding("UTF-8");

 // 把传送过来的JSON字符串转成JSON数组
 JSONArray ja = JSONArray.fromObject(request.getParameter("aodata"));

 // 获取需要的参数值
 String sEcho = null;
 Integer iColumns = null;
 Integer iDisplayStart = null;
 Integer iDisplayLength = null;
 List<String> mDataProp = new ArrayList<String>(); //存放列名
 String sSearch = null;
 Integer iSortCol_0 = null;
 String iSortCol = null;
 String sSortDir_0 = null;
 for (int i = 0; i < ja.size(); i++) {
 if (ja.getJSONObject(i).getString("name").equals("sEcho"))
 sEcho = ja.getJSONObject(i).getString("value");
 else if (ja.getJSONObject(i).getString("name").equals("iColumns"))
 iColumns = Integer.valueOf(ja.getJSONObject(i).getString("value"));
 else if (ja.getJSONObject(i).getString("name").equals("iDisplayStart"))
 iDisplayStart = Integer.valueOf(ja.getJSONObject(i).getString("value"));
 else if (ja.getJSONObject(i).getString("name").equals("iDisplayLength"))
 iDisplayLength = Integer.valueOf(ja.getJSONObject(i).getString("value"));
 else if (ja.getJSONObject(i).getString("name").equals("sSearch"))
 sSearch = ja.getJSONObject(i).getString("value");
 else if (ja.getJSONObject(i).getString("name").equals("iSortCol_0"))
 iSortCol_0 = Integer.valueOf(ja.getJSONObject(i).getString("value"));
 else if (ja.getJSONObject(i).getString("name").equals("sSortDir_0"))
 sSortDir_0 = ja.getJSONObject(i).getString("value");
 else if (iColumns != null) {
 for (int j = 0; j < iColumns; j++)
  if (ja.getJSONObject(i).getString("name").equals("mDataProp_" + j))
  mDataProp.add(ja.getJSONObject(i).getString("value"));
 }
 }
 iSortCol = mDataProp.get(iSortCol_0);

 String sql = null;
 if(sSearch.equals(""))
 sql = "select * from(select id,name,age,rownum rn from dtdemo_xxx)"
 +"where rn between " + iDisplayStart + " and " + (iDisplayStart+iDisplayLength)
 +" order by " + iSortCol + " " + sSortDir_0;
 else
 sql = "select * from(select id,name,to_char(age,999) age,rownum rn from dtdemo_xxx where id like '%"
 + sSearch +"%' or name like '%"+ sSearch +"%' or age like '%"+ sSearch +"%')"
 +"where rn between " + iDisplayStart + " and " + (iDisplayStart+iDisplayLength)
 +" order by " + iSortCol + " " + sSortDir_0;
 System.out.println(sql);

 // 从数据库获取数据
 List<User> listUser = Service.getInstance().getAll(sql);
 //获取记录数
 int size = Service.getInstance().getAll().size();

 // 数据封装并返回给客户端
 DataTableJSONResponse dtjs = new DataTableJSONResponse(sEcho,size,size,listUser);
 JSONObject jsonObject = JSONObject.fromObject(dtjs);
 response.getWriter().print(jsonObject.toString());
 }

}

至此,服务端分页完成~

精彩专题分享:jquery分页功能操作 JavaScript分页功能操作

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jcarousellite.js 基于Jquery的图片无缝滚动插件
Dec 30 Javascript
javaScript 删除字符串空格多种方法小结
Oct 24 Javascript
jQuery中slice()方法用法实例
Jan 07 Javascript
js限制文本框只能输入中文的方法
Aug 11 Javascript
javascript自定义滚动条实现代码
Apr 20 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
May 25 Javascript
Vue.js第三天学习笔记(计算属性computed)
Dec 01 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
May 17 Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
Nov 23 Javascript
vue-router的钩子函数用法实例分析
Oct 26 Javascript
让你30分钟快速掌握vue3教程
Oct 26 Javascript
ES6字符串的扩展实例
Dec 21 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
Aug 31 #Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
Aug 31 #Javascript
浅谈JavaScript 覆盖原型以及更改原型
Aug 31 #Javascript
javascript 将共享属性迁移到原型中去的实现方法
Aug 31 #Javascript
使用vue编写一个点击数字计时小游戏
Aug 31 #Javascript
原生js实现tab选项卡切换
Mar 23 #Javascript
jquery的checkbox,radio,select等方法小结
Aug 30 #Javascript
You might like
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
js控制滚动条缓慢滚动到顶部实现代码
2013/03/20 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
jQuery实现平滑滚动页面到指定锚点链接的方法
2015/07/15 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
Python生成pdf文件的方法
2014/08/04 Python
Python中列表和元组的使用方法和区别详解
2020/12/30 Python
python实现给微信公众号发送消息的方法
2017/06/30 Python
TensorFlow在MAC环境下的安装及环境搭建
2017/11/14 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
Python实现平行坐标图的两种方法小结
2019/07/04 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
如何使用python进行pdf文件分割
2019/11/11 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
美国知名日用品连锁超市:Dollar General(多来店)
2017/01/14 全球购物
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
语文教育专业推荐信范文
2013/11/25 职场文书
教师自我评价范文
2013/12/16 职场文书
公司廉洁自律承诺书
2014/03/27 职场文书
婚前协议书范本两则
2014/10/16 职场文书
护士医德考评自我评价
2015/03/03 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
政审证明范文
2015/06/19 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
PHP 时间处理类Carbon
2022/05/20 PHP