在项目中需要使用批量操作的时候,后端就需要用List<实体类>进行接收数据,前台数据如下:
<form id="formId" action="/Test_a/insert" method="post">
<table id="tab">
<tr>
<td>编号</td>
<td>日期</td>
<td>姓名</td>
</tr>
<th:block th:each="test:${aList}">
<tr>
<td class="testId" th:text="${test.id}"></td>
<td><input name="createdate" class="createdate" th:value="${#dates.format(test.createdate,'yyyy-MM-dd')}"></td>
<td><input name="username" class="username" id="username" th:value="${test.username}"></td>
</tr>
</th:block>
<tr>
<td>
<input type="submit" id="add" value="添加">
</td>
</tr>
</table>
</form>
s本页面的数据是从数据库里查询出来的,然后遍历在文本框内,实际数据如下:
因为同一个文本中可能会遍历出来多值,存放的数据就如同数组一样。如果使用form表单提交的话,后台用List<实体类>接收会报:
java.lang.NoSuchMethodException: java.util.List.<init>()
意思是指定不明需要在List<实体类>前面加上@RequestBody注解,如下:
public String insert(@RequestBody List<Test_a> test_a) {}
但又会报错:报错结果是:
HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported]
报这个错的意思是:form表单提交数据默认的格式是:application/x-www-form-urlencoded;charset=UTF-8,只能处理不带嵌套类型JSON,而我们这表单提交的数据是遍历数据,也就是嵌套的,所以需要想办法把需要传递给后端的数据变成application/json这种格式,所以使用ajax。
$("#add").click(function () {
//遍历input框里的值
var username = new Array();
var i = 0;
$('.username').each(function(){
username[i] = $(this).val();
i = i+1;
});
var createdate = new Array();
var i = 0;
$('.createdate').each(function(){
createdate[i] = $(this).val();
i = i+1;
});
//把测试返回的结果放到外面,这样就不会受for循环的影响
var bol=false;
bol=alert("测试成功")
//把input框里的值循环出来,并提交
for (var i=0;i<username.length;i++) {
for (var i=0;i<createdate.length;i++) {
var aa = {username: username[i],createdate:createdate[i]};
var goodsList = new Array();
goodsList.push(aa);
var data = JSON.stringify(goodsList);
$.ajax({
type:'post',
url:'/Test_a/insert',
data:data,
contentType : 'application/json',
success:function (data) {
bol=true;
}
})
}
}
})
controller层接收
public String insert(@RequestBody List<Test_a> test_a) {
System.out.println(test_a);
}
打印结果为:
[Test_a{id=null, createdate=Thu Mar 14 08:00:00 CST 1991, username='44'}]
[Test_a{id=null, createdate=Fri Mar 14 08:00:00 CST 1997, username='44'}]
[Test_a{id=null, createdate=Sat Mar 14 08:00:00 CST 1998, username='44'}]
[Test_a{id=null, createdate=Fri Mar 14 08:00:00 CST 1997, username='44'}]
这样实体类接收就可以接收到数据了,既然接收到了,数据就然后结合mybatis的批量标签,就可以完成批量操作了。
其余方法设想
1、把这些数据全部放入缓存中,需要传递给后端的时候就只传递一组Id,后端通过id取出缓存中的数据,然后进行操作。
2、如果不使用缓存,同理,直接操作数据库,也只需要传递一组id给后端,后端批量查询出来使用即可。