`
yiyu
  • 浏览: 187102 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

YUI DataTable 服务器端翻页与排序

    博客分类:
  • java
阅读更多
这两天试用了一下YUI的DataTable,翻页和排序都在后台实现,数据以JSON格式传输,现在总结一下。

简单地讲,主要有以下几点:
1)在DataTable的config中指定dynamicData=true,DataTable的翻页、排序就会自动通过DataSource获得。

2)DataSource默认发送的request参数格式如下:
sort={SortColumnKey}&dir={SortColumnDir}&startIndex={PaginationStartIndex}&results={PaginationRowsPerPage}
如果需要增加其他参数,就需要指定generateRequest为一个自己定义的函数,在这个函数中自己拼request参数。generateRequest的第一个参数是这样的:

pagination
  offsetRecord:数字,当前页第一记录数
  rowsPerPage:数字,每页记录数
sortedBy
  key:String,排序列的Key
  dir:String,排序方向,为YAHOO.widget.DataTable.CLASS_ASC 或者 YAHOO.widget.DataTable.CLASS_DESC
 
3)前端要动态修改总记录数,方法是定义DataTable的handleDataReturnPayload

4)后台根据前台的参数获取当前页的列表,另外还要有总记录数。

以下是部分代码,关于前后之间JSON数据传输的问题参见我另一篇文章《YUI + struts2实现基于JSON通讯的AJAX例子》。

这里是画面【查询】按钮的处理函数,要多发一个姓名作为查询参数:
	function searchButton_click() {

		var searchName = document.getElementById("name").value;
		
		var convertSex = function(sData) {
			if (sData == '0') {
				return '女';
			} else {
				return '男';
			}
		};
		
		//定义DataSource
		//其中responseSchema中要定义一个总记录数(totalRecords)的数据项
		var myDataSource = new YAHOO.util.DataSource("SearchPersonAction.action?");   //注意action后的?
		myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
		myDataSource.responseSchema = {
			resultsList :"returnObj.personList",
			fields : [ "name", {key:"sex", parser:convertSex}, "birthday", "company", "phone" ],
			metaFields: {totalRecords: "returnObj.totalRecords" }   
		};

		//定义表格的列
		var myColumnDefs = [ {
			key :"name",
			label :"姓名",
			width :100,
			sortable :true
		}, {
			key :"sex",
			label :"性别",
			width :50,
			sortable :true
		}, {
			key :"birthday",
			label :"出生日期",
			width :100,
			sortable :true
		}, {
			key :"company",
			label :"单位",
			width :200,
			sortable :true
		}, {
			key :"phone",
			label :"电话",
			width :100,
			sortable :true
		} ];

		//自定义的request参数构造函数,增加了一个姓名的参数
		var requestBuilder = function(oState, oSelf) {
		    var sort = oState.sortedBy.key;   
		    var dir = oState.sortedBy.dir;   
		    var startIndex = oState.pagination.recordOffset;   
		    var results = oState.pagination.rowsPerPage;   
		    var personName = searchName;
		    
		    var reqStr = "sort=" + sort +
		            "&dir=" + dir +
		            "&startIndex=" + startIndex +
		            "&results=" + results +
		            "&name=" + encodeURI(personName);

            return reqStr;
		};

		//配置DataTable
		//dynamicData指定为true,动态获取数据
		//指定generateRequest为我们自己的函数
		//由于initialRequest指定对姓名排序,所以sortedBy要配置成与其一致
		var myConfigs = {
			paginator :new YAHOO.widget.Paginator( {
				rowsPerPage :5,
				firstPageLinkLabel : "第一页", 
	            lastPageLinkLabel : "尾页", 
	            previousPageLinkLabel:"上一页",
	            nextPageLinkLabel:"下一页"
			}),
			sortedBy :{key:"name",dir:YAHOO.widget.DataTable.CLASS_ASC},
			dynamicData :true,
			initialRequest: "sort=name&dir=" + YAHOO.widget.DataTable.CLASS_ASC + "&startIndex=0&results=5&name="+encodeURI(searchName),
			generateRequest : requestBuilder
		};

		var myDataTable = new YAHOO.widget.DataTable("resultContainer",
				myColumnDefs, myDataSource, myConfigs);
		
		//动态更新总记录数
	    myDataTable.handleDataReturnPayload = function(oRequest, oResponse, oPayload) {   
	   		oPayload.totalRecords = oResponse.meta.totalRecords;   
	    	return oPayload;   
		}  

	}


这里是前后台传递的JSON数据的格式,在这个例子里只有returnObj是我们关心的,关于returnObj的组成见下面的代码。

public class JSONResult {
	public static final int RETCODE_OK = 0;
	public static final int RETCODE_ERR = -1;
	
	private int returnCode;
	private Object returnObj;
	private String errMessage;

	public JSONResult() {
		this.returnCode = RETCODE_OK;
	}
	
	public JSONResult(Object returnObj) {
		this.returnCode = RETCODE_OK;
		this.returnObj = returnObj;
	}
	
	public JSONResult(String errMessage) {
		this.returnCode = RETCODE_ERR;
		this.errMessage = errMessage;
	}
	
	public void setReturnCode(int returnCode) {
		this.returnCode = returnCode;
	}

	public int getReturnCode() {
		return returnCode;
	}
	
	public void setReturnObj(Object returnObj) {
		this.returnObj = returnObj;
	}

	public Object getReturnObj() {
		return returnObj;
	}

	public void setErrMessage(String errMessage) {
		this.errMessage = errMessage;
	}

	public String getErrMessage() {
		return errMessage;
	}
}


这里是前后台传递的JSON数据中的returnObj部分,上面代码中DataSource的responseSchema是根据它定义的:

public class PersonSearchList {
	private int totalRecords;
	private List<PersonVO> personList;
	
	public void setTotalRecords(int totoalRecords) {
		this.totalRecords = totoalRecords;
	}
	public int getTotalRecords() {
		return totalRecords;
	}
	public void setPersonList(List<PersonVO> personList) {
		this.personList = personList;
	}
	public List<PersonVO> getPersonList() {
		return personList;
	}
}


这里是后台的检索处理:

	public String search() {
	
		//获取request参数
		ActionContext context = ActionContext.getContext(); 
		Map parameters = context.getParameters();
		String[] paramName = (String[])parameters.get("name");
		String[] paramSort = (String[])parameters.get("sort");
		String[] paramDir = (String[])parameters.get("dir");
		String[] paramStartIdx = (String[])parameters.get("startIndex");
		String[] paramResults = (String[])parameters.get("results");
		
		JSONResult ret;
		try {
			PersonSearchList searchList = new PersonSearchList();
			
			int firstResult = Integer.parseInt(paramStartIdx[0]);
			int maxResult = Integer.parseInt(paramResults[0]);

			//检索总记录数
			int count = personService.countByName(paramName[0]);
			searchList.setTotalRecords(count);
			
			//检索当前页记录数
			List<PersonVO> personList = personService.getByName(paramName[0], paramSort[0], paramDir[0], firstResult, maxResult);
			searchList.setPersonList(personList);
			
			//生成返回前台的数据
			ret = new JSONResult(searchList);
		} catch (BusinessException e) {
			ret = new JSONResult(e.getMessage());
			logger.error(e.getMessage());
		}

		//将返回前台的数据转成JSON串
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor());
		JSONObject jsonRet = JSONObject.fromObject(ret, jsonConfig);
		String strRet = jsonRet.toString();
		
		//输出JSON串
		try {
			setInputStream(new ByteArrayInputStream(strRet.getBytes("utf-8")));
		} catch (UnsupportedEncodingException e) {
			logger.error(e.getMessage(), e);
		}
		
		return SUCCESS;
	}


最后来一张UI图,只是个例子,不怎么好看


  • 大小: 33.1 KB
分享到:
评论
5 楼 雪狐狼 2015-04-07  
为何,每次查询需要 构建datatable?
4 楼 jkfzero 2009-08-11  
ls的杀毒软件是用的瑞星之类的么?换成诺顿试试。
3 楼 takezo 2009-04-21  
楼主试过YUI Datatable的row selection吗?我在IE7和IE8下都出了问题,不能选中行,也没有鼠标hover时的高亮效果,IE6和其他所有浏览器都可以正常选择。这几天都崩溃中。
2 楼 yiyu 2009-03-18  
inputStream是一个属性,setInputStream是这个属性的setter函数
1 楼 tommas2006 2009-03-10  
能附上你完整的例子吗? 那个setInputStream 是在Action中的一个属性吗?

相关推荐

    YUI2.8 实现datatable从server端动态获取数据,并实现分页功能(下)

    在本教程中,我们将深入探讨如何使用Yahoo User Interface (YUI) 2.8 版本来实现一个从服务器端动态获取数据并具备分页功能的DataTable。YUI 是一个强大的JavaScript库,提供了丰富的组件和工具,用于创建交互式和...

    JavaScript YUI 2.8: DataTable jquery form 异步请求显示数据分页

    首先,YUI 2.8 中的 DataTable 是一个非常灵活的组件,它可以动态地加载和显示大量数据,并提供了排序、过滤和分页等高级功能。在创建 DataTable 时,我们需要定义数据源、列配置和样式等属性。例如: ```...

    yui 资源包

    3. **表格与表单**:DataTable和Form模块提供表格和表单的高级处理,包括排序、过滤、验证等功能。 4. **布局与容器**:Panel、Overlay、Dialog等组件提供了丰富的布局和对话框解决方案。 5. **数据管理**:Model、...

    YUI.rar_html_javascript YUI_yui_yui javascript

    5. **数据表格**:YUI的DataTable组件可用于展示和操作大量数据,支持排序、过滤和分页等功能。 通过学习和实践这些示例,开发者可以深入了解YUI的功能和用法,提高自己的前端开发技能。 总结来说,YUI是一个强大...

    yui_3.8.1.zip

    4. **数据管理**:YUI提供了Model、ModelList和Store等组件,用于数据的存储、管理和同步,与服务器进行数据交换。 5. **动画效果**:内置的Anim模块支持丰富的动画效果,包括CSS属性的平滑过渡、定时器控制等,使...

    yui3-master.zip

    《深入理解YUI3:基于yui3-master.zip的探讨》 YUI(Yahoo! User Interface Library)是由雅虎公司开发的一套开源JavaScript库,它为Web开发者提供了丰富的功能和工具,以创建交互性强、性能优秀的网页应用。YUI3是...

    YUI2 库与例子都有了

    7. **IO(Input/Output)**:YUI2的IO模块支持异步数据请求,包括AJAX、JSONP、以及文件上传,帮助开发者与服务器进行数据交换。 8. **拖放(Drag & Drop)**:YUI2的拖放功能使得用户可以轻松实现元素的拖放操作,...

    YUI-ajax框架开发文档

    - `YAHOO.widget.DataSource`可以连接到不同的数据源,如服务器端接口、本地数组、甚至其他JavaScript对象。开发者可以通过定义返回的数据格式和处理函数来定制数据源。 - `DataSource.getRecords`: 获取数据源中...

    YUI3.6文档及示例

    7. **IO与Ajax**:提供了强大的网络通信功能,如XMLHttpRequest、JSONP、跨域请求等,方便与服务器进行数据交换。 8. **动画框架**:基于RequestAnimationFrame的高性能动画系统,支持多种动画效果和自定义动画。 ...

    YUI 详细说明文档

    ### YUI 详细说明文档 #### 一、YAHOO工具库 YUI是一个由Yahoo!开发的强大且灵活的开源JavaScript框架,它包含了丰富的库和工具集,旨在帮助开发者更轻松地构建高质量的Web应用程序。YAHOO工具库是YUI的核心组成...

    yui.rar 例子

    《深入理解YUI:基于“yui.rar 例子”的解析》 YUI,全称Yahoo! User Interface Library,是雅虎公司推出的一款开源JavaScript库,旨在帮助开发者构建高性能、易于维护的网页应用。本篇文章将结合“yui.rar 例子”...

    yuicompressor-yui compressor

    yuicompressor-2.4.2.jar yuicompressor-2.4.7.jar jsZip.exe yuicompressor yui compressor js压缩工具 javascript压缩工具 css压缩工具 ------------------------------------ //压缩JS java -jar yui...

    YUI-EXT使用详解

    5. **Ajax交互(Ajax Interactions)**:YUI-EXT集成了YUI的Ajax功能,允许在不刷新页面的情况下与服务器进行异步通信。这使得用户界面能够实时更新,提高了用户体验。 6. **工具提示(Tooltips)**:YUI-EXT还提供...

    Yahoo YUI 插件库

    9. **异步请求和Ajax**:YUI的IO组件处理Ajax请求,提供了一种简便的方式与服务器进行异步数据交换。 10. **国际化和本地化**:YUI的I18n模块支持多语言环境,帮助开发者构建全球化应用。 文件名“FTBBS_...

    YAHOO yui2.7 文档+ 代码+例子

    - **Ajax通信**:YUI的Ajax组件支持异步与服务器进行数据交换,实现无刷新页面更新。 **2. YUI的可扩展性** YUI的设计非常注重模块化和可扩展性,开发者可以通过编写新的模块来扩展其功能。YUI的模块化结构使得代码...

    YUI JS CSS 打包工具

    总结来说,YUI JS CSS 打包工具是Web开发者优化前端资源的利器,通过压缩和合并JS与CSS文件,有效提升网页加载速度,降低服务器带宽需求。该工具提供的不同版本、批处理脚本和详细文档,使得用户能够根据自身需求...

    YUI version 2.5.2 (最新版)

    3. **Ajax**:YUI提供了异步数据通信的功能,包括XMLHttpRequest对象的封装和JSONP支持,方便进行服务器端数据的获取和更新。 4. **动画效果**:通过简单调用,开发者可以创建复杂的动画效果,包括平滑的过渡、淡入...

    【YUI组件】基于YUI的表单验证器

    8. **使用示例**:通过实例学习如何在实际项目中引入和配置YUI表单验证器,以及如何与后端验证配合。 这些知识点涵盖了使用YUI表单验证器的基础和进阶内容,对于开发者来说,理解并掌握这些将有助于在实际开发中...

    yui_2.6.0r2

    3. Connection Manager:此组件用于处理Ajax请求,提供了异步与服务器通信的能力,支持GET、POST等多种HTTP方法,同时具有错误处理和状态监控功能。 4. Animation:动画模块是YUI的一大亮点,它允许开发者轻松创建...

    yui_2.9.0前端UI

    YUI 库,全称Yahoo! UI Library。是一组工具和控件,用JavaScript写成, 为的是用DOM 脚本,DHTML和AJAX等技术创建丰富的网页交互式应用程序。 YUI 基于BSD协议,对所有的使用方式都是免费的。YUI 项目包括YUI 库和两...

Global site tag (gtag.js) - Google Analytics