叶师傅之做事的思路(考虑数据的完整性)
首先,有的时候页面需要添加多条相同类别的信息,比如说传输专业一次添加多条,这个时候的保存,删除,修改,查看,就这个时候就因为好好考虑一下,虽然有时候还是处理单一列表的状态比较多,比如一个html就一个form的情况。这个时候让我们好好想一想如何做
- 想法一:把每一个专业信息看做一个整体,传到后台进行处理;因为添加的时候一次添加多条,从页面一个一个的提交,一次用ajax提交一个json.具体看下面的代码,从html到js到servlet都有了。
//增加
function add(){
$(function() {
$("form").each(function(){//循环每一个表
var arr=$("form1").serializeArray();
var o = {};
$.each(arr, function() {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
var sons = JSON.stringify(o);
alert(sons);
$.ajax({
cache: false,
async: false,
type: "POST",
url: "/servlet/SpecTransfersNeLet?flag=add",
datatype: "json",
// data:sons,
data : {'mydata':sons},
success: function( data ) {
}
});
});
var is='';
if($("#isCopeSheet").is(":checked")) {
is=2;
}else{
is=0;
}
window.location.href="/servlet/SpecTransfersNeLet?flag=pro&sheetNo=<%=sheetNo%>&balkNo=<%=balkNo%>&is="+is;
window.opener.refsheet(<%=balkNo%>,<%=sheetNo%>);
window.close();
})
//添加专业信息
++index;
function addXinYuan(){
var row=transfers.insertRow(transfers.rows.length);
var col2=row.insertCell(0);
var idnum=transfers.rows.length+1;
col2.innerHTML="<form>"
+" <table align='center' class ='inputtable2'>"
+"<tr>"
+"<td class ='tdc'>专线</td>"
+"<td class ='tdc'><input type='text' maxlength='60' name='stlNum' value=''/></td>"
+"<td class ='tdc'>电路类型</td>"
+"<td class ='tdc'><input type='text' maxlength='60' name='type' value=''/></td>"
+"</table>"
+" </form>";
}
html部分(简化大概看个意思)
<table id="transfers" align='center' class="inputtable1">
<form>
<table align='center' class ='inputtable2'>
<tr>
<td class ="tdc">专线</td>
<td class ="tdc"><input type='text' maxlength='60' name='stlNum' value=""/></td>
<td class ="tdc">电路类型</td>
<td class ="tdc"><input type='text' maxlength='60' name='type' value=""/></td>
</table>
</form>
<form>
<table align='center' class ='inputtable2'>
<tr>
<td class ="tdc">专线</td>
<td class ="tdc"><input type='text' maxlength='60' name='stlNum' value=""/></td>
<td class ="tdc">电路类型</td>
<td class ="tdc"><input type='text' maxlength='60' name='type' value=""/></td>
</table>
</form>
<form>
<table align='center' class ='inputtable2'>
<tr>
<td class ="tdc">专线</td>
<td class ="tdc"><input type='text' maxlength='60' name='stlNum' value=""/></td>
<td class ="tdc">电路类型</td>
<td class ="tdc"><input type='text' maxlength='60' name='type' value=""/></td>
</table>
</form>
<tr>
<td align='right'>
<input type='button' name="button1" value="新增" class="button" onclick="addXinYuan();" />
</td>
</tr>
</table>
java代码 主要把json转化为javaBean就这简单几句话
String son = request.getParameter("mydata");
JSONObject jsonObject = JSONObject.fromObject(son);
System.out.println(jsonObject);
HashMap<String, Class> classMap = new HashMap<String, Class>();
classMap.put("result", SpecTransfersNe.class);//我的专业类型 这个地方就是你要转化的自己的jAVABEAN
SpecTransfersNe ne = (SpecTransfersNe) JSONObject.toBean(jsonObject, SpecTransfersNe.class, classMap);
- 想法二:一次性把数据都提交到后台,这个时候就是一个大form包含多个table的情况,然后使用request.getParameterValues()拿到数据然后循环处理。这里就不贴代码了。大家都想得到的。
- 总结这两种方法都有好处,现在我用第一种,代码特别简洁,一开始我也是图省事。可是- 叶师傅说这种方法有一个不好地方,比如一下子添加50条,提交到25的时候突然网掉线了,这个时候剩下的25条就没了,数据不完整。最好还是统一提后面处理,这个时候即使掉线也没关系,事务也不会提交。