一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - [Spring MVC]-詳解SpringMVC的各種參數綁定方式

[Spring MVC]-詳解SpringMVC的各種參數綁定方式

2020-07-12 16:03橫渡 Java教程

本篇文章主要介紹了SpringMVC的各種參數綁定方式 ,具有一定的參考價值,有需要的可以了解一下。

SpringMVC的各種參數綁定方式

1. 基本數據類型(以int為例,其他類似):

Controller代碼:

?
1
2
3
@RequestMapping("saysth.do")
public void test(int count) {
}

表單代碼:

?
1
2
3
4
<form action="saysth.do" method="post">
<input name="count" value="10" type="text"/>
......
</form>

表單中input的name值和Controller的參數變量名保持一致,就能完成數據綁定,如果不一致可以使用@RequestParam注解。需要注意的是,如果Controller方法參數中定義的是基本數據類型,但是從頁面提交過來的數據為null或者”"的話,會出現數據轉換的異常。也就是必須保證表單傳遞過來的數據不能為null或”",所以,在開發過程中,對可能為空的數據,最好將參數數據類型定義成包裝類型,具體參見下面的例子。

 2. 包裝類型(以Integer為例,其他類似):

Controller代碼:

?
1
2
3
@RequestMapping("saysth.do")
public void test(Integer count) {
}

表單代碼:

?
1
2
3
4
<form action="saysth.do" method="post">
<input name="count" value="10" type="text"/>
......
</form>

和基本數據類型基本一樣,不同之處在于,表單傳遞過來的數據可以為null或”",以上面代碼為例,如果表單中num為”"或者表單中無num這個input,那么,Controller方法參數中的num值則為null。

 3. 自定義對象類型:

Model代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class User {
  private String firstName;
  private String lastName;
 
  public String getFirstName() {
    return firstName;
  }
 
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
 
  public String getLastName() {
    return lastName;
  }
 
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
 
}

Controller代碼:

?
1
2
3
@RequestMapping("saysth.do")
public void test(User user) {
}

表單代碼:

?
1
2
3
4
5
<form action="saysth.do" method="post">
<input name="firstName" value="張" type="text"/>
<input name="lastName" value="三" type="text"/>
......
</form>

非常簡單,只需將對象的屬性名和input的name值一一匹配即可。

4. 自定義復合對象類型:

Model代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class ContactInfo {
  private String tel;
  private String address;
 
  public String getTel() {
    return tel;
  }
 
  public void setTel(String tel) {
    this.tel = tel;
  }
 
  public String getAddress() {
    return address;
  }
 
  public void setAddress(String address) {
    this.address = address;
  }
 
}
 
public class User {
  private String firstName;
  private String lastName;
  private ContactInfo contactInfo;
 
  public String getFirstName() {
    return firstName;
  }
 
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
 
  public String getLastName() {
    return lastName;
  }
 
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
 
  public ContactInfo getContactInfo() {
    return contactInfo;
  }
 
  public void setContactInfo(ContactInfo contactInfo) {
    this.contactInfo = contactInfo;
  }
 
}

Controller代碼:

?
1
2
3
4
5
6
7
@RequestMapping("saysth.do")
public void test(User user) {
  System.out.println(user.getFirstName());
  System.out.println(user.getLastName());
  System.out.println(user.getContactInfo().getTel());
  System.out.println(user.getContactInfo().getAddress());
}

表單代碼:

?
1
2
3
4
5
6
7
<form action="saysth.do" method="post">
<input name="firstName" value="張" /><br>
<input name="lastName" value="三" /><br>
<input name="contactInfo.tel" value="13809908909" /><br>
<input name="contactInfo.address" value="北京海淀" /><br>
<input type="submit" value="Save" />
</form>

User對象中有ContactInfo屬性,Controller中的代碼和第3點說的一致,但是,在表單代碼中,需要使用“屬性名(對象類型的屬性).屬性名”來命名input的name。

5. List綁定:

List需要綁定在對象上,而不能直接寫在Controller方法的參數中。

Model代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class User {
  private String firstName;
  private String lastName;
 
  public String getFirstName() {
    return firstName;
  }
 
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
 
  public String getLastName() {
    return lastName;
  }
 
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
 
}
 
public class UserListForm {
  private List<User> users;
 
  public List<User> getUsers() {
    return users;
  }
 
  public void setUsers(List<User> users) {
    this.users = users;
  }
 
}

Controller代碼:

?
1
2
3
4
5
6
@RequestMapping("saysth.do")
public void test(UserListForm userForm) {
  for (User user : userForm.getUsers()) {
    System.out.println(user.getFirstName() + " - " + user.getLastName());
  }
}

表單代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<form action="saysth.do" method="post">
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2"><input type="submit" value="Save" /></td>
</tr>
</tfoot>
<tbody>
<tr>
<td><input name="users[0].firstName" value="aaa" /></td>
<td><input name="users[0].lastName" value="bbb" /></td>
</tr>
<tr>
<td><input name="users[1].firstName" value="ccc" /></td>
<td><input name="users[1].lastName" value="ddd" /></td>
</tr>
<tr>
<td><input name="users[2].firstName" value="eee" /></td>
<td><input name="users[2].lastName" value="fff" /></td>
</tr>
</tbody>
</table>
</form>

其實,這和第4點User對象中的contantInfo數據的綁定有點類似,但是這里的UserListForm對象里面的屬性被定義成List,而不是普通自定義對象。所以,在表單中需要指定List的下標。值得一提的是,Spring會創建一個以最大下標值為size的List對象,所以,如果表單中有動態添加行、刪除行的情況,就需要特別注意,譬如一個表格,用戶在使用過程中經過多次刪除行、增加行的操作之后,下標值就會與實際大小不一致,這時候,List中的對象,只有在表單中對應有下標的那些才會有值,否則會為null,看個例子:

表單代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<form action="saysth.do" method="post">
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2"><input type="submit" value="Save" /></td>
</tr>
</tfoot>
<tbody>
<tr>
<td><input name="users[0].firstName" value="aaa" /></td>
<td><input name="users[0].lastName" value="bbb" /></td>
</tr>
<tr>
<td><input name="users[1].firstName" value="ccc" /></td>
<td><input name="users[1].lastName" value="ddd" /></td>
</tr>
<tr>
<td><input name="users[20].firstName" value="eee" /></td>
<td><input name="users[20].lastName" value="fff" /></td>
</tr>
</tbody>
</table>
</form>

這個時候,Controller中的userForm.getUsers()獲取到List的size為21,而且這21個User對象都不會為null,但是,第2到第19的User對象中的firstName和lastName都為null。打印結果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
aaa - bbb
ccc - ddd
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
eee - fff

6. Set綁定:

Set和List類似,也需要綁定在對象上,而不能直接寫在Controller方法的參數中。但是,綁定Set數據時,必須先在Set對象中add相應的數量的模型對象。

Model代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class User {
  private String firstName;
  private String lastName;
 
  public String getFirstName() {
    return firstName;
  }
 
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
 
  public String getLastName() {
    return lastName;
  }
 
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
 
}
 
public class UserSetForm {
  private Set<User> users = new HashSet<User>();
 
  public UserSetForm() {
    users.add(new User());
    users.add(new User());
    users.add(new User());
  }
 
  public Set<User> getUsers() {
    return users;
  }
 
  public void setUsers(Set<User> users) {
    this.users = users;
  }
 
}

Controller代碼:

?
1
2
3
4
5
6
@RequestMapping("saysth.do")
public void test(UserSetForm userForm) {
  for (User user : userForm.getUsers()) {
    System.out.println(user.getFirstName() + " - " + user.getLastName());
  }
}

表單代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<form action="saysth.do" method="post">
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2"><input type="submit" value="Save" /></td>
</tr>
</tfoot>
<tbody>
<tr>
<td><input name="users[0].firstName" value="aaa" /></td>
<td><input name="users[0].lastName" value="bbb" /></td>
</tr>
<tr>
<td><input name="users[1].firstName" value="ccc" /></td>
<td><input name="users[1].lastName" value="ddd" /></td>
</tr>
<tr>
<td><input name="users[2].firstName" value="eee" /></td>
<td><input name="users[2].lastName" value="fff" /></td>
</tr>
</tbody>
</table>
</form>

基本和List綁定類似。

需要特別提醒的是,如果最大下標值大于Set的size,則會拋出org.springframework.beans.InvalidPropertyException異常。所以,在使用時有些不便。

 7. Map綁定:

Map最為靈活,它也需要綁定在對象上,而不能直接寫在Controller方法的參數中。

Model代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class User {
  private String firstName;
  private String lastName;
 
  public String getFirstName() {
    return firstName;
  }
 
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
 
  public String getLastName() {
    return lastName;
  }
 
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
 
}
 
public class UserMapForm {
  private Map<String, User> users;
 
  public Map<String, User> getUsers() {
    return users;
  }
 
  public void setUsers(Map<String, User> users) {
    this.users = users;
  }
 
}

Controller代碼:

?
1
2
3
4
5
6
7
@RequestMapping("saysth.do")
public void test(UserMapForm userForm) {
  for (Map.Entry<String, User> entry : userForm.getUsers().entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue().getFirstName() + " - " +
    entry.getValue().getLastName());
  }
}

表單代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<form action="saysth.do" method="post">
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2"><input type="submit" value="Save" /></td>
</tr>
</tfoot>
<tbody>
<tr>
<td><input name="users['x'].firstName" value="aaa" /></td>
<td><input name="users['x'].lastName" value="bbb" /></td>
</tr>
<tr>
<td><input name="users['y'].firstName" value="ccc" /></td>
<td><input name="users['y'].lastName" value="ddd" /></td>
</tr>
<tr>
<td><input name="users['z'].firstName" value="eee" /></td>
<td><input name="users['z'].lastName" value="fff" /></td>
</tr>
</tbody>
</table>
</form>

打印結果:

?
1
2
3
x: aaa - bbb
y: ccc - ddd
z: eee - fff

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/HD/p/4107674.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品国产高清久久久久久91 | 久久爽狠狠添AV激情五月 | 美女跪式抽搐gif动态图 | 极品蜜桃臀美女啪啪 | 动漫美女胸被狂揉扒开吃奶动态图 | 免费一级毛片在级播放 | 国产精品免费综合一区视频 | 校园全肉高h湿一女多男 | 青草娱乐极品免费视频 | 国产精品久久毛片蜜月 | 亚洲国产第一 | 精品久久伦理中文字幕 | 国产精品热久久毛片 | 果冻传媒天美传媒网址入口 | 4455永久在线视频观看 | 亚洲一卡2卡三卡4卡5卡组 | 性做久久久久久久久浪潮 | 国产欧美精品一区二区三区–老狼 | 天天爱天天操天天射 | 日本激情网 | 国产精品激情综合久久 | 国产成人愉拍免费视频 | 护士videossexo另类 | 日本天堂网 | 婷婷精品 | 成人性爱视频在线观看 | 亚拍一区| 久久热国产在线视频 | 国产男女乱淫真视频全程播放 | 日本一级不卡一二三区免费 | 国产愉拍| 无人视频在线观看完整版高清 | 国产精品99爱免费视频 | 色综合色综合 | 国产综合社区 | 饱满奶大30p | 成年人在线视频观看 | 波多野结衣中文字幕 | 日麻逼| 扒开女人下面使劲桶屁股动漫 | 国产精品香蕉夜间视频免费播放 |