相信一般的Spring MVC前后端数据传输与解析,大家都有一定的经验了,这里主要说一个特殊场景。
后台拿不到前端请求的数组的一种情况。
一般场景
我在前端构建了一个数组(以”str[]”为例),作为ajax请求参数到后台。
一般而言,我们在F12中可以看到这个请求,并且之前的请求参数(str[])应该可以折叠展开,观察到它的
每一个下标以及对应的值。
(这里只是找到一个类似的数据例子,大家把list
命名看成contact
,以及里面的成员变量为name
、address
、isUsual
)
如上图,一般情况如上所示,而我们在后台java bean会有一个String[] str
或者List<String> strList
成员变量。
(这里还是以上面contact为例)
经过上面前端构造请求,到后台Spring解析绑定参数,拿到这个list数组,然后我们就可以进行后续的业务逻辑编写了。
特殊场景
有的时候在前端我们不一定是拿已有的数组作为参数,我们需要自己构造一些特定的数组给后台。
var contact = []; //我们建议用中括号[]构造数组,而不是new Array(),具体原由大家可以自行百度,这里不再赘述。
这样构造得到一个数组后,作为参数传递到后台,此时请求参数是什么样子呢?让我们F12看一看。
(这里偷懒成员变量只构造1个数值了: P)
我们可以看到此时的数组参数,后面带有一个[]
,然后并没有我们想象中的下标0,例如我们可能希望它应该是contact[0]:1
这样的。
而出现上述场景后,后台使用List<String> strList
成员变量时,将会拿不到数组而报空指针异常Nullpointexception
;
如过使用String[] str
成员变量,则会报NumberFormatException
,如下图:
显然,我们可以看到Spring在解析绑定这个数组数据时,拿不到数组下标,也就无法遍历获取数据值进行参数绑定了。
场景已重现,下面是解决方案,依然视场景而定:
1、 form表单请求,手动拼接数组
<form>
<input name="contact[0].name" value="1">
<input name="contact[1].name" value="2">
</form>
这样拼接而成的数据,如上面一般场景中提到的格式类似,后台可以正常解析。
2、Ajax Json格式传输参数
如果使用ajax请求构造参数,那么使用JSON.stringify(data)
对参数进行Json格式化,则请求参数变为下图的样子:
这里JSON.stringify(data)
对数组格式化重新封装时自动分配了下标,所以此时的数据来到后台,我们就可以正常解析绑定了。