javascript
SpringMVC学习笔记四:数据绑定
轉載請注明原文地址:http://www.cnblogs.com/ygj0930/p/6831344.html?
參考:http://www.cnblogs.com/HD/p/4107674.html
一:數據綁定
1:基本類型的綁定
? ? 根據URL映射到某個處理函數時,函數的參數值自動在request中尋找同名的傳過來的頁面參數值。如果沒有則報錯,可以使用@RequestParam注解來修飾該函數參數,設置defaultValue,防止傳過來空值時報錯。
Controller代碼:
@RequestMapping("saysth.do") public void test(int count) {//參數名為count }表單代碼:
<form action="saysth.do" method="post"> <input name="count" value="10" type="text"/>//標簽參數名為count ...... </form>?
2:基本類型的包裝類型的綁定
? ? 根據URL映射到某個處理函數時,函數的參數值自動在request中尋找同名的傳過來的頁面參數值。允許參數值為空。
Controller代碼:
@RequestMapping("saysth.do") public void test(Integer count) {//參數名為count }表單代碼:
<form action="saysth.do" method="post"> <input name="count" value="10" type="text"/>//標簽參數名為count ...... </form>?
3:數組類型綁定
? ? 根據URL映射到某個處理函數時,函數參數為一個數組,則自動在request尋找名字同數組名的參數的值們并存入數組。
如:url?name=111&name=222&name=333;則函數參數中的數組int[] arr的值為{111,222,333}
?
4:簡單對象的綁定
? ??根據URL映射到某個處理函數時,函數參數為一個簡單的bean(即:類的屬性全為簡單數據類型的,并且定義了屬性的setter和getter方法)。
? ? 則自動從request的參數中尋找與bean類屬性同名的參數值賦給bean實例的同名屬性,構造出一個bean實例作為函數參數傳進函數中使用。
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>非常簡單,只需將對象的屬性名和input的name值一一匹配即可。
?
5:多層級對象的綁定
? ??根據URL映射到某個處理函數時,函數參數為一個復雜的bean(bean中包含其他類實例作為成員屬性)。
? ? 則URL的格式為: url?一級bean中普通屬性=值&一級bean中的二級bean成員屬性.二級bean普通屬性=值...
? ? 比如:User類中有Info類成員屬性,Info類中有qq、phone屬性。則請求為:url?name=aaa&info.qq=88888&info.phone=99999
?
6:有相同屬性的對象參數綁定
? ??根據URL映射到某個處理函數時,如果函數的有兩個或以上的對象參數,并且有兩個或以上的參數的實例對象有相同類型、相同名字的屬性,則此時URL傳過來的參數值會同時賦給擁有該同名屬性的對象中去。解決辦法就是使用 自定義編輯器轉換數據,來規定什么格式的參數轉換為哪個對象的屬性值。
? ? 比如:url?user.name=111&person.name=000,自定義編輯器把 user. ?定義為user實例的前綴, person. 定義為person實例的前綴。則自動把參數值傳給user、person實例了。
?
7:List對象綁定
List需要綁定在對象上,而不能直接寫在Controller方法的參數中。
Model代碼:
Controller代碼:
@RequestMapping("saysth.do") public void test(UserListForm userForm) {//用對象來接收List內容,賦給對象中的list類型成員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>//頁面端通過 [] 為list元素屬性賦值 <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元素賦值,如:user[0]一下子跳到了user[10],則中間user[1~9]元素屬性值會是null,并且list大小為11而不是2。
?
8:Set對象綁定
Set和List類似,也需要綁定在對象上,而不能直接寫在Controller方法的參數中。并且,必須先在Set綁定的對象的中add相應的數量的模型對象,從而創建出相應大小的set。
Model代碼:
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綁定類似,下標不能跳躍,不然前端傳過去的set就會大于綁定對象中的set,會報錯。一般不用set,很麻煩。
?
9:Map對象綁定
Map最為靈活,它也需要綁定在對象上,而不能直接寫在Controller方法的參數中。
Model代碼:
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>//以字符串作key,user對象作為value <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>?
10:JSON數據綁定
當客戶端傳過來JSON格式的內容給請求處理參數時,我們需要把JSON格式的數據轉換為bean實例,可以通過 @RequestBody注解修飾函數參數,把request中body部分數據轉換為對象,然后把對象作為函數參數使用。
? ?
11:XML數據綁定
XML數據綁定比JSON多一步,作為請求處理函數的參數對象在定義時,需要添加一些XML解析的注解,來表明此對象對應于xml文件中的哪個element。
然后,通過 @RequestBody注解修飾函數參數,把request中body部分的xml格式數據轉換為對象,然后把對象作為函數參數使用。
?
總結
以上是生活随笔為你收集整理的SpringMVC学习笔记四:数据绑定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php递归函数return会出现无法正确
- 下一篇: gradle idea java ssm