`
wx1569110409
  • 浏览: 18744 次
文章分类
社区版块
存档分类
最新评论

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+springmvc+bootstrap实现分页,包含数据库 Datatables是一款jquery表格插件。它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能。 分页,即时搜索和排序 几乎支持任何数据源:DOM, ...

    datatables1.10+springMVC分页

    datatables1.10向上兼容。日常情况下使用前端插件进行分页,通过后端解析datatables请求来的参数进行request参数解析(demo中对...此demo对datatables1.10前端调用后台分页、排序等进行解析。并生成返回数据传向前台。

    仿jquery.dataTables的分页(查询+排序)

    仿jquery.dataTables的分页(查询+排序),jquery插件式开发简单示例。

    java初学者教程,前端jquery.datatables.js分页

    教程的核心是利用SpringBoot、MyBatis框架与JSP、jQuery以及DataTables.js库进行数据的展示和分页。 首先,SpringBoot是一个快速开发框架,它简化了Java应用的创建、配置和部署。通过集成大量默认设置和依赖,...

    PHP+Ajax+bootstrap+dataTables无刷新分页表格插件

    "PHP+Ajax+bootstrap+dataTables无刷新分页表格插件"的组合就是实现这一目标的有效方式。这个技术栈允许开发者构建出实时更新、无需刷新页面的动态表格,提供高效的数据浏览和管理功能。 首先,PHP是一种广泛使用的...

    bootstrap3+datatables+servlet+sqlite3后台分页增删改查DEMO

    在本项目中,Servlet承担了与后台数据库交互的角色,它处理来自Datatables的Ajax请求,执行SQL查询(如SELECT、INSERT、UPDATE、DELETE)来完成数据的增删改查操作,并将结果以JSON格式返回给前端。 SQLite3则是一...

    strut2.0 + hibernate3.0 + jquery.datatables+mysql 5.0实现的 hibernate分页

    1,这个项目是strut2.0 + hibernate3.0 + jquery.datatables+mysql 5.0实现的 hibernate分页(无排序,搜索,仅仅分页显示),服务器端分页在datatables上展现,有关 datatables的知识请关注它的官网...

    JQuery DataTables示例,包含分页、拖拽、导出

    这个示例中提到了前后端分页,这意味着项目同时支持这两种方式,可以根据需求灵活选择。 2. **拖拽列**:DataTables允许用户通过拖放操作来调整表格列的顺序,这对于需要频繁调整列布局的用户非常实用。这一特性...

    后台模板HTML+CSS

    【后台模板HTML+CSS】是一种常见的网页设计资源,主要用于构建网站的管理界面,即后台系统。后台模板通常包括登录页面、仪表盘、用户管理、数据展示、设置等多个功能模块,帮助开发者快速搭建功能完备的后台管理系统...

    dataTables java后台解析http请求参数demo

    在IT行业中,尤其是在Web开发领域,前端与后端的数据交互是至关重要的。在这个"datatables java后台解析http请求参数demo"中,我们将探讨如何利用Java技术在后台处理来自前端DataTable库的HTTP请求参数。DataTable是...

    jquery datatables 插件 后台代码

    在本篇文章中,我们将深入探讨如何在后台实现与DataTables的集成。 **1. 数据接口设计** 为了使DataTables能够从后端获取数据,我们需要设计一个符合其规范的API接口。通常,这个接口需要返回JSON格式的数据,包含...

    基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询

    在本项目中,我们利用SpringMVC作为后端框架,Bootstrap作为前端UI库,以及DataTables插件来实现一个功能完善的表格展示系统,包括服务端分页和模糊查询功能。以下将详细介绍这些技术的整合与应用。 1. SpringMVC:...

    mybatisPlus-dataTables:dataTables-mybatisPlus 后台分页、排序、搜索(未完成)

    dataTables-mybatisPlus 后台分页、排序、搜索 软件架构 软件架构说明 安装教程 xxxx xxxx xxxx 使用说明 xxxx xxxx xxxx 参与贡献 Fork 本项目 新建 Feat_xxx 分支 提交代码 新建 Pull Request 码云特技 使用 ...

    struts2+hibernate+Spring后台表格分页

    在这个“Struts2+Hibernate+Spring后台表格分页”项目中,我们将深入探讨如何整合这三个框架实现数据的动态展示和分页。 1. **Struts2框架**:Struts2作为MVC(模型-视图-控制器)架构的实现,主要负责处理用户的...

    SSM+Mybatis+datatables+H-ui后台管理系统

    SSM+Mybatis+datatables+H-ui后台管理系统是一个典型的Java Web项目,它结合了Spring、Spring MVC、Mybatis和H-ui等多个技术组件,旨在构建一个功能完善的后台管理平台。这个系统非常适合Java初学者用来学习后端分页...

    springMVC+velocity实现仿Datatables局部刷新分页方法

    在本文中,我们将探讨如何使用SpringMVC和Velocity框架实现一个仿Datatables的局部刷新分页功能。这个方法适用于那些不希望使用Datatables插件,但仍然需要保持页面风格统一和避免查询参数在页面上回显的情况。 ...

    ssh框架搭建+datatables分页

    SSH框架搭建与Datatables分页技术详解 SSH(Spring、Struts、Hibernate)是一个常见的Java Web开发框架,它由Spring负责控制层,Struts处理视图层,Hibernate管理持久层。在本教程中,我们将深入探讨如何搭建SSH...

    H+的后台响应式汉化模板

    4. **数据表格DataTables**:table_data_tables.html是关于数据展示和管理的部分,DataTables是一个强大的jQuery插件,提供了排序、搜索、分页等功能,适用于处理大量数据的后台管理系统,使得数据的查看和管理更加...

    datatables +springmvc render与日期转换(moment.js)

    Moment.js 是一个 JavaScript 日期处理类库,用于解析、检验、操作、以及显示日期... moment.js moment.min.js 12.4k moment+多语言支持.js moment+多语言支持

Global site tag (gtag.js) - Google Analytics