开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天
数组绑定
在实际开发中,可能会遇到客户端请求需要传递多个同名参数到服务器端的情况,这种情况采用前面讲解的简单数据绑定的方式显然不太合适。此时我们就可以使用数组来接收客户端的请求参数。
例:
//商品类
public class Product{
private String proId;
private String proName;
//getter、setter
}
<!--jsp文件中复选框结构,选中的内容会进行提交-->
<tr>
<td>
<input name = "proIds" value="2" type="checkbox"><br/>
</td>
<td>product1</td>
</tr>
<tr>
<td>
<input name = "proIds" value="2" type="checkbox"><br/>
</td>
<td>product2</td>
</tr>
<tr>
<td>
<input name = "proIds" value="2" type="checkbox"><br/>
</td>
<td>product3</td>
</tr>
//处理器方法
@RequestMapping("/getProducts")
public void getProducts(String[] proIds){
for(String proId:proIds){
System.out.println("获得了Id为" + proId + "的商品");
}
}
注意:客户端请求的参数名称需要与getProducts()方法形参名称proIds保持一致。
集合绑定
集合中存储简单类型数据时,数据绑定的规则和数组相似,需要请求参数名称与处理器的形参名称保持一致。不同的是,使用集合绑定时,处理器的形参名称需要使用@RequestParam注解标注。
例:
//处理器方法
@RequestMapping("/getProducts")
public void getProducts(@RequestParam("proIds") List<String> proIds){
for(String proId:proIds){
System.out.println("获得了Id为" + proId + "的商品");
}
}
为什么要用@RequestParam注解?
如果不使用@RequestParam注解,Spring MVC默认将List作为对象处理,赋值前先创建List对象,然后将proIds作为List对象的属性进行处理。由于List是接口,无法创建对象,所以会出现无法找到构造方法异常。 通过使用注解,将参数打包成参数数组或集合后,Spring MVC才能识别该数据格式,并判定形参类型是否为数组或集合,并按数组或集合对象的形式操作数据。
复杂POJO绑定
复杂POJO绑定分为:
- 属性为对象类型的数据绑定
- 属性为List类型的数据绑定
- 属性为Map类型的数据绑定
属性为对象类型的数据绑定
比如订单类为Order,其中包含属性OrderId,User类中包含订单属性Order,处理器接收的形参为User类实例
要注意:客户端请求的参数名(例如form表单内各元素name的属性值)格式必须为 “属性对象名称.属性” ,其中属性对象名称要和POJO属性对象名一致,属性要和属性对象所属类的属性一致
比如参数名为Order.orderId表示输入的是订单类的订单Id属性
但是User中的属性例如username便不需要前加类名,嵌套作为属性的类才需要
属性为List类型的数据绑定
例如订单类为Order,其中包含属性OrderId,User类中包含List类型的属性orders,参考上文,我们需要结合List以及对象类型的访问方式来进行绑定:
name=orders[0].orderId
name=orders[1].orderId
name=orders[2].orderId
但如果List类型中是普通的类型,例如List address,请求参数名称直接写属性名称就好:
name=address
属性为Map类型的数据绑定
例如订单类为Order,其中含有HashMap<String,Product> productInfo属性,其中的Product类包含ProId属性,请求参数名称:
//info为你要对应传入的Map键值
name=productInfo['info'].proId