[Spring MVC]-詳解SpringMVC的各種參數(shù)綁定方式
SpringMVC的各種參數(shù)綁定方式
1. 基本數(shù)據(jù)類型(以int為例,其他類似):
Controller代碼:
@RequestMapping("saysth.do")
public void test(int count) {
}
表單代碼:
<form action="saysth.do" method="post"> <input name="count" value="10" type="text"/> ...... </form>
表單中input的name值和Controller的參數(shù)變量名保持一致,就能完成數(shù)據(jù)綁定,如果不一致可以使用@RequestParam注解。需要注意的是,如果Controller方法參數(shù)中定義的是基本數(shù)據(jù)類型,但是從頁(yè)面提交過(guò)來(lái)的數(shù)據(jù)為null或者”"的話,會(huì)出現(xiàn)數(shù)據(jù)轉(zhuǎn)換的異常。也就是必須保證表單傳遞過(guò)來(lái)的數(shù)據(jù)不能為null或”",所以,在開(kāi)發(fā)過(guò)程中,對(duì)可能為空的數(shù)據(jù),最好將參數(shù)數(shù)據(jù)類型定義成包裝類型,具體參見(jiàn)下面的例子。
2. 包裝類型(以Integer為例,其他類似):
Controller代碼:
@RequestMapping("saysth.do")
public void test(Integer count) {
}
表單代碼:
<form action="saysth.do" method="post"> <input name="count" value="10" type="text"/> ...... </form>
和基本數(shù)據(jù)類型基本一樣,不同之處在于,表單傳遞過(guò)來(lái)的數(shù)據(jù)可以為null或”",以上面代碼為例,如果表單中num為”"或者表單中無(wú)num這個(gè)input,那么,Controller方法參數(shù)中的num值則為null。
3. 自定義對(duì)象類型:
Model代碼:
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代碼:
@RequestMapping("saysth.do")
public void test(User user) {
}
表單代碼:
<form action="saysth.do" method="post"> <input name="firstName" value="張" type="text"/> <input name="lastName" value="三" type="text"/> ...... </form>
非常簡(jiǎn)單,只需將對(duì)象的屬性名和input的name值一一匹配即可。
4. 自定義復(fù)合對(duì)象類型:
Model代碼:
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代碼:
@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());
}
表單代碼:
<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對(duì)象中有ContactInfo屬性,Controller中的代碼和第3點(diǎn)說(shuō)的一致,但是,在表單代碼中,需要使用“屬性名(對(duì)象類型的屬性).屬性名”來(lái)命名input的name。
5. List綁定:
List需要綁定在對(duì)象上,而不能直接寫(xiě)在Controller方法的參數(shù)中。
Model代碼:
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代碼:
@RequestMapping("saysth.do")
public void test(UserListForm userForm) {
for (User user : userForm.getUsers()) {
System.out.println(user.getFirstName() + " - " + user.getLastName());
}
}
表單代碼:
<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>
其實(shí),這和第4點(diǎn)User對(duì)象中的contantInfo數(shù)據(jù)的綁定有點(diǎn)類似,但是這里的UserListForm對(duì)象里面的屬性被定義成List,而不是普通自定義對(duì)象。所以,在表單中需要指定List的下標(biāo)。值得一提的是,Spring會(huì)創(chuàng)建一個(gè)以最大下標(biāo)值為size的List對(duì)象,所以,如果表單中有動(dòng)態(tài)添加行、刪除行的情況,就需要特別注意,譬如一個(gè)表格,用戶在使用過(guò)程中經(jīng)過(guò)多次刪除行、增加行的操作之后,下標(biāo)值就會(huì)與實(shí)際大小不一致,這時(shí)候,List中的對(duì)象,只有在表單中對(duì)應(yīng)有下標(biāo)的那些才會(huì)有值,否則會(huì)為null,看個(gè)例子:
表單代碼:
<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>
這個(gè)時(shí)候,Controller中的userForm.getUsers()獲取到List的size為21,而且這21個(gè)User對(duì)象都不會(huì)為null,但是,第2到第19的User對(duì)象中的firstName和lastName都為null。打印結(jié)果:
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類似,也需要綁定在對(duì)象上,而不能直接寫(xiě)在Controller方法的參數(shù)中。但是,綁定Set數(shù)據(jù)時(shí),必須先在Set對(duì)象中add相應(yīng)的數(shù)量的模型對(duì)象。
Model代碼:
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代碼:
@RequestMapping("saysth.do")
public void test(UserSetForm userForm) {
for (User user : userForm.getUsers()) {
System.out.println(user.getFirstName() + " - " + user.getLastName());
}
}
表單代碼:
<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綁定類似。
需要特別提醒的是,如果最大下標(biāo)值大于Set的size,則會(huì)拋出org.springframework.beans.InvalidPropertyException異常。所以,在使用時(shí)有些不便。
7. Map綁定:
Map最為靈活,它也需要綁定在對(duì)象上,而不能直接寫(xiě)在Controller方法的參數(shù)中。
Model代碼:
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代碼:
@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());
}
}
表單代碼:
<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>
打印結(jié)果:
x: aaa - bbb y: ccc - ddd z: eee - fff
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java OpenCV實(shí)現(xiàn)圖像鏡像翻轉(zhuǎn)效果
這篇文章主要為大家詳細(xì)介紹了Java OpenCV實(shí)現(xiàn)圖像鏡像翻轉(zhuǎn)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
Java實(shí)現(xiàn)兩人五子棋游戲(二) 畫(huà)出棋盤
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)兩人五子棋游戲,畫(huà)出五子棋的棋盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
mybatis如何在一個(gè)update標(biāo)簽中寫(xiě)多條update語(yǔ)句
這篇文章主要介紹了mybatis如何在一個(gè)update標(biāo)簽中寫(xiě)多條update語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Spring Boot利用Docker快速部署項(xiàng)目的完整步驟
這篇文章主要給大家介紹了關(guān)于Spring Boot利用Docker快速部署項(xiàng)目的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Flink實(shí)現(xiàn)特定統(tǒng)計(jì)的歸約聚合reduce操作
這篇文章主要介紹了Flink實(shí)現(xiàn)特定統(tǒng)計(jì)的歸約聚合reduce操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-02-02
Java class文件格式之方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java class文件格式之方法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
關(guān)于SpringBoot中Ajax跨域以及Cookie無(wú)法獲取丟失問(wèn)題
這篇文章主要介紹了關(guān)于SpringBoot中Ajax跨域以及Cookie無(wú)法獲取丟失問(wèn)題,本文具有參考意義,遇到相同或者類似問(wèn)題的小伙伴希望可以從中找到靈感2023-03-03
教你bat腳本一鍵配置java開(kāi)發(fā)環(huán)境
公司新入職一名員工,項(xiàng)目經(jīng)理讓我安排新人工作,首先需要對(duì)java開(kāi)發(fā)相關(guān)環(huán)境進(jìn)行配置安裝,但時(shí)常會(huì)因?yàn)榘惭b配置不到位或者操作錯(cuò)誤導(dǎo)致時(shí)間的浪費(fèi),所以在空余時(shí)間收集了一系列軟件的免安裝版本,感興趣的朋友一起看看吧2021-12-12

