springmvc前臺向后臺傳值幾種方式總結(jié)(從簡單到復(fù)雜)
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ù)類型,但是從頁面提交過來的數(shù)據(jù)為null或者”"的話,會出現(xiàn)數(shù)據(jù)轉(zhuǎn)換的異常。
也就是必須保證表單傳遞過來的數(shù)據(jù)不能為null或”",所以,在開發(fā)過程中,對可能為空的數(shù)據(jù),最好將參數(shù)數(shù)據(jù)類型定義成包裝類型,具體參見下面的例子。
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ù)類型基本一樣,不同之處在于,表單傳遞過來的數(shù)據(jù)可以為null或”",以上面代碼為例,如果表單中num為”"或者表單中無num這個input,那么,Controller方法參數(shù)中的num值則為null。
3. 自定義對象類型:
Model代碼:
public class User {
private String firstName;
private String lastName;
省略set,get 方法
}
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>
非常簡單,只需將對象的屬性名和input的name值一一匹配即可。
4. 自定義復(fù)合對象類型:
Model代碼:
public class ContactInfo {
private String tel;
private String address;
省略set ,get
}
public class User {
private String firstName;
private String lastName;
private ContactInfo contactInfo;
省略set ,get
}
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對象中有ContactInfo屬性,Controller中的代碼和第3點說的一致,但是,在表單代碼中,需要使用“屬性名(對象類型的屬性).屬性名”來命名input的name。
5. List綁定:
List需要綁定在對象上,而不能直接寫在Controller方法的參數(shù)中。
Model代碼:
public class User {
private String firstName;
private String lastName;
省略set ,get
}
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"> <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> </form>
其實,這和第4點User對象中的contantInfo數(shù)據(jù)的綁定有點類似,但是這里的UserListForm對象里面的屬性被定義成List,而不是普通自定義對象。
所以,在表單中需要指定List的下標(biāo)。值得一提的是,spring會創(chuàng)建一個以最大下標(biāo)值為size的List對象,所以,如果表單中有動態(tài)添加行、刪除行的情況,就需要特別注意,譬如一個表格,用戶在使用過程中經(jīng)過多次刪除行、增加行的操作之后,下標(biāo)值就會與實際大小不一致,
這時候,List中的對象,只有在表單中對應(yīng)有下標(biāo)的那些才會有值,否則會為null,看個例子:
表單代碼:
<form action="saysth.do" method="post"> <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> </form>
這個時候,Controller中的userForm.getUsers()獲取到List的size為21,而且這21個User對象都不會為null,但是,第2到第19的User對象中的firstName和lastName都為null。打印結(jié)果:
aaa - bbb ccc - ddd null - null null - null ..... null - null eee - fff
6. Set綁定:
Set和List類似,也需要綁定在對象上,而不能直接寫在Controller方法的參數(shù)中。但是,綁定Set數(shù)據(jù)時,必須先在Set對象中add相應(yīng)的數(shù)量的模型對象。
Model代碼:
public class User {
private String firstName;
private String lastName;
省略set ,get
}
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"> <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> </form>
基本和List綁定類似。
需要特別提醒的是,如果最大下標(biāo)值大于Set的size,則會拋出org.springframework.beans.InvalidPropertyException異常。所以,在使用時有些不便。
7. Map綁定:
Map最為靈活,它也需要綁定在對象上,而不能直接寫在Controller方法的參數(shù)中。
Model代碼:
public class User {
private String firstName;
private String lastName;
省略set ,get
}
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"> <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> </form>
以上這篇springmvc前臺向后臺傳值幾種方式總結(jié)(從簡單到復(fù)雜)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實現(xiàn)Jar文件的遍歷復(fù)制與文件追加
這篇文章主要為大家詳細(xì)介紹了如何利用Java實現(xiàn)Jar文件的遍歷復(fù)制與文件追加功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
SpringBoot整合MybatisPlusGernerator實現(xiàn)逆向工程
在我們寫項目的時候,我們時常會因為需要創(chuàng)建很多的項目結(jié)構(gòu)而頭疼,本文主要介紹了SpringBoot整合MybatisPlusGernerator實現(xiàn)逆向工程,具有一定的參考價值,感興趣的可以了解一下2024-05-05
mybatis取別名typeAliases標(biāo)簽的位置放錯導(dǎo)致報錯的解決
這篇文章主要介紹了mybatis取別名typeAliases標(biāo)簽的位置放錯導(dǎo)致報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
springboot?集成identityserver4身份驗證的過程解析
這篇文章主要介紹了springboot?集成identityserver4身份驗證的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
使用 Spring Boot 實現(xiàn) WebSocket實時通信
本篇文章主要介紹了使用 Spring Boot 實現(xiàn) WebSocket實時通信,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
SpringBoot3+SpringSecurity6前后端分離的項目實踐
SpringSecurity6 的用法和以前版本的有較大差別,本文主要介紹了SpringBoot3+SpringSecurity6前后端分離的項目實踐,具有一定的參考價值,感興趣的可以了解一下2023-12-12
Java 實戰(zhàn)范例之員工管理系統(tǒng)的實現(xiàn)
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+vue+Springboot+ssm+mysql+maven+redis實現(xiàn)一個前后端分離的員工管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11
Java的idea連接mongodb數(shù)據(jù)庫的詳細(xì)教程
這篇文章主要介紹了Java的idea連接mongodb數(shù)據(jù)庫的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11

