- 浏览: 18659 次
文章分类
最新评论
Datatables 汉化 后台分页(2种方式+JFinal与SpringMvc后台)
Datatables是一款很便捷,功能很强大的前端分页插件。但是,在实际应用中,表格通常数据量会非常庞大,所以不提倡把数据一次性加载到页面。所以,datatables使用后台分页是一个不错的选择。但是,使用后台分页就要放弃datatables自带的3个功能:排序,分页条数选项,内容搜索。因为采用后端分页后,这三项内容都必须由后端完成(目前因为本人能力有限,只完成了分页和内容搜索,排序网上也有其他人做过,有心人不妨试成功了跟我说一下)。
本人用过amazeui的datatables插件,也使用过原生datatables及其提供的bootstrap风格。两者其实一样。只是amazeui的datatables帮你汉化完和引入了amazeui的table风格。这里不再详述要引用的css和js,具体可以百度。
首先讲讲如何使用datatables的汉化。
$('#dimtable').DataTable({
"searching" : false,//关闭自带搜索
"bLengthChange" : false,//关闭自带分页选项
"ordering" : false,//关闭排序
"serverSide" : true,//这个用来指明是通过服务端来取数据
"processing" : true, //打开数据加载时的等待效果
"oLanguage" : {
"sLengthMenu" : "每页显示 _Menu_条记录",
"sInfo" : "当前显示_START_到_END_条,共_TOTAL_条记录",
"sInfoEmpty" : "显示第 0 至 0 项结果,共 0 项",
"sZeroRecords" : "对不起,查询不到相关的数据",
"sInfoFiltered" : "",//"(从 _MAX_ 条记录过滤)"此项为显示过滤信息
"oPaginate" : {
"sFirst" : "首页",
"sPrevious" : "上一页",
"sNext" : "下一页",
"sLast" : "尾页"
},
"sSearch" : "查找"},
});
});
你需要定义一个table,及其表头。同时,可以通过控制th的宽度控制表格宽度。接下来,我们通过id给这个table绑定datatables。
<table width="100%" class="am-table am-table-compact am-table-striped tpl-table-black" id="list">
<thead>
<tr>
<th style="display:none">ID</th>
<th style="width:50%">地址</th>
<th style="width:20%">坐标</th>
<th style="width:30%">操作</th>
</tr>
</thead>
<tbody>
<!-- more data -->
</tbody>
</table>
接下来,我们开始第一种后台分页的方法。这种方法目前暂不支持自定义刷新,仅点击分页信息时会向后台请求数据。具体实现如下代码。
var datatable
$(function(){
datatable=$('#list').DataTable({
"searching": false,
"bLengthChange": false,
"ordering": false,
"serverSide": true,//这个用来指明是通过服务端来取数据
"sAjaxSource": "#(ctx)/admin/getHouseInfo",//这个是请求的地址
"fnServerData": retrieveData, // 获取数据的处理函数
"columns" : [ //处理行数据,这里的data数量必须与<th>的数量一致,否则报错。同时,function中的data包含整行数据信息
{ data : "id","visible" : false },
{ data : function(data, type, full){
return data.province+data.city+data.county+data.address;
}},
{ data : function(data, type, full){
return "("+data.ax+","+data.ay+")";
}},
{
data : function(data, type, full){
return "<div class=\"tpl-table-black-operation\">"+
"<a href=\"javascript:;\"><i class=\"am-icon-pencil\"></i> 修改</a>"+
"<a href=\"javascript:;\"><i class=\"am-icon-pencil\"></i> 管理</a>"+
"<a href=\"javascript:;\" class=\"tpl-table-black-operation-del\"><i class=\"am-icon-trash\"></i> 删除</a></div>";
}}
]
});
});
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) {
//报错执行方法
}
});
}
此时后台接收到的请求JSON信息为:
aoData=[{"name":"sEcho","value":1},
{"name":"iColumns","value":4},
{"name":"sColumns","value":",,,"},
{"name":"iDisplayStart","value":0},
{"name":"iDisplayLength","value":10},
{"name":"mDataProp_0","value":"id"},
{"name":"mDataProp_1","value":"name"},
{"name":"mDataProp_2","value":"disname"},
{"name":"mDataProp_3","value":"function"}]
其中,有用的信息为sEcho(不知道为什么,就是有用),iDisplayStart:请求数据的初始位,IDisplayLength为每页行数。本人默认使用10行分页,有需要的人可以自行提取次数据。本人后台方法(JFinal)如下,SpringMvc差不多,参考一下就行:
public void getHouseInfo(){
Map<String, Integer> map = DataTableUtil.getPageNo(getPara("aoData"));
Page<House> list = houseService.pageHouse(map.get("iDisplayStart")/10+1, 10);//因为datatables请求后台只提供请求初始位置信息(如10个分页,那第一页请求信息为0,第二页为10,第三页为20)。这个方法是JFinal的分页方法,第一个参数为页数,第二个参数为每页行数。若不按10条分页,请提取IDisplayLength参数,替换数据10。
renderJson(DataTableUtil.dataType(list, map.get("sEcho")));
}
private static Map<String, Integer> map = new HashMap<>();
private static JSONObject getObj = new JSONObject();
//提取JSON数据中有用的信息
public static Map<String, Integer> getPageNo(String json){
JSONArray jsonarray = JSONArray.parseArray(json);
for (int i = 0; i < jsonarray.size(); i++) {
JSONObject obj = (JSONObject) jsonarray.get(i);
if (obj.get("name").equals("sEcho"))
map.put("sEcho", Integer.parseInt(obj.getString("value")));
if (obj.get("name").equals("iDisplayStart"))
map.put("iDisplayStart", Integer.parseInt(obj.getString("value")));
}
return map;
}
//回传数据信息,需按照datatables的数据格式返回信息
public static <E> String dataType(Page<E> page,Integer pageNum){
List<E> list = page.getList();
getObj.put("sEcho", pageNum);// 不知道这个值有什么用,有知道的请告知一下
getObj.put("iTotalRecords", list.size());//每页行数
getObj.put("iTotalDisplayRecords",page.getTotalRow());//分页的总行数
getObj.put("aaData", list);//分页信息
return getObj.toString();
}
接下来我们说第二种分页方法,这种分页方法比较好用,支持随意向后台传递自定义数据,并支持手动刷新datatables。代码如下:
var datatable
$(function(){
datatable=$('#list').DataTable({
"searching": false,
"bLengthChange": false,
"ordering": false,
"serverSide": true,//这个用来指明是通过服务端来取数据
"processing": true, //打开数据加载时的等待效果
"ajax":{
"url": "#(ctx)/admin/getHouseInfo",
"type":"post",
"data": function ( d ) {
var level1 = $('#search').val(); //此处为外部搜索框信息
//添加额外的参数传给服务器
d.extra_search = level1;
return {"aoData":JSON.stringify(d)};
}
},
"columns" : [
{ data : "id","visible" : false },
{ data : function(data, type, full){
return data.province+data.city+data.county+data.address;
}},
{ data : function(data, type, full){
return "("+data.ax+","+data.ay+")";
}},
{
data : function(data, type, full){
return "<div class=\"tpl-table-black-operation\">"+
"<a href=\"javascript:;\"><i class=\"am-icon-pencil\"></i> 修改</a>"+
"<a href=\"javascript:;\"><i class=\"am-icon-pencil\"></i> 管理</a>"+
"<a href=\"javascript:;\" class=\"tpl-table-black-operation-del\"><i class=\"am-icon-trash\"></i> 删除</a></div>";
}}
]
});
});
//搜索框的搜索按钮点击事件。其它地方想刷新datatables直接使用里面的方法就好。
$("#searchBtn").on('click',function(){
datatable.ajax.reload();
});
此时,后台接收到的JSON信息与第一个方法完全不一样:
aoData={"draw":1,
"columns":[{"data":"id","name":"","searchable":true,"orderable":false,"search"{"value":"","regex":false}},{"data":"function","name":"","searchable":true,"orderable":false,"search":{"value":"","regex":false}},{"data":"function","name":"","searchable":true,"orderable":false,"search":{"value":"","regex":false}},{"data":"function","name":"","searchable":true,"orderable":false,"search":{"value":"","regex":false}}],
"order":[],
"start":0,
"length":10,
"search":{"value":"","regex":false},
extra_search":""}
可以看到有用信息为start(初始位置),length(每页长度),extra_search(额外传送参数)。
所以,本人的JFinal后台如下写:
public void getHouseInfo(){
Map<String, Integer> map = DataTableUtil.getPageNoAjax(getPara("aoData"));
Page<House> list = houseService.pageHouse(map.get("iDisplayStart")/10+1, 10);
renderJson(DataTableUtil.dataTypeAjax(list));
}
private static Map<String, Integer> map = new HashMap<>();
private static JSONObject getObj = new JSONObject();
//目前我是按照10行分页,有需要的按照其他行数分页的请提取参数length
public static Map<String, Integer> getPageNoAjax(String json){
JSONObject jobject = JSONObject.parseObject(json);
map.put("iDisplayStart", Integer.parseInt(jobject.getString("start")));
return map;
}
//返回数据,与第一种返回数据格式不一样
public static <E> String dataTypeAjax(Page<E> page){
List<E> list = page.getList();
getObj.put("iTotalRecords", list.size());//每页的行数
getObj.put("iTotalDisplayRecords",page.getTotalRow());//分页总行数
getObj.put("aaData", list);//分页内容信息
return getObj.toString();
}
本人写的SpringMvc后台如下:
@RequestMapping("getHouseInfo")
@ResponseBody
public DataTableViewPage<House> getPageList(String aoData) {
Map<String, Object> param = houseservice.getExtraParam(aoData);//获取相关参数
String search = (String) param.get("extra_search");//获取搜索框参数
Pageable pageable = houseservice.getPageable(aoData);//获取分页信息
Page<House> housepage = null;
if (search.isEmpty())
housepage = houseservice.getAllHouse(pid,pageable);
else
housepage = houseservice.getHouseBySearch(search, pageable);
return new DataTableViewPage<House>((int) housepage.getTotalElements(), housepage.getSize(), housepage.getContent());
}
//获取参数
@Override
public Map<String, Object> getExtraParam(String json) {
Map<String, Object> map = new HashMap<String, Object>();
JSONObject jo = JSONObject.parseObject(json);
map.put("extra_search", jo.getString("extra_search"));
return map;
}
//获取分页信息
@Override
public Pageable getPageable(String json) {
JSONObject jo = JSONObject.parseObject(json);
int pageNo = jo.getIntValue("start") / 10;
Pageable pageable = new PageRequest(pageNo, 10);
return pageable;
}
//返回数据类型DataTableViewPage
public class DataTableViewPage<T> {
private List<T> aaData;
private Integer iTotalDisplayRecords;
private Integer iTotalRecords;
public DataTableViewPage(Integer iTotalDisplayRecords,Integer iTotalRecords,List<T> aaData){
this.aaData = aaData;
this.iTotalDisplayRecords=iTotalDisplayRecords;
this.iTotalRecords = iTotalRecords;
}
public List<T> getAaData() {
return aaData;
}
public void setAaData(List<T> aaData) {
this.aaData = aaData;
}
public int getiTotalDisplayRecords() {
return iTotalDisplayRecords;
}
public void setiTotalDisplayRecords(int iTotalDisplayRecords) {
this.iTotalDisplayRecords = iTotalDisplayRecords;
}
public int getiTotalRecords() {
return iTotalRecords;
}
public void setiTotalRecords(int iTotalRecords) {
this.iTotalRecords = iTotalRecords;
}
}
转载于:https://my.oschina.net/u/2349928/blog/1510610
相关推荐
datatables+springmvc+bootstrap实现分页,包含数据库 Datatables是一款jquery表格插件。它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能。 分页,即时搜索和排序 几乎支持任何数据源:DOM, ...
datatables1.10向上兼容。日常情况下使用前端插件进行分页,通过后端解析datatables请求来的参数进行request参数解析(demo中对...此demo对datatables1.10前端调用后台分页、排序等进行解析。并生成返回数据传向前台。
仿jquery.dataTables的分页(查询+排序),jquery插件式开发简单示例。
教程的核心是利用SpringBoot、MyBatis框架与JSP、jQuery以及DataTables.js库进行数据的展示和分页。 首先,SpringBoot是一个快速开发框架,它简化了Java应用的创建、配置和部署。通过集成大量默认设置和依赖,...
"PHP+Ajax+bootstrap+dataTables无刷新分页表格插件"的组合就是实现这一目标的有效方式。这个技术栈允许开发者构建出实时更新、无需刷新页面的动态表格,提供高效的数据浏览和管理功能。 首先,PHP是一种广泛使用的...
在本项目中,Servlet承担了与后台数据库交互的角色,它处理来自Datatables的Ajax请求,执行SQL查询(如SELECT、INSERT、UPDATE、DELETE)来完成数据的增删改查操作,并将结果以JSON格式返回给前端。 SQLite3则是一...
1,这个项目是strut2.0 + hibernate3.0 + jquery.datatables+mysql 5.0实现的 hibernate分页(无排序,搜索,仅仅分页显示),服务器端分页在datatables上展现,有关 datatables的知识请关注它的官网...
这个示例中提到了前后端分页,这意味着项目同时支持这两种方式,可以根据需求灵活选择。 2. **拖拽列**:DataTables允许用户通过拖放操作来调整表格列的顺序,这对于需要频繁调整列布局的用户非常实用。这一特性...
【后台模板HTML+CSS】是一种常见的网页设计资源,主要用于构建网站的管理界面,即后台系统。后台模板通常包括登录页面、仪表盘、用户管理、数据展示、设置等多个功能模块,帮助开发者快速搭建功能完备的后台管理系统...
在IT行业中,尤其是在Web开发领域,前端与后端的数据交互是至关重要的。在这个"datatables java后台解析http请求参数demo"中,我们将探讨如何利用Java技术在后台处理来自前端DataTable库的HTTP请求参数。DataTable是...
在本篇文章中,我们将深入探讨如何在后台实现与DataTables的集成。 **1. 数据接口设计** 为了使DataTables能够从后端获取数据,我们需要设计一个符合其规范的API接口。通常,这个接口需要返回JSON格式的数据,包含...
在本项目中,我们利用SpringMVC作为后端框架,Bootstrap作为前端UI库,以及DataTables插件来实现一个功能完善的表格展示系统,包括服务端分页和模糊查询功能。以下将详细介绍这些技术的整合与应用。 1. SpringMVC:...
dataTables-mybatisPlus 后台分页、排序、搜索 软件架构 软件架构说明 安装教程 xxxx xxxx xxxx 使用说明 xxxx xxxx xxxx 参与贡献 Fork 本项目 新建 Feat_xxx 分支 提交代码 新建 Pull Request 码云特技 使用 ...
在这个“Struts2+Hibernate+Spring后台表格分页”项目中,我们将深入探讨如何整合这三个框架实现数据的动态展示和分页。 1. **Struts2框架**:Struts2作为MVC(模型-视图-控制器)架构的实现,主要负责处理用户的...
SSM+Mybatis+datatables+H-ui后台管理系统是一个典型的Java Web项目,它结合了Spring、Spring MVC、Mybatis和H-ui等多个技术组件,旨在构建一个功能完善的后台管理平台。这个系统非常适合Java初学者用来学习后端分页...
在本文中,我们将探讨如何使用SpringMVC和Velocity框架实现一个仿Datatables的局部刷新分页功能。这个方法适用于那些不希望使用Datatables插件,但仍然需要保持页面风格统一和避免查询参数在页面上回显的情况。 ...
SSH框架搭建与Datatables分页技术详解 SSH(Spring、Struts、Hibernate)是一个常见的Java Web开发框架,它由Spring负责控制层,Struts处理视图层,Hibernate管理持久层。在本教程中,我们将深入探讨如何搭建SSH...
4. **数据表格DataTables**:table_data_tables.html是关于数据展示和管理的部分,DataTables是一个强大的jQuery插件,提供了排序、搜索、分页等功能,适用于处理大量数据的后台管理系统,使得数据的查看和管理更加...
Moment.js 是一个 JavaScript 日期处理类库,用于解析、检验、操作、以及显示日期... moment.js moment.min.js 12.4k moment+多语言支持.js moment+多语言支持