本示例入口html页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>用户数据编辑 用ArrayReader 实现分页</title> <meta http-equiv="Content-Type" content="text/html; charset=gbk" /> <meta http-equiv="author" content="hoojo"> <meta http-equiv="email" content="hoojo_@126.com"> <meta http-equiv="blog" content="http://blog.csdn.net/IBM_hoojo"> <link rel="stylesheet" type="text/css" href="../ext2/resources/css/ext-all.css"></link> <script type="text/javascript" src="../ext2/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="../ext2/ext-all.js"></script> <script type="text/javascript" src="../ext2/build/locale/ext-lang-zh_CN-min.js"></script> <!-- 用ArrayReader 实现分页,需要改进ArrayReader 的代码 --> <script type="text/javascript" src="ArrayReader.js"></script> <script type="text/javascript" src="ArrayPagingEditorGridPanel.js"></script> <script type="text/javascript"> Ext.onReady(function (){ Ext.QuickTips.init(); //Ext.form.Field.prototype.msgTarget = "side"; Ext.BLANK_IMAGE_URL = "../ext2/resources/images/default/s.gif"; new ArrayPagingEditorGridPanel(); }); </script> </head> <body> </body> </html>

ArrayPagingEditorGridPanel.js文件代码:

/** * 用Array格式的数据形式:Ext.data.Store,自定义Ext.data.ArrayReader数组解析器,实现editorGrid的增删改查 * author: hoojo * email: hoojo_@126.com * blog: http://blog.csdn.net/IBM_hoojo * ext-lib: v2.2 */ /****************************************************************/ /*******ArrayPagingEditorGridPanel*******/ /****************************************************************/ ArrayPagingEditorGridPanel = Ext.extend(Ext.grid.EditorGridPanel, { sexCombo: null, inserted: [], constructor: function () { this.sexCombo = new Ext.form.ComboBox({ mode: "local", value: "全部", readOnly: true, triggerAction: "all", displayField: "sex", //listAlign : "bl-tl", //下拉列表的显示方式 bl-tl是在上方显示,相反tl-bl是从下方显示 store: new Ext.data.SimpleStore({ data: ["男", "女", "全部"], expandData: true, fields: ["sex"] }), listeners: { "select": { fn: this.filterSex, scope: this } } }); this["store"] = new Ext.data.Store({ url: ArrayPagingEditorGridPanel.USER_STORE_URL, reader: new Ext.data.ArrayReader({ id: "id", //维护当前数据的唯一性(和数据库主键类似,避免数据重复--过滤重复数据) root: "users", totalProperty: "totals" }, Ext.data.Record.create(["id","name", {name: "age", type: "int"}, "sex", {name: "birthday", type: "date", dateFormat: "Y-m-d"} ]) ), sortInfo:{field:"name", direction:"ASC"} //排序 }); ArrayPagingEditorGridPanel.superclass.constructor.call(this, { renderTo: Ext.getBody(), width: 480, height: 300, frame: true, stripeRows: true, clicksToEdit: 2, //表示点击多少次数才可以编辑表格 collapsible: true, //是否在右上角显示收缩按钮 animCollapse: true, //表示收缩(闭合)面板时,显示动画效果 trackMouseOver: true, //鼠标在行上移动时显示高亮 enableColumnMove: false,//禁止用户拖动表头 autoExpandColumn: "name", //这里指定的name的id ,此属性可以根据当前列 填充空白区域 title: "用户数据编辑器", tbar: [ "查看方式:", this.sexCombo, "-", { text: "保存数据", handler: this.onCommitStore, scope: this } ], bbar: [{ text: "添加数据", handler: this.onAddClick, scope: this },"-",{ text: "删除数据", handler: this.onRemoveClick, scope: this },new Ext.PagingToolbar({ pageSize: 5, store: this.store })], columns:[{ id: "name", header: "姓名", align: "center", dataIndex: "name", editor: new Ext.form.TextField({ allowBlank: false, blankText: "姓名不能为空,必须输入" }) },{ header: "年龄", align: "center", dataIndex: "age", editor: new Ext.form.NumberField({ allowBlank: false, allowNegative: false, //只能为正数 //maxValue: 1000000000, grow: true, //前半部分显示正在改的数据,后半部分显示以前的老数据 selectOnFocus: true, //当获得焦点时,选中所有的文本内容 minValue: 1 }) },{ header: "性别", align: "center", dataIndex: "sex", editor: new Ext.form.ComboBox({ mode: "local", value: "男", readOnly: true, displayField: "sex", triggerAction: "all", store: new Ext.data.SimpleStore({ data: ["男", "女"], expandData: true, fields: ["sex"] }) }) },{ header: "生日", align: "center", sortable: true, dataIndex: "birthday", renderer: Ext.util.Format.dateRenderer('Y-m-d'), editor: new Ext.form.DateField({ format: "Y-m-d", minValue: "1950-01-01", disabledDays: [0, 7],//datefield的第0列:周日和第7列:周六不能编辑 disabledDaysText: "周末不能选择" }) }], sm: new Ext.grid.RowSelectionModel({ singleSelect: true }) }); this.store.load({params: {start: 0, limit: 5}}); /*Ext.Ajax.on("requestcomplete", function (conn, response, options) { alert(response.responseText); });*/ }, filterSex: function (cob) { if (cob.getValue() == "全部"){ this.store.clearFilter(); } else this.store.filter("sex", cob.value); }, onAddClick: function () { var rs = new Ext.data.Record({id: "",name: "", age: 1, sex: "", birthday: 0000-00-00}); this.getStore().add(rs); rs.set("name", "ext"); rs.set("age", 22); rs.set("sex", "男"); rs.set("birthday", new Date()); this.inserted.push(rs); this.startEditing(this.store.getCount() - 1, 0); }, saveInsertData: function (conn, response) { var xml = response.responseXML; var root = xml.documentElement; for (var i = 0; i < root.childNodes.length; i++) { this.inserted[i].set("id", root.childNodes[i].text); } this.getStore().commitChanges(); this.inserted = []; }, onCommitStore: function () { var mf = this.getStore().modified; var temp = []; for (var i = 0; i < mf.length; i ++) { if (mf[i].get("id") == ""){ continue; } var data = {}; for (var j in mf[i].modified) { data[j] = mf[i].get(j); } temp.push(Ext.apply(data, {id: mf[i].get("id")})); } for (var i = 0; i < this.inserted.length; i ++) { temp.push(this.inserted[i].data); } Ext.Ajax.on("requestcomplete", function (conn, response, options) { alert(response.responseText); }); //Ext.Ajax.on("requestcomplete", this.saveInsertData, this); //想服务器发送请求,传递修改的数据(只含修改的数据) Ext.Ajax.request({url: "../ServiceServlet?method=edit", params: {content:Ext.util.JSON.encode(temp)}}); this.store.commitChanges(); this.filterSex(this.sexCombo); }, onRemoveClick: function () { var rs = this.getSelectionModel(); try{ if (rs.getCount() == 0) { Ext.Msg.alert("系统提示", "没有选定数据,请选择数据行!"); }else { Ext.Msg.confirm("系统提示", "您确定要删除当前数据吗?", this.removeUserInfo, this); } }catch(er) { Ext.Msg.alert("系统提示", er.discription); } }, removeUserInfo: function (btnText) { if (btnText == "yes"){ var rs = this.getSelectionModel().getSelected(); this.getStore().remove(rs); if (rs.get("id") != "") { Ext.Ajax.on("requestcomplete", function (conn, response, options) { if (response.responseText == "success") { alert("success"); }else { alert("failure"); } }); Ext.Ajax.request({url: "../ServiceServlet?method=remove", params: {id:rs.get("id")}}); }else { this.inserted.remove(rs); //this.getStore().modified.romove(rs); } } } }); ArrayPagingEditorGridPanel.USER_STORE_URL = "http://localhost:8080/Demo3/ServiceServlet?method=arry";

后台java servlet交互代码:

import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.hoo.dao.IUser; import com.hoo.dao.impl.UserDao; import com.hoo.entity.UserInfo; @SuppressWarnings({"unchecked", "serial"}) public class ServiceServlet extends HttpServlet { private IUser dao = new UserDao(); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("GBK"); PrintWriter out = response.getWriter(); StringBuilder builder = new StringBuilder(); String method = request.getParameter("method"); if ("arry".equals(method)) { int start = Integer.parseInt(request.getParameter("start")); int limit = Integer.parseInt(request.getParameter("limit")); Object[] obj = dao.loadUserInfo(start, limit); List<UserInfo> list = (List<UserInfo>) obj[1]; builder.append("{totals:").append(obj[0]).append(",users:["); for (int i = 0; i < list.size(); i++) { UserInfo u = (UserInfo) list.get(i); builder.append("[/"").append(u.getId()) .append("/",/"").append(u.getName()) .append("/",").append(u.getAge()) .append(",/"").append(u.getSex()) .append("/",/"").append(u.getBirthday()) .append("/"]"); if (i < list.size()-1) { builder.append(","); } } builder.append("]}"); out.write(builder.toString()); } if ("edit".equals(method)) { String content = request.getParameter("content"); out.print(content); } if ("remove".equals(method)) { Integer id = Integer.parseInt(request.getParameter("id")); if (dao.removeUserInfo(id)) { out.print("success"); }else { out.print("failure"); } } out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }

本示例用ArrayReader解析数组数据分页,需要扩展原有的ArrayReader.js文件,下面是扩展文件:

Ext.data.ArrayReader = Ext.extend(Ext.data.JsonReader, { readRecords : function(o){ var sid = this.meta ? this.meta.id : null; var recordType = this.recordType, fields = recordType.prototype.fields; var records = []; var root = this.meta ? this.meta["root"] ? o[this.meta["root"]] : o : o; for(var i = 0; i < root.length; i++){ var n = root[i]; var values = {}; var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null); for(var j = 0, jlen = fields.length; j < jlen; j++){ var f = fields.items[j]; var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j; var v = n[k] !== undefined ? n[k] : f.defaultValue; v = f.convert(v, n); values[f.name] = v; } var record = new recordType(values, id); record.json = n; records[records.length] = record; } return { records : records, totalRecords : this.meta ? this.meta["totalProperty"] ? o[this.meta["totalProperty"]] : records.length : records.length }; } });

本示例最大的不同就是采用数据传递形式不同,用到的是Array格式。但ext v2.2版本中的ArrayReader结合Ext.data.Store

不支持分页,所以本示例进行扩展ArrayReader文件。

ExtJS EditorGridPanel 示例之Array格式(自定义Array解析器)Store前后台增删改查相关推荐

  1. ExtJS EditorGridPanel 示例之Array格式Store前后台增删改查(不支持分页)

    示例入口页面html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  2. ExtJS EditorGridPanel 示例之xml格式Store前后台增删改查

    程序入口html页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  3. php xml 增删改查,PHP实现对xml进行简单的增删改查(CRUD)操作示例

    本文实例讲述了PHP实现对xml进行简单的增删改查(CRUD)操作.分享给大家供大家参考,具体如下: 假如有下面xml文件: 55.8 56 40 339 如何使用php对它进行CRUD?其实像这种简 ...

  4. Solr的安装步骤及增删改查代码示例

    一.solr的下载 http://lucene.apache.org/solr/ 解压到合适的位置,以4.10.3为例.solr是一个服务,里面有solr项目war包. 二.找到solr的war包 s ...

  5. springMvc(实现HandlerMethodArgumentResolver)自定义参数解析器

    由于之前用@RequestParam无法接收request payload 正文格式为json格式的字符串,只能使用@RequestBody整个接收,觉得麻烦,但是spring自带的参数解析器不具有这 ...

  6. springmvc自定义参数解析器

    由于开发中一般使用参数提交方式是json格式,对于单个参数的传递使用无法接收只能自定义参数解析器处理 springmvc的自定义参数解析器实现HandlerMethodArgumentResolver ...

  7. Entity Framework使用DBContext实现增删改查示例

    这篇文章介绍了Entity Framework使用DBContext实现增删改查的方法,文中通过示例代码介绍的非常详细.对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 有一段时间没有更 ...

  8. 白鹭egret的自定义素材解析器

    下午好 大家在接触白鹭的过程中,一定会遇到资源加载的问题. 首先坦白最近遇到的瓶颈: 之前的项目虽然资源很多,但是资源相对比较固定,两个版本中更改的图库数据较少,所以在使用中可以使用打包图集和资源缓存 ...

  9. 数据库授予用户增删改查的权限的语句_mysql创建本地用户及赋予数据库权限的方法示例...

    前言 大家在安装 mysql 时通常会生成一个超级用户 root,很多人之后就一直沿用这一个用户,虽然这会很方便,但超级用户权限太大,在所有地方使用它通常是一个安全隐患. 这一点跟操作系统的用户管理也 ...

最新文章

  1. python培训出来的有公司要吗-python培训机构出来好就业吗
  2. 视频“双录”全新发布,助力金融业务办理高效合规
  3. AutoCAD VBA基于对象的分层
  4. mysql select 效能_MYSQL的联合查询最好是少用,效能差异巨大
  5. Linux C代码实现主函数参数选项解析
  6. 已安装过matplotlib但提示ModuleNotFoundError: No module named ‘matplotlib‘的解决方法
  7. IT人才需要怎样的沟通表达能力
  8. Linux 内核 3.8 是给 Linux 用户的圣诞礼物
  9. c语言如何注释一段代码,如何在C语言注释一段代码?【C++培训】
  10. C#事件和委托的区别
  11. 程序员的工作总结(2017-12-04)
  12. 趣味小问题2——规律型勾股数
  13. Android Espresso(一)——环境建立
  14. NppFTP-Disconnected
  15. mac添加Chrome插件的方法
  16. 不一样的视角,不一样的VR
  17. 化工厂人员定位的实施,新导化工厂人员定位带来的效果
  18. 【目标跟踪】基于matlab GUI帧差法结合卡尔曼滤波行人姿态识别【含Matlab源码 1127期】
  19. 长沙医学院计算机科学与技术专业怎么样,长沙医学院有哪些专业及什么专业好...
  20. 软件设计师2014上午题基础知识(易错整理)

热门文章

  1. 典型集与Shannon信源编码理论
  2. Numpy API 速查表
  3. 并发编程之二:线程创建方法、运行原理、常见方法(sleep,join,interrupt,park,守护线程等)
  4. python话费充值_用Python方法查询移动手机余额话费的源码示例
  5. Linux高并发服务器开发---笔记2(多进程)
  6. 1KB到底有多大?(为什么买回来的硬盘总比标称容量小)
  7. 全国22家奶粉企业69批次产品检出三聚氰胺
  8. 火焰检测 python
  9. 收藏的JAVA面试题大全
  10. 1.VB_求解圆的体积