dhtmlxGrid分页与排序

本文介绍了如何使用dhtmlxGrid组件在Java后端与JSON数据源的支持下,实现在前端进行表格数据的分页和排序功能。通过控制器处理请求,页面端的JavaScript代码以及特定的脚本配置,最终展示出具有动态分页和排序能力的数据表格。

1、服务端处理的Conntllor

 

package com.snailteam.reporting.web;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.validation.Validator;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.snailteam.reporting.domain.DataSource;
import com.snailteam.reporting.domain.json.JsonRow;
import com.snailteam.reporting.domain.json.JsonTable;
import com.snailteam.reporting.service.DataSourceService;
import com.snailteam.reporting.util.PojoMapper;


/**
 * @Description:异步请求,dhtmlGrid数据的处理
 * 
 * @Author: xiaofancn
 * @Date: 2011-7-20 上午10:51:01
 * 
 */
@Controller
@RequestMapping("/ajax")
public class Ajax {
	private Logger logger = LoggerFactory.getLogger(Ajax.class);
	private Validator validator;
	@Resource
	private transient DataSourceService dataSourceService;

	@Autowired
	public Ajax(Validator validator) {
		this.validator = validator;
	}

	
	
	/**
	 * 根据页面请求的起始页和数量参数 返回json对象,spring负责将对象序列化成json
	 * 
	 * @param posStart
	 * @param count
	 * @return
	 */
	@RequestMapping(value = "/ds", method = RequestMethod.GET)
	@ResponseBody
	// JsonTable是我封装好的对象,页面dhtmlxGrid脚本能够识别的Json格式
	public JsonTable loadDataSources(Integer posStart, Integer count,
			@RequestParam(required = false) String orderby,
			@RequestParam(required = false) String direct) throws Exception {

		JsonTable table = new JsonTable();
		List<JsonRow> rows = new ArrayList<JsonRow>();
		if (direct != null && !direct.equals("asc"))
			direct = "DESC";

		// DataSource是我们项目中的实体
		List<DataSource> lists = dataSourceService.loadDataSources(posStart,
				count, orderby, direct);
		if (lists == null)
			return null;
		for (DataSource ds : lists) {
			JsonRow row = new JsonRow();
			List<String> datas = new ArrayList<String>();

			row.setId(ds.getId());
			datas.add(ds.getId().toString());
			datas.add(ds.getName());
			datas.add(ds.getDescription());
			datas.add(ds.getJdbcDriver());
			datas.add(ds.getJdbcPassword());
			datas.add(ds.getJdbcUserName());
			datas.add(ds.getJdbcUrl());

			rows.add(row);
			row.setData(datas);
		}
		table.setPos(posStart);
		table.setRows(rows);
		table.setTotal_count(dataSourceService.getCount().intValue());
		//测试代码 System.out.println(PojoMapper.toJson(table, true));
		return table;

	}
}
 

 

 2、页面端的代码

 

<html>
<head>
<title>小例子</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=8">
<link rel="stylesheet" href="/base/static/style/blueprint/screen.css" type="text/css" charset="UTF-8" media="screen, projection">
<link rel="stylesheet" href="/base/static/style/blueprint/print.css" type="text/css" charset="UTF-8" media="print">
<link rel="stylesheet" type="text/css" href="/base/static/dhtmlx/3.0/dhtmlx.css" charset="UTF-8">
<link rel="SHORTCUT ICON" href="/base/static/imgs/favicon.ico"><script src="/base/static/dhtmlx/3.0/dhtmlx.js" type="text/javascript" charset="UTF-8"></script>
<script src="/base/static/jquery-1.6.js" type="text/javascript" charset="UTF-8"></script>
<script src="/base/static/jquery.form.js" type="text/javascript" charset="UTF-8"></script>
<script src="/base/static/mvcUtil.js" type="text/javascript" charset="UTF-8"></script>
<script src="/base/static/dhtmlx/3.0/dhtmlxgrid_json.js" type="text/javascript" charset="UTF-8"></script>
<script type="text/javascript" charset="UTF-8">
		var webStatic = "/base/static/";
		var dhxSkin = "dhx_skyblue";
		var webroot = "/base/";
		var dhxImagePath = "/base/static/dhtmlx/3.0/imgs/";
		
	</script>
<script src="/base/static/dataSource/initDhtmlDrid.js" type="text/javascript" charset="UTF-8"></script>
</head>


<body>
<table width="500px" id="paging_container">
   <tr>
      <td id="recinfoArea"><!--页数信息--></td>
   </tr>
   <tr>
      <td>
         <div id="gridbox" style="widht:100%; height:150px; background-color:white;overflow:hidden"><!--  --></div>
      </td>
   </tr>
   <tr>
      <td id="pagingArea"><!--页数区域 --></td>
   </tr>
</table>
</body>
</html>
 

 

3、我们的脚本   static/dataSource/initDhtmlDrid.js

var mygrid;
var mygridUrl = webroot + "ajax/ds?un="+ Date.parse(new Date());
$(document).ready(function() {
	//初始化Grid表格
	doInitGrid();
	//注册Grid表格的排序事件
	mygrid.attachEvent("onBeforeSorting", sortGridOnServer);
});

function doInitGrid() {
	mygrid = new dhtmlXGridObject('gridbox');
	mygrid.setImagePath(webroot + "static/dhtmlx/3.0/imgs/"); // 指定图片路径
	mygrid
			.setHeader("id,name,description,jdbcDriver,jdbcUserName,jdbcPassword,jdbcUrl"); // 设置表头显示
	mygrid.init();
	//设置可排序的字段
	mygrid.setColSorting("id,name");
	//允许分页
	mygrid.enablePaging(true, 18, 5, "pagingArea", true, "recinfoArea");
	mygrid.load(webroot + "ajax/ds?posStart=0&count=18&un="
			+ Date.parse(new Date()), "json");
	mygrid.xmlFileUrl=webroot + "ajax/ds";//分页时,dhtmlxGrid能自动为我们添加参数如posStart和count
}


function sortGridOnServer(ind, gridObj, direct) {
	mygrid.clearAll();
	mygrid.load(webroot + "ajax/ds?posStart=0&count=18&un="
			+ Date.parse(new Date())+ "&orderby="
			+ gridObj + "&direct=" +direct ,"json");
	mygrid.xmlFileUrl=webroot + "ajax/ds";
	mygrid.setSortImgState(true, gridObj, direct);
	return true;
}

 

4、显示效果

 


 

 

 

 

 

参考代码构造的json对象

package com.snailteam.reporting.domain.json;

import java.util.List;

public class JsonRow {
	Object id;
	Object data;
	public Object getId() {
		return id;
	}
	public void setId(Object id) {
		this.id = id;
	}
	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
	
}

public class JsonTable {
	List<JsonRow> rows;
	int total_count;
	int pos;

	public int getPos() {
		return pos;
	}

	public void setPos(int pos) {
		this.pos = pos;
	}

	public int getTotal_count() {
		return total_count;
	}

	public void setTotal_count(int total_count) {
		this.total_count = total_count;
	}

	public List<JsonRow> getRows() {
		return rows;
	}

	public void setRows(List<JsonRow> rows) {
		this.rows = rows;
	}
}

 

 

dhtmlxGrid项目参考代码

// 初始化角色信息的dhtmlxGrid
function initRoleGrid() {
	roleGrid = new dhtmlXGridObject('roleGrid');
	roleGrid.setHeader(" ,角色名,角色类型");

	//允许可以选中多行
	roleGrid.enableMultiselect(true);
	roleGrid.enableMultiline(true);
	roleGrid.setImagePath(webroot + "static/dhtmlx/3.0/imgs/");
	//第一类设置checkbox显示(数据为1,0)
	roleGrid.setColTypes("ch,ro,ro");
	roleGrid.init();
	roleGrid.load(webroot + "user/roles?&un=" + Date.parse(new Date())
			+ "&userId=" + $("#userId").val(), "json");
	roleGrid.xmlFileUrl = webroot + "user/roles";

}
//获取所有行id数组对象
function getSelectRowId() {

	var idArray = new Array();
	//根据索引遍历所有的行
	for ( var index = 0; index < roleGrid.getRowsNum(); index++) {
		var ch = roleGrid.cellByIndex(index,0);//index行,第一列
		if (ch.isChecked()) {//checkbox是否选中
			idArray.push(roleGrid.getRowId(index));// 获取index行的Id属性值
		}
	}
	return idArray;
}
 
1 之前上传了dhtmlx的官方demo上去 都很久了 (http: download youkuaiyun.com detail pxzsky 2946815)看大家最近有需求 希望得到实际的使用代码 因为组件很多 所以我觉得大家可能对一些核心组件还是很感兴趣的 特别是分页列表 树等 这个在项目测试中我都用过了 这次先把列表的拿出来 2 因为涉及版权问题 如果你的产品要开源或者花钱购买授权 都没问题 否则最好还是仅仅内网学习使用 否 则需要考虑后果的 目前dhmtl只有GPL协议和商业协议 3 在我的其他资源中也有关于列表和树的组件使用示例: http: download youkuaiyun.com detail pxzsky 6659071 这个工程是免费的(也可以认为开源) 里面使用了dhtml tree grid 很多地方用了tree 而grid目前只剩下角色管理列表了 后续也不想再用grid了 你可以参考 如果不想麻烦 那么就接着往下看 4 在它的免费版中(就是可以开源的) 最早(2 5)是没有分页库的 只有商业版有 后来经过高人指点 得到了crack 带有分页js库 很好用 其实主要是知道js中要传递的分页参数名字就ok了 5 资源包中有具体使用代码和组件的整个js 前端使用jsp 你只需要看分页那部分即可 其他的传的变量可以不管 以下粘贴重要的ui代码调用: <script type "text javascript"> var currpage <% request getParameter "cntPage" %>; 记录当前页面 $ document ready function { 初始化列表 initGrid ; } ; window dhx globalImgPath "${ctx} images public "; 初始化列表 function initGrid { showSkyLoading "数据加载中 请稍候 " ; mygrid new dhtmlXGridObject "projectlist" ; mygrid setImagePath " script dhtml grid imgs " ; mygrid setHeader "客户 项目 状态 是否ZZ 审核 提交时间 提交人 编辑 删除" ; mygrid setInitWidths " 180 90 50 70 90 70 50 50" ; mygrid setColAlign "left left left center left left left left left" ; mygrid setColTypes "ro ro ro ro ro ro ro ro ro" ; mygrid enableAutoHeight true "460" ; mygrid init ; mygrid setSkin "gray" ; mygrid enablePaging true ${splitPageSize} 5 "pagingArea" true "recinfoArea" ; mygrid loadXML "${ctx} project getProjectList action userScope " + ${userScope} ajustDms "xml" ; } function ajustDms { hideSkyLoading ; ajustFrameDms ; if currpage null && currpage "" && currpage "null" { mygrid changePage currpage ; } } < script> 后台接收分页参数: int iposStart 0; String posStart this getParameter "posStart" ; 相当于request getParameter "posStart" ; if posStart null && posStart equals "" { iposStart Integer parseInt posStart ; } int splitPageSize PreferenceUtil getSplitPageSize ; 当前列表分页条数配置(pageSize) 默认15条 SplitPageInfo spi new SplitPageInfo ; spi setPageSize splitPageSize ; 设置当前页信息 int currentPage 0; currentPage iposStart splitPageSize + 1; spi setCurrentPage currentPage ; 因为这个版本已经很老了 所以在IE10或其他新浏览器中会有些变形 如果用新版本 这个分页库能不能继续使用只有自己再尝试了 希望这个对大家有用 ">1 之前上传了dhtmlx的官方demo上去 都很久了 (http: download youkuaiyun.com detail pxzsky 2946815)看大家最近有需求 希望得到实际的使用代码 因为组件很多 所以我觉得大家可能对一些核心组件还是很感兴趣的 特别是分页列表 树等 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值