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