前言

基于SpringMVC+Bootstrap+DataTables实现数据表格服务端分页、模糊查询(非DataTables Search),页面异步刷新。

说明:sp:message标签是使用了SpringMVC国际化

效果

DataTable表格

关键字查询

自定义关键字查询,非DataTable Search

代码

HTML代码

查询条件代码

<!-- 查询、添加、批量删除、导出、刷新 -->

<div class="row-fluid">

<div class="pull-right">

<div class="btn-group">

<button type="button" class="btn btn-primary btn-sm" id="btn-add">

<i class="fa fa-plus"></i> <sp:message code="sys.add"/>

</button>

<button type="button" class="btn btn-primary btn-sm" id="btn-delAll">

<i class="fa fa-remove"></i> <sp:message code="sys.delAll"/>

</button>

<button type="button" class="btn btn-primary btn-sm" id="btn-export">

<i class="fa fa-sign-in"></i> <sp:message code="sys.export"/>

</button>

<button type="button" class="btn btn-primary btn-sm" id="btn-re">

<i class="fa fa-refresh"></i> <sp:message code="sys.refresh"/>

</button>

</div>

</div>

<div class="row">

<form id="queryForm" action="<%=path%>/goodsType/list" method="post">

<div class="col-xs-2">

<input type="text" id="keyword" name="keyword" class="form-control input-sm"

placeholder="<sp:message code="sys.keyword"/>">

</div>

<button type="button" class="btn btn-primary btn-sm" id="btn-query">

<i class="fa fa-search"></i> <sp:message code="sys.query"/>

</button>

</form>

</div>

</div>

数据table代码

<table id="dataTable" class="table table-striped table-bordered table-hover table-condensed" align="center">

<thead>

<tr class="info">

<td><input type="checkbox" id="checkAll"></td>

<th><sp:message code="sys.no"/></th>

<th><sp:message code="goods.type.name.cn"/></th>

<th><sp:message code="goods.type.name.en"/></th>

<th><sp:message code="sys.create.time"/></th>

<th><sp:message code="sys.update.time"/></th>

<th><sp:message code="sys.oper"/></th>

</tr>

</thead>

</table>

JS代码

DataTables初始化、服务端数据请求、查询条件封装

<!-- page script -->

<script>

$(function () {

//添加、修改异步提交地址

var url = "";

var tables = $("#dataTable").dataTable({

serverSide: true,//分页,取数据等等的都放到服务端去

processing: true,//载入数据的时候是否显示“载入中”

pageLength: 10, //首次加载的数据条数

ordering: false, //排序操作在服务端进行,所以可以关了。

pagingType: "full_numbers",

autoWidth: false,

stateSave: true,//保持翻页状态,和comTable.fnDraw(false);结合使用

searching: false,//禁用datatables搜索


ajax: {

type: "post",

url: "<%=path%>/goodsType/getData",

dataSrc: "data",

data: function (d) {

var param = {};

param.draw = d.draw;

param.start = d.start;

param.length = d.length;

var formData = $("#queryForm").serializeArray();//把form里面的数据序列化成数组

formData.forEach(function (e) {

param[e.name] = e.value;

});

return param;//自定义需要传递的参数。

},

},

columns: [//对应上面thead里面的序列

{"data": null,"width":"10px"},

{"data": null},

{"data": 'typeNameCn' },

{"data": 'typeNameEn' },

{"data": 'createTime',

"render":function(data,type,full,callback) {

return data.substr(0,19)

}

},

{"data": 'updateTime', defaultContent: "",

"render":function(data,type,full,callback) {

if(data != null && data != ""){

return data.substr(0,19)

}else{

return data;

}

}

},

{"data": null,"width":"60px"}

],

//操作按钮

columnDefs: [

{

targets: 0,

defaultContent: "<input type='checkbox' name='checkList'>"

},

{

targets: -1,

defaultContent: "<div class='btn-group'>"+

"<button id='editRow' class='btn btn-primary btn-sm' type='button'><i class='fa fa-edit'></i></button>"+

"<button id='delRow' class='btn btn-primary btn-sm' type='button'><i class='fa fa-trash-o'></i></button>"+

"</div>"

}

],

language: {

lengthMenu: "",

processing: "<sp:message code='sys.load'/>",

paginate: {

previous: "<",

next: ">",

first: "<<",

last: ">>"

},

zeroRecords: "<sp:message code='sys.nodata'/>",

info: "<sp:message code='sys.pages'/>",

infoEmpty: "",

infoFiltered: "",

sSearch: "<sp:message code='sys.keyword'/>:",

},

//在每次table被draw完后回调函数

fnDrawCallback: function(){

var api = this.api();

//获取到本页开始的条数

   var startIndex= api.context[0]._iDisplayStart;

   api.column(1).nodes().each(function(cell, i) {

     cell.innerHTML = startIndex + i + 1;
   });

}

});

//查询按钮

$("#btn-query").on("click", function () {

tables.fnDraw();//查询后不需要保持分页状态,回首页

});

//添加

$("#btn-add").on("click", function () {

url = "<%=path%>/goodsType/add";

$("input[name=typeId]").val(0);

$("input[name=typeNameCn]").val("");

$("input[name=typeNameEn]").val("");

$("#editModal").modal("show");

});

//批量删除

$("#btn-delAll").on("click", function () {
});

//导出

$("#btn-export").on("click", function () {

});

//刷新

$("#btn-re").on("click", function () {

tables.fnDraw(false);//刷新保持分页状态
});

//checkbox全选

$("#checkAll").on("click", function () {

if ($(this).prop("checked") === true) {

$("input[name='checkList']").prop("checked", $(this).prop("checked"));

//$("#dataTable tbody tr").addClass('selected');

$(this).hasClass('selected')

} else {

$("input[name='checkList']").prop("checked", false);

$("#dataTable tbody tr").removeClass('selected');

}

});



//修改

$("#dataTable tbody").on("click", "#editRow", function ()
{

var data = tables.api().row($(this).parents("tr")).data();

$("input[name=typeId]").val(data.typeIdStr);

$("input[name=typeNameCn]").val(data.typeNameCn);

$("input[name=typeNameEn]").val(data.typeNameEn);

url = "<%=path%>/goodsType/update";

$("#editModal").modal("show");

});

$("#btn-submit").on("click", function(){

$.ajax({

cache: false,

type: "POST",

url: url,

data:$("#editForm").serialize(),

async: false,

error: function(request) {

showFail("Server Connection Error...");

},

success: function(data) {

if(data.status == 1){

$("#editModal").modal("hide");

showSuccess("<sp:message code='sys.oper.success'/>");

tables.fnDraw();

}else{

showFail("<sp:message code='sys.oper.fail'/>");

}

}

});

});

//删除

$("#dataTable tbody").on("click", "#delRow", function () {

var data = tables.api().row($(this).parents("tr")).data();

if(confirm("是否确认删除这条信息?")){

$.ajax({

url:'<%=path%>/goodsType/del/'+data.typeIdStr,

type:'delete',

dataType: "json",

cache: "false",

success:function(data){

if(data.status == 1){

showSuccess("<sp:message code='sys.oper.success'/>");

tables.api().row().remove().draw(false);

}else{

showFail("<sp:message code='sys.oper.fail'/>");

}

},

error:function(err){

showFail("Server Connection Error...");

}

});

}

});

});

</script>

Java代码

Controller处理方法,负责查询页面需要表格数据,格式化Json后返回。

@RequestMapping(value="/goodsType/getData", produces = "text/json;charset=UTF-8")

@ResponseBody

public String getData(HttpServletRequest request, QueryCondition query) {

DatatablesView<GoodsType> dataTable = goodsTypeService.getGoodsTypeByCondition(query);

dataTable.setDraw(query.getDraw());

String data = JSON.toJSONString(dataTable);

return data;

}

返回Json数据格式

{

"data": [{

"createTime": "2016-10-27 09:42:28.0",

"typeId": 96824775296417986,

"typeIdStr": "96824775296417986",

"typeNameCn": "食品",

"typeNameEn": "Foods",

"updateTime": "2016-10-28 13:00:24.0"

},

{

"createTime": "2016-10-27 09:42:27.0",

"typeId": 96824775296417979,

"typeIdStr": "96824775296417979",

"typeNameCn": "汽车",

"typeNameEn": "Cars123",

"updateTime": "2016-10-27 09:51:24.0"

}],

"draw": 1,

"recordsFiltered": 17,

"recordsTotal": 17

}

DatatablesView,根据DataTables需要格式定义

public class DatatablesView<T> {  

    private List<T> data; //data 与datatales 加载的“dataSrc"对应  

private int recordsTotal;

private int recordsFiltered;

private int draw;

public DatatablesView() {

}

public int getDraw() {

return draw;

}
public void setDraw(int draw) {

this.draw = draw;

}

public List<T> getData() {

return data;

}

public void setData(List<T> data) {

this.data = data;

}

public int getRecordsTotal() {

return recordsTotal;

}

public void setRecordsTotal(int recordsTotal) {

this.recordsTotal = recordsTotal;

this.recordsFiltered = recordsTotal;

}

public int getRecordsFiltered() {

return recordsFiltered;

}

public void setRecordsFiltered(int recordsFiltered) {

this.recordsFiltered = recordsFiltered;

}

}

Service业务处理类,主要根据查询条件统计记录数量,查询当前页数据列表

public DatatablesView<GoodsType> getGoodsTypeByCondition(QueryCondition query) {

DatatablesView<GoodsType> dataView = new DatatablesView<GoodsType>();

//构建查询条件

WherePrams where = goodsTypeDao.structureConditon(query);

Long count = goodsTypeDao.count(where);

List<GoodsType> list = goodsTypeDao.list(where);

dataView.setRecordsTotal(count.intValue());

dataView.setData(list);
return dataView;

}

Dao层就是基本的数据库查询操作,这里省略…

结尾

查询条件这里只使用了关键字模糊查询,根据业务需要,可以动态加入其他查询条件,后台需要做相应处理。

基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询的更多相关文章

  1. jquery.dataTables的探索之路-服务端分页配置

    最近闲来无事想研究下数据表格,因为之前接触过layui和bootstrap的数据表格,本着能学多少学多少的学习态度,学习下dataTables的服务端分页配置.特与同学们一块分享下从中遇到的问题和解决 ...

  2. BootStrap table服务端分页

    涉及到的内容: 1.bootstrap-table插件: 2.mybatisplus分页查询: 3.spring封装对象匹配bootstrap-table插件格式: 4.sql查询隐藏手机号中间四位. ...

  3. asp.net mvc bootstrap datatable 服务端分页

    datatable 服务端分页 因项目需求变动,需处理大量数据,更改成服务端分页,自己两天的学习笔记 先上图[ jqueryui风格] 前端代码: @{ Layout = null;} <!DO ...

  4. asp.net mvc bootstrap datatable 服务端分页 更新槽糕的代码【1】

    datatable 服务端分页 因项目需求变动,需处理大量数据,更改成服务端分页,自己两天的学习笔记 datatable 1.10.7 百度云下载  密码:0ea1 先上图[ jqueryui风格] ...

  5. BootStrap Table和Mybatis Plus实现服务端分页

    一.后台java代码(Mybatis Plus分页) (1)Mybatis Plus分页的配置,在mybatis的xml文件中增加如下配置(Mybatis Plus官方文档:http://baomid ...

  6. 基于开源SuperSocket实现客户端和服务端通信项目实战

    一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...

  7. .net平台 基于 XMPP协议的即时消息服务端简单实现

    .net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...

  8. 基于TCP协议套接字,服务端实现接收客户端的连接并发

    基于TCP协议套接字,服务端实现接收客户端的连接并发 服务端 import socket from multiprocessing import Process server=socket.socke ...

  9. 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发

    ''' 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发 ''' client import socket import time client = socket.socket() clie ...

随机推荐

  1. elment表格分页

    项目的时候遇到了一个分页的bug,经过分析Element源码之后找到了问题所在,现在把这个问题及解决方法记录下来. 项目中要实现的功能是用户选择查看表格的时候在任意页面点击查询,得到结果之后要展示的页 ...

  2. 博客模板更新CSS

    采用了作者#a的模板BlueSky进行了些许修改 在原有基础上加了三个样式,使页面显示风格统一些 #home{ background-color:#fff; } #main{ background-c ...

  3. SA 学习笔记

    后缀数组是解决字符串问题的有力工具--罗穗骞 后缀数组是对字符串的后缀排序的一个工具, sa将排名为i的字符串的开头位置记录下来, rnk将开头位置为i的字符串的排名记录下来. https://www ...

  4. python3使用selenium3的坑

    网络看了很多的文章,大部分都是不完整, 还有很多误导性极强的教程 ,特别是chromedriver这东西.简直一堆坑. 一首先是安装python3.6.5 root@ubuntu:~# add-apt ...

  5. webpack不打包指定的js文件

    背景: 在项目实际开发中,有一些IP地址需要随时修改,进行部署,例如websocket的地址.因此在项目打包的时候,不希望保持IP地址的文件被打包,因此就需要把需要修改的常量独立出来,存放在一个js文 ...

  6. 父类指针指向子类内存,为什么当父类的成员函数不加virtual时,访问的还是父类的成员函数,而不是子类同名的成员函数

    我认为是这样,类的成员函数都在代码区,不同的类的成员函数在代码区有自己的类名称空间限制,类的虚函数在虚函数表中,程序执行的时候,是先在虚函数表中找该成员函数,如果没有找到,就去该类在代码区的成员函数中 ...

  7. 【codeforces 749D】Leaving Auction

    [题目链接]:http://codeforces.com/problemset/problem/749/D [题意] 有n个人在竞价; 按照时间的顺序给出n次竞价(可能有一些人没有参加竞价); 每次竞 ...

  8. POJ 2888

    思路挺清晰的.不过,我就是WA.不清楚为什么,很多数据都过了. 其实,一个置换后若有循环节个数为K,则N必定可以除以尽K.而K正好可以看成一个环.为什么呢?看前K个珠子,就是一个环,而后面的若干个K个 ...

  9. Codeforces Round #274 (Div. 2) 解题报告

    题目地址:http://codeforces.com/contest/479 这次自己又仅仅能做出4道题来. A题:Expression 水题. 枚举六种情况求最大值就可以. 代码例如以下: #inc ...

  10. OC 自己定义 setDateFormat 显示格式

    -(NSString *)getStringFromDate:(NSDate *)aDate { NSDateFormatter *dateFormater=[[NSDateFormatter all ...