在之前我们介绍了一些简单的数据类型绑定,以及一个自定义数据类型转换器的使用。但是这些简单的数据绑定在我们 的开发中是肯定不够用的,所以我们还要学习复杂的数据类型绑定。所谓的复杂数据类型绑定,主要就体现在将数据绑定到 数组中,绑定到集合中。绑定集合的时候又涉及到如果集合的元素是普通数据类型,集合中的元素是复杂数据类型。以及 之前我们介绍的将数据绑定到类中,上次类中的属性都是普通数据类型,那么如果类中的属性是另一个类的时候要如何进行 数据绑定,这都是数据复杂类型数据绑定要介绍到的。
首先,我们先来介绍,我们如何将数据绑定到一个数组中。将数据绑定到数组中的方法非常简单,只需要将多个input的 name属性的值设置为相同的字符串,然后在控制器类方法中也使用这个字符串当作变量名,然后变量的类型设置为一个 数组即可。需要注意的是,在我们使用数组进行数据绑定的时候,需要保证我们提交参数的input标签的name属性的值 要保持一致才能将所有的值都存到同一个数组中。
java代码:
@GetMapping("/ArrayBinding")
// 将接收到的参数封装到一个数组中,并在方法体中遍历数组
public String ArrayBind(int[] nums){
for(int i : nums){
System.out.println("第"+i+"号商品");
}
return "index";
}
HTML代码:
这是测试复杂数据绑定-将数据绑定到数组
然后是将数据绑定到集合,绑定到集合和绑定到数组的参数提交页面都是一样的,并且也要求多个input标签的name属性的 值保持一致,并且和控制器类的控制器方法的参数的属性值保持一致.唯一的区别就在控制器方法的参数这里,我们在使用 集合接收参数的时候,需要使用@RequestParam注解对传递进来的参数类型做调整. 这个注解的意义在于,因为我们是使用List集合去接收数据,如果我们直接接收,他会将获取到的参数去创建一个List集合 但是因为List是接口,无法创建对象,所以如果直接接收到报出无法找到构造方法的异常,所以这里我们要对接收到的参数 做一个类型的转换,所以要用到@RequestParam注解,声明我们是将接受的多个参数封装到同一个集合中,而不是将每一个 参数都创建一个集合对象.
Java代码:
@RequestMapping("/ListBinging")
// 在将数据绑定到集合的时候,需要使用@RequestParam注解对参数进行处理,否则会报异常
public String ListBinging(@RequestParam("nums")List nums){
for(int i:nums){
System.out.println("第" + i + "号商品");
}
return "index";
}
HTML代码:
这是测试复杂数据绑定-将数据绑定到集合
图示:
复杂类的绑定,所谓的复杂类,就是类中不仅有简单数据类型,可能还有包括其他类,List,Map等数据类型的绑定,我们会对 这几种绑定方法分别进行介绍和代码实现: 首先是属性是对象类型的数据绑定: 将数据绑定到对象中的方法非常的简单,使用"对象.属性"的方式将数据绑定到对象所属的类的属性中 听起来很绕,其实就像是调用一样,通过对象调用属性,然后将值赋给这个属性,最后将所有的属性封装到一个类中 就完成了将数据绑定到对象的过程. 需要注意的是,对象要和类中的对象名保持一致,属性要和对象所属的类的属性名保持一致,就像是我们在Java中调用 一样.
Java代码:
首先我们需要一个类,这个类中嵌套一个类的对象作为属性
package SpringMVC.Complex_data_binding;
public class User {
private int id;
private String username;
// 在这个类中包含了另一个类作为属性,形成了类的嵌套关系
private Order orders;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Order getOrders() {
return orders;
}
public void setOrders(Order orders) {
this.orders = orders;
}
public User(int id, String username, Order orders) {
this.id = id;
this.username = username;
this.orders = orders;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", orders=" + orders +
'}';
}
}
然后是被嵌套的类:
package SpringMVC.Complex_data_binding;
import java.util.List;
public class Order {
private int order_id;
// 在这个类中包含了一个集合,集合的元素是类,就形成了集合中包含类的复杂类型
private List goodsList;
@Override
public String toString() {
return "Order{" +
"order_id=" + order_id +
", goodsList=" + goodsList +
'}';
}
public int getOrder_id() {
return order_id;
}
public void setOrder_id(int order_id) {
this.order_id = order_id;
}
public List getGoodsList() {
return goodsList;
}
public void setGoodsList(List goodsList) {
this.goodsList = goodsList;
}
public Order(int order_id, List goodsList) {
this.order_id = order_id;
this.goodsList = goodsList;
}
public Order() {
}
}
我们在调用的时候,是将数据封装到嵌套其他类的类中:
@RequestMapping("objectBinging")
public String objectBinging(User u){
System.out.println(u.toString());
return "index";
}
HTML代码:
这是测试复杂数据绑定-将数据绑定到复杂类中
图式:
然后就是List集合中的泛型是类的时候的绑定,在这种情况下进行数据绑定的时候,需要在前端页面中使用数组下标 来定位我们给第几个元素进行赋值,其他的就和单个对象的赋值是一样的了
嵌套其他类的类:
package SpringMVC.Complex_data_binding;
import java.util.List;
public class Order {
private int order_id;
// 在这个类中包含了一个集合,集合的元素是类,就形成了集合中包含类的复杂类型
private List goodsList;
@Override
public String toString() {
return "Order{" +
"order_id=" + order_id +
", goodsList=" + goodsList +
'}';
}
public int getOrder_id() {
return order_id;
}
public void setOrder_id(int order_id) {
this.order_id = order_id;
}
public List getGoodsList() {
return goodsList;
}
public void setGoodsList(List goodsList) {
this.goodsList = goodsList;
}
public Order(int order_id, List goodsList) {
this.order_id = order_id;
this.goodsList = goodsList;
}
public Order() {
}
}
被嵌套的类:
package SpringMVC.Complex_data_binding;
public class goods {
private int good_id;
private String good_information;
@Override
public String toString() {
return "goods{" +
"good_id=" + good_id +
", good_information='" + good_information + '\'' +
'}';
}
public int getGood_id() {
return good_id;
}
public void setGood_id(int good_id) {
this.good_id = good_id;
}
public String getGood_information() {
return good_information;
}
public void setGood_information(String good_information) {
this.good_information = good_information;
}
public goods(int good_id, String good_information) {
this.good_id = good_id;
this.good_information = good_information;
}
public goods() {
}
}
控制器类方法:
@RequestMapping("/ListObjectBinging")
public String ListObjectBinging(Order order){
System.out.println(order.toString());
return "index";
}
HTML代码:
这是测试复杂数据绑定-将数据绑定到复杂类的List属性,并且List的泛型是类
图式:
然后是Map类型的数据绑定,map数据类型比较特殊的地方在于,它是由键值对组成的,也就是说,我们在提交的时候,要 根据键的值去决定给哪一个属性赋值,这个键是在页面表单中声明的,由前端进行控制,在控制器方法中,我们只需要 接收一个类作为参数并输出即可
嵌套的类:
package SpringMVC.Complex_data_binding;
import java.util.HashMap;
public class Shelves {
private int id;
private HashMap map;
@Override
public String toString() {
return "Shelves{" +
"id=" + id +
", map=" + map +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public HashMap getMap() {
return map;
}
public void setMap(HashMap map) {
this.map = map;
}
public Shelves(int id, HashMap map) {
this.id = id;
this.map = map;
}
public Shelves() {
}
}
被嵌套的类:
package SpringMVC.Complex_data_binding;
public class goods {
private int good_id;
private String good_information;
@Override
public String toString() {
return "goods{" +
"good_id=" + good_id +
", good_information='" + good_information + '\'' +
'}';
}
public int getGood_id() {
return good_id;
}
public void setGood_id(int good_id) {
this.good_id = good_id;
}
public String getGood_information() {
return good_information;
}
public void setGood_information(String good_information) {
this.good_information = good_information;
}
public goods(int good_id, String good_information) {
this.good_id = good_id;
this.good_information = good_information;
}
public goods() {
}
}
HTML代码:
这是测试复杂数据绑定-将数据绑定到复杂类的map属性
图式:
这是整体的网页,如果你是复制的我的代码,应该可以在启动项目之后,定位到准确的页面之后,在浏览器中看到同样的页面,然后可以试着填写一些数据测试一下是否能完成数据绑定
我们在编写代码的时候,最主要要注意的一点就是我们在HTML编写input标签的name属性的时候,一定要明确我们是向哪一个属性中绑定数据,然后属性名一定要写对,如果发现程序没有报错,但是没有数据,要去检查一下属性名是否写对,类与类之间,集合和类之间的嵌套关系一定要明确。