这篇博客是分享给你们使用easyUI 框架从界面向后台传值的两种方法。使用easyui 已经有一段时间,没有很深刻的学习过,只是停留在能够简单使用的层面上,此次因为项目须要,前台界面的需求比较多,因此对easyui的使用,在这段时间,从量上,使用的深度上有了一个大的跨越,特别是datagrid 。而后回顾之前使用的一些经验,整理了这篇博客。javascript
先看效果图:我须要将表格中数据如红色框中的数据,统一编辑修改以后,一块儿保存。html
这里有两种方法,我们先来看第一种:java
1、——使用getChangesjquery
可使用easyui 提供的便捷的方法getchanges();ajax
getChanges:从上一次的提交获取改变的全部行。类型参数指明用哪些类型改变的行,可使用的值有:inserted,deleted,updated等。当类型参数未配置的时候返回全部改变的行。咱们来看看具体是如何使用的。json
function save(){ if ($('#dg').datagrid('getChanges').length) { var inserted = $('#dg').datagrid('getChanges', inserted); var updated = $('#dg').datagrid('getChanges', updated);
html" name="code"> var deleted = $('#dg').datagrid('getChanges', deleted);
// 统一放到一个json中传递 var effectRow = new Object(); if (inserted.length) { effectRow[inserted] = JSON.stringify(inserted); } if (updated.length) { effectRow[updated] = JSON.stringify(updated); }数组
if (deleted.length) { effectRow[deleted] = JSON.stringify(deleted); }
// $.post jquery中简单的异步提交,若是须要错误处理,需使用$.ajax.
$.post(getRootPath()+/labour/update.do, effectRow, function(data) { if(data.success){ $('#dg').datagrid('acceptChanges');app
$('#dg').datagrid('reload');
} }, JSON).error(function() { alert('error'); }); }; }框架
后台的接收: 从后台接收到对应的json ,能够作对应的增,删,改操做。异步
import net.sf.json.JSONArray; import net.sf.json.JSONObject;
@RequestMapping(/update.do)@ResponseBodypublic Object save(HttpServletRequest request) {//获取编辑数据 这里获取到的是json字符串String inserted = request.getParameter(inserted);String updated = request.getParameter(updated);ListlistUpdated = new ArrayList();List listInserted = new ArrayList();if(inserted != null){//把json字符串转换成对象JSONArray jsonArr = JSONArray.fromObject(inserted); for (int i = 0; i < jsonArr.size(); i++) { listInserted.add((JobContentDetail)JSONObject.toBean(jsonArr.getJSONObject(i), JobContentDetail.class)); } try {labourservice.saveEntities(listInserted);} catch (Exception e) {e.printStackTrace();return createErrorMessage(e.getMessage()).toString();}}if(updated != null){ //把json字符串转换成对象JSONArray jsonArr = JSONArray.fromObject(updated); for (int i = 0; i < jsonArr.size(); i++) { listUpdated.add((JobContentDetail)JSONObject.toBean(jsonArr.getJSONObject(i), JobContentDetail.class)); } try {labourservice.saveEntities(listUpdated);} catch (Exception e) {e.printStackTrace();return createErrorMessage(e.getMessage()).toString();}}return createSuccessMessage(操做成功!).toString();}
第一种方法当然好,可是发现有一个问题就是,假如,我在datagrid中使用了“updaterow”方法,那么,easyui的getchanges方法,是拿不到这些updateRow 改变的数据,以下所示:
function rowsave() { var drow = snl.datagrid('getSelected'); var index = snl.datagrid('getRowIndex', drow); snl.datagrid('updateRow', { index: index, row: { SeriesNumber: 电话号码, SeriesName: 姓名 } }); });
保存数据的时候能正常保存到表单里面去,可是用:var
rows =snl.datagrid(
'getChanges'
); 读取数据,读取到的rows为0
那么怎么办,如何拿到表格中既有删除,又有添加,还有被“updateRow”更新的数据呢?
当咱们使用了updaterow来更新了datagrid中的数据时,怎么获取到数据,这里咱们不能使用便捷的getchanges ,只能绕一个道了,咱们选择一个万无一失的方法,就是经过easyui的getRows来拿到datagrid中全部的数据行。
二、第二种———getRows
解决方案就是拿到datagrid中全部的数据,json的形式传递。
如何取得datagrid的行数:getRows, 转换成json :JSON.stringify(***);
//save all the dada from easyuiDatagrid function updateDatagrid(num) { var rows = $('#dg').datagrid('getRows'); var entities = ;
// 循环 datagrid 中现有的数据,而且逐行复制给Entities ,而且转换成json格式
// 在后台反序列话成对象的对象集合。 for(i = 0;i < rows.length;i++) { entities = entities + JSON.stringify(rows[i]); } $.ajax({ url: getRootPath()+'/labour/update.do', type: post, async: true, dataType: 'json', data: {'entities': entities} success: function (data) { if(data.message==操做成功!){ alert(data.message); }else{ alert(data.message); return; } $('#dg').datagrid('reload'); } }); }
后台的接收: 这里使用的解析json的工具是 net.sf.json。主要使用的是jsonarray 和jsonobject ,从字面上就能够看出:一个是负责数据/集合的,一个是负责单个对象的。这里咱们要解析的是数组,因此使用的是jonsarray中的tocollection 方法,jsonarray还有不少其余方法,有兴趣的能够看看。
具体的代码以下:
import net.sf.json.JSONArray; import net.sf.json.JSONObject;
@Override@RequestMapping(update.do)
public String update(HttpServletRequest request) { //一、 get the detail data String ens = request.getParameter(entities); // 二、format the string ens = ens.replace(}{, },{); ens = [ + ens.toString() + ];
// 3. transform to the object list JSONArray array =JSONArray.fromObject(ens.toString()); @SuppressWarnings(unchecked) List listDetail=(List)JSONArray.toCollection(array, JobContentDetail.class); try { labourservice.saveData(listDetail); } catch (Exception e) { e.printStackTrace(); return createErrorMessage(操做失败!).toString(); } return createSuccessMessage(操做成功!).toString(); }
3、使用心得
一边编辑,一边保存也好;先编辑,后批量保存也好,他们的解决方案都是同样的,由于easyui的datagrid (固然还有combobox)的接收数据类型是json ,因此,咱们只要能够拿到前台显示的json数据,全部的东西就好解决了,从前台向后台传递,只要URL给对了,那么一切就顺利成章了。