用SpringMVC从页面获取多个name值相同的input值

前几天遇到了这个问题,我以为在controller的参数列表中用 list 接收就可以实现,但是报了这个错误:

Failed to instantiate [java.util.List]: Specified class is an interface

因为SpringMVC在封装参数的时候,要实例化你提供的参数类型,List是接口,不能直接实例化,会报"BeanInstantiationException"  bean实例化异常。

需要从controller获取页面提交的多个User对象,下面是User类,有id和name两个属性

有些get、set没截全

要解决这个问题有两种方案:

1、自己封装。在后台用数组类型接收。例如在参数中用 int[ ] id , String[ ] name  去接收,你会得到数组形式的参数,然后自己封装成User。或者直接用 int id ,String name 接收,你得到的是用逗号拼接的参数。这种方式都不能该直接得到User对象,特别麻烦。(注意:不能用 User[ ] userArray 接收,否则会报NoSuchMethodException)

2、使用中间参数封装。写一个UserModel类:


controller中的参数这样写:(注意在遍历时,一定要对user判空,原因后面会讲到。)

页面这样写:


注意 name 值里的下标,下标前面的 users 和 UserModel 的属性 必须一样,这样做,SpringMVC就可以用你提供的UserModel对象找到它的属性users,再通过这个属性,封装User,最后,你只需要用UserModel的get() 方法就可以得到User集合。(SpringMVC封装时,会按下标顺序封装,如果你的下标是0,2,3,5   框架会把1和4补上,补上的是null,所以在遍历这个list的时候一定要判空!!!)

注意:网上有很多人是复制了别人说的,最后页面部分没有说清楚或者没有复制,大家以为直接写User的属性名就可以,导致获取到的UserModel一直为null,原因就是少了页面部分。

你可能感兴趣的:(用SpringMVC从页面获取多个name值相同的input值)