Java+ DataTable点击表头字段实现排序

最近看了下datatables,模仿写了一个小例子,和大家分享一下。效果图如下
在这里插入图片描述

jsp代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>快递公司列表</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link rel="stylesheet" type="text/css" href="css/jquery.dataTables.css">
<script type="text/javascript" charset="utf8" src="js/jquery-1.9.1.min.js"></script>
<script type="text/javascript" charset="utf8" src="js/jquery.dataTables.js"></script>
<script type="text/javascript">
	var rootPath = '${pageContext.request.contextPath}';
</script>
</head>
<body>
	<form>
		<span>编号:</span> <input type="text" placeholder="编号" id="id-search">
		<span>名称:</span> <input type="text" placeholder="名称" id="name-search">
		<span>状态:</span> <select id="status-search">
			<option value="">全部</option>
			<option value="1">可以查发</option>
			<option value="2">可以链接</option>
			<option value="3">仅供查询</option>
			<option value="4">不可用</option>
		</select>
		<button type="button" id="btn_search">查询</button>
		
		<a href="#" data-column="0">影藏编号</a>
		<a href="#" data-column="1">影藏名称</a>
		<a href="#" data-column="2">影藏状态</a>
		<a href="#" data-column="3">影藏电话</a>
		<a href="#" data-column="4">影藏网址</a>
		<a href="#" data-column="5">影藏操作</a>
	</form>
	<table id="table" class="display">
		<thead>
			<tr>
				<th>编号</th>
				<th>名称</th>
				<th>状态</th>
				<th>电话</th>
				<th>网址</th>
				<th>操作</th>
			</tr>
		</thead>
		<tbody></tbody>
	</table>
	<script type="text/javascript" src="js/constant.js"></script>
	<script type="text/javascript">
   	$(function(){
   		var $table = $("#table");
   		var _table = $table.dataTable($.extend(true,{},CONSTANT.DATA_TABLES.DEFAULT_OPTION, {
   			ajax : function(data, callback, settings) {
   				//封装请求参数
   				var param = userManage.getQueryCondition(data);
   				$.ajax({
   			            type: "GET",
   			            url: rootPath+"/carrier/getCarrierByPage.action",
   			            cache : false,	//禁用缓存
   			            data: param,	//传入已封装的参数
   			            dataType: "json",
   			            success: function(result) {
 			            		//异常判断与处理
			            		if (result.errorCode) {
			            			alert("查询失败");
			            			return;
								}
   			            		//封装返回数据
   			            		var returnData = {};
   				            	returnData.draw = data.draw;//这里直接自行返回了draw计数器,应该由后台返回
   				            	returnData.recordsTotal = result.total;//总记录数
   				            	returnData.recordsFiltered = result.total;//后台不实现过滤功能,每次查询均视作全部结果
   				            	returnData.data = result.pageData;
   				            	//调用DataTables提供的callback方法,代表数据已封装完成并传回DataTables进行渲染
   				            	//此时的数据需确保正确无误,异常判断应在执行此回调前自行处理完毕
  				            	callback(returnData);
   			            },
   			            error: function(XMLHttpRequest, textStatus, errorThrown) {
   			                alert("查询失败");
   			            }
   			        });
   			},
   			//绑定数据
   	        columns: [
   	            {
   	            	data: "carrierId",//字段名
   	            },
   	            {
   	            	data: "carrierName",//字段名
   	            },
   				{
   					data : "carrierStatus",//字段名
   					render : function(data,type, row, meta) {
   						return (data == 1? "可以查发":data == 2?"可以链接":data == 3?"仅供查询":"不可用");
   					}
   				},
   				{
   					data : "carrierPhone",//字段名
   				},
   				{
   					data : "carrierLink",//字段名
   					orderable : false,//禁用排序
   					render : CONSTANT.DATA_TABLES.RENDER.ELLIPSIS//alt效果
   				},
   				 {
   					data: null,//字段名
   					defaultContent:"",//无默认值
   					orderable : false//禁用排序
   				}
   	        ],
   	        "createdRow": function ( row, data, index ) {
   	        	//不使用render,改用jquery文档操作呈现单元格
   	            var $btnEdit = $('<button type="button" class="btn-edit">修改</button>');
   	            var $btnDel = $('<button type="button" class="btn-del">删除</button>');
   	            $('td', row).eq(5).append($btnEdit).append($btnDel);
   	        },
   	        "drawCallback": function( settings ) {
   	        	//渲染完毕后的回调
   	        	//默认选中第一行
   	        	//$("tbody tr",$table).eq(0).click();
   	        }
   		})).api();//此处需调用api()方法,否则返回的是JQuery对象而不是DataTables的API对象
   		//查询
	   	$("#btn_search").click(function(){
			_table.draw();
		});
   		//行点击事件
	   	$("tbody",$table).on("click","tr",function(event) {
			$(this).addClass("active").siblings().removeClass("active");
			//获取该行对应的数据
			var item = _table.row($(this).closest('tr')).data();
			userManage.showItemDetail(item);
	    });
   		//按钮点击事件
	   	$table.on("click",".btn-edit",function() {
	    	//点击编辑按钮
	        var item = _table.row($(this).closest('tr')).data();
			userManage.editItemInit(item);
		}).on("click",".btn-del",function() {
			//点击删除按钮
			var item = _table.row($(this).closest('tr')).data();
			userManage.deleteItem(item);
		});
   		//影藏列
	   	$('a').on( 'click', function (e) {
	   		var cut = $(this).text()
	   		if(cut.indexOf("显示")>-1){
	   			$(this).text("影藏"+cut.split("示")[1])
	   		}else{
	   			$(this).text("显示"+cut.split("藏")[1])
	   		}
	        e.preventDefault();
	        var column = _table.column( $(this).attr('data-column') );
	        column.visible( ! column.visible() );
	    } );
   		
   	});
   	var userManage = {
   			getQueryCondition : function(data) {
   				var param = {};
   				//组装排序参数
   				if (data.order&&data.order.length&&data.order[0]) {
   					switch (data.order[0].column) {
   					case 0:
   						param.orderColumn = "carrier_id";//数据库列名称
   						break;
   					case 1:
   						param.orderColumn = "carrier_name";//数据库列名称
   						break;
   					case 2:
   						param.orderColumn = "carrier_status";//数据库列名称
   						break;
   					case 3:
   						param.orderColumn = "carrier_phone";//数据库列名称
   						break;
   					default:
   						param.orderColumn = "carrier_id";//数据库列名称
   						break;
   					}
   					//排序方式asc或者desc
   					param.orderDir = data.order[0].dir;
   				}
				param.id = $("#id-search").val();//查询条件
				param.name = $("#name-search").val();//查询条件
				param.status = $("#status-search").val();//查询条件
   				//组装分页参数
   				param.startIndex = data.start;
   				param.pageSize = data.length;
   				param.draw = data.draw;
   				return param;
   			},
   			editItemInit : function(item) {
   				//编辑方法
   				alert("编辑"+item.carrierId+"  "+item.carrierName);
   			},
   			deleteItem : function(item) {
   				//删除
   				alert("删除"+item.carrierId+"  "+item.carrierName);	
   			},
   			showItemDetail: function(item){
   				//点击行
   				alert("点击"+item.carrierId+"  "+item.carrierName);
   			}
   		};
   </script>
</body>
</html>
其余js和css都是datatables官方提供d的

constant.js代码

/*常量*/
var CONSTANT = {
		DATA_TABLES : {
			DEFAULT_OPTION : { //DataTables初始化选项
				language: {
					"sProcessing":   "处理中...",
					"sLengthMenu":   "每页 _MENU_ 项",
					"sZeroRecords":  "没有匹配结果",
					"sInfo":         "当前显示第 _START_ 至 _END_ 项,共 _TOTAL_ 项。",
					"sInfoEmpty":    "当前显示第 0 至 0 项,共 0 项",
					"sInfoFiltered": "(由 _MAX_ 项结果过滤)",
					"sInfoPostFix":  "",
					"sSearch":       "搜索:",
					"sUrl":          "",
					"sEmptyTable":     "表中数据为空",
					"sLoadingRecords": "载入中...",
					"sInfoThousands":  ",",
					"oPaginate": {
						"sFirst":    "首页",
						"sPrevious": "上页",
						"sNext":     "下页",
						"sLast":     "末页",
						"sJump":     "跳转"
					},
					"oAria": {
						"sSortAscending":  ": 以升序排列此列",
						"sSortDescending": ": 以降序排列此列"
					}
				},
                autoWidth: false,	//禁用自动调整列宽
                stripeClasses: ["odd", "even"],//为奇偶行加上样式,兼容不支持CSS伪类的场合
                order: [],			//取消默认排序查询,否则复选框一列会出现小箭头
                processing: false,	//隐藏加载提示,自行处理
                serverSide: true,	//启用服务器端分页
                searching: false	//禁用原生搜索
			},
			COLUMN: {
                CHECKBOX: {	//复选框单元格
                    className: "td-checkbox",
                    orderable: false,
                    width: "30px",
                    data: null,
                    render: function (data, type, row, meta) {
                        return '<input type="checkbox" class="iCheck">';
                    }
                }
            },
            RENDER: {	//常用render可以抽取出来,如日期时间、头像等
                ELLIPSIS: function (data, type, row, meta) {
                	data = data||"";
                	return '<span title="' + data + '">' + data + '</span>';
                }
            }
		}
};

后台代码:

	@RequestMapping(value = "/getCarrierByPage")
	@ResponseBody
	public String getCarrierByPage() throws Exception{
		//直接返回前台
	    String draw = request.getParameter("draw");
	    //数据起始位置
	    String startIndex = request.getParameter("startIndex");
	    //每页显示的条数
	    String pageSize = request.getParameter("pageSize");
	    //获取排序字段
	    String orderColumn = request.getParameter("orderColumn");
	    if(orderColumn == null){
	    	orderColumn = "carrier_id";
	    }
	    //获取排序方式
	    String orderDir = request.getParameter("orderDir");
	    if(orderDir == null){
	    	orderDir = "asc";
	    }
	    //查询条件
	    String carrierId = request.getParameter("id");
	    String carrierName = request.getParameter("name");
	    String carrierStatus = request.getParameter("status");
	    XcxCarrier x = new XcxCarrier();
	    if(null != carrierId && !"".equals(carrierId)){
	    	x.setCarrierId(Long.parseLong(carrierId));
	    }
	    x.setCarrierName(carrierName);
	    if(null != carrierStatus && !"".equals(carrierStatus)){
	    	x.setCarrierStatus(Integer.parseInt(carrierStatus));
	    }
		PageHelper.offsetPage(getPageNo(Integer.parseInt(startIndex)), getPageSize(Integer.parseInt(pageSize)));
		List<XcxCarrier> result = this.xcxCarrierService.querySelectByCondition(orderColumn, orderDir, x);
		PageInfo<XcxCarrier> pageInfo = new PageInfo<XcxCarrier>(result);
		Map<Object, Object> info = new HashMap<Object, Object>();
		System.out.println(JSONObject.fromObject(pageInfo));
	    info.put("pageData", pageInfo.getList());
	    info.put("total", pageInfo.getTotal());
	    info.put("draw", draw);
		return JSONObject.fromObject(info)+"";
	}

转自:https://blog.csdn.net/u011072139/article/details/54312414

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用方法: 支持JAVA和PHP两种后台。 PHP:直接将WebRoot下的文件放到php服务器上直接运行即可,记得启用sqlite3。 JAVA:修改user-manage.js,将访问后台的url由"datasource.php"改为"datasource.jsp",然后将WebRoot下的文件放到tomcat下直接运行。也可使用Eclipse直接导入此项目文件。 简要说明: 使用DataTable默认的ajax交互功能,对传给后台和从后台获取的数据都有命名格式要求,这样一来耦合度较高,不利于后期扩展,不能直接适用于需要跟多种不同前端或其他业务交互的项目。本例子主要展示了自行封装请求参数和返回数据的用法,对后台的交互没有任何格式和命名限制。 基于Bootstrap 2.3.2,相关的其他插件包括图标控件FontAwesome、等待提示控件Spinjs(修改版)、弹窗控件lhgdialog(修改版) 主要展现: 封装请求参数(查询、排序、分页,不再需要data、dataFilter和dataSrc) 封装返回数据 自定义查询参数 服务器分页 自行控制和自定义遮罩效果 生成自定义效果的单元格(在线离线) 生成复选框单元格 响应复选框选择事件 生成操作按钮单元格 响应操作栏按钮点击事件 响应行点击事件 渲染回调事件(默认选中第一行) 分页栏增加跳页功能(直接修改了dataTables.bootstrap.js和dataTables.bootstrap.css) CSS实现单元格超长文字省略号显示 CSS实现单元格连续纯字母数字强制换行显示
DataTable 是 ADO.NET 里面的一个重要概念,它代表着一张数据表,可以对其中的数据进行操作。在 Java 中,虽然没有官方的 DataTable 类,但是我们可以通过编写代码来实现一个类似的对象。 下面,我将介绍一下如何在 Java实现 DataTable 对象。 1. 创建 DataTable 类 首先,我们需要创建一个 DataTable 类来代表数据表。这个类应该具有以下基本属性: - 表名:代表数据表的名称。 - 列名:代表数据表中的列名。 - 行数据:代表数据表中的行数据。 代码如下: ```java public class DataTable { private String tableName; private List<String> columnNames; private List<List<Object>> rows; public DataTable(String tableName, List<String> columnNames) { this.tableName = tableName; this.columnNames = columnNames; this.rows = new ArrayList<>(); } // 省略 get/set 方法 } ``` 2. 添加数据 接下来,我们需要添加数据到数据表中。我们可以提供一个 addRow 方法来添加一行数据。这个方法需要接受一个 List<Object> 参数,代表一行数据。在该方法中,我们可以将这一行数据添加到 rows 列表中。 代码如下: ```java public void addRow(List<Object> rowData) { this.rows.add(rowData); } ``` 3. 获取数据 为了获取数据表中的数据,我们可以提供一个 getRows 方法来获取所有的行数据。该方法返回一个 List<List<Object>> 类型的数据。 代码如下: ```java public List<List<Object>> getRows() { return this.rows; } ``` 4. 查询数据 为了查询数据表中的数据,我们可以提供一个 select 方法来根据条件查询数据。该方法接受一个 Predicate<List<Object>> 类型的参数,代表查询条件。在该方法中,我们可以使用 Java 8 的 Stream API 来筛选符合条件的数据。 代码如下: ```java public List<List<Object>> select(Predicate<List<Object>> predicate) { return this.rows.stream().filter(predicate).collect(Collectors.toList()); } ``` 5. 更新数据 为了更新数据表中的数据,我们可以提供一个 update 方法来更新符合条件的数据。该方法需要接受一个 Predicate<List<Object>> 类型的参数,代表更新条件,以及一个 Consumer<List<Object>> 类型的参数,代表更新操作。在该方法中,我们可以使用 Java 8 的 Stream API 来筛选符合条件的数据,并进行更新操作。 代码如下: ```java public void update(Predicate<List<Object>> predicate, Consumer<List<Object>> updater) { this.rows.stream().filter(predicate).forEach(updater); } ``` 6. 删除数据 为了删除数据表中的数据,我们可以提供一个 delete 方法来删除符合条件的数据。该方法需要接受一个 Predicate<List<Object>> 类型的参数,代表删除条件。在该方法中,我们可以使用 Java 8 的 Stream API 来筛选符合条件的数据,并进行删除操作。 代码如下: ```java public void delete(Predicate<List<Object>> predicate) { this.rows.removeIf(predicate); } ``` 7. 完整代码 完整的 DataTable 类代码如下: ```java import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; public class DataTable { private String tableName; private List<String> columnNames; private List<List<Object>> rows; public DataTable(String tableName, List<String> columnNames) { this.tableName = tableName; this.columnNames = columnNames; this.rows = new ArrayList<>(); } public void addRow(List<Object> rowData) { this.rows.add(rowData); } public List<List<Object>> getRows() { return this.rows; } public List<List<Object>> select(Predicate<List<Object>> predicate) { return this.rows.stream().filter(predicate).collect(Collectors.toList()); } public void update(Predicate<List<Object>> predicate, Consumer<List<Object>> updater) { this.rows.stream().filter(predicate).forEach(updater); } public void delete(Predicate<List<Object>> predicate) { this.rows.removeIf(predicate); } // 省略 get/set 方法 } ``` 这样,我们就成功地实现了一个简单的 DataTable 类。当然,这个类还有很多可以改进的地方,比如支持数据类型、索引等功能。不过,以上代码足以满足大部分的数据操作需求了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值