springmvc引數繫結
1. 基本資料型別(以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的引數變數名保持一致,就能完成資料繫結,如果不一致可以使用@RequestParam註解。需要注意的是,如果Controller方法引數中定義的是基本資料型別,但是從頁面提交過來的資料為null或者”"的話,會出現資料轉換的異常。也就是必須保證表單傳遞過來的資料不能為null或”",所以,在開發過程中,對可能為空的資料,最好將引數資料型別定義成包裝型別,具體參見下面的例子。
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>
和基本資料型別基本一樣,不同之處在於,表單傳遞過來的資料可以為null或”",以上面程式碼為例,如果表單中num為”"或者表單中無num這個input,那麼,Controller方法引數中的num值則為null。
3. 自定義物件型別:
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值一一匹配即可。
4. 自定義複合物件型別:
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物件中有ContactInfo屬性,Controller中的程式碼和第3點說的一致,但是,在表單程式碼中,需要使用“屬性名(物件型別的屬性).屬性名”來命名input的name。
5. List繫結:
List需要繫結在物件上,而不能直接寫在Controller方法的引數中。
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>
其實,這和第4點User物件中的contantInfo資料的繫結有點類似,但是這裡的UserListForm物件裡面的屬性被定義成List,而不是普通自定義物件。所以,在表單中需要指定List的下標。值得一提的是,Spring會建立一個以最大下標值為size的List物件,所以,如果表單中有動態新增行、刪除行的情況,就需要特別注意,譬如一個表格,使用者在使用過程中經過多次刪除行、增加行的操作之後,下標值就會與實際大小不一致,這時候,List中的物件,只有在表單中對應有下標的那些才會有值,否則會為null,看個例子:
表單程式碼:
<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。列印結果:
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程式碼:
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繫結類似。
需要特別提醒的是,如果最大下標值大於Set的size,則會丟擲org.springframework.beans.InvalidPropertyException異常。所以,在使用時有些不便。
7. Map繫結:
Map最為靈活,它也需要繫結在物件上,而不能直接寫在Controller方法的引數中。
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>
列印結果:
x: aaa - bbb
y: ccc - ddd
z: eee - fff
相關推薦
SpringMVC 引數繫結相關注解
@RequestParams 作用:把請求中指定名稱的引數給控制器中的形參賦值。 屬性: // <a href="account/save3.do?id=100&username=jack"> 儲存 2</a>
06-springMVC-引數繫結-01
springMVC引數的繫結01 前言: 1. 簡單型別繫結 1.1 前臺請求引數和後臺處理器形參**同名** 1.2 前臺請求引數和後臺處理器形參**不同名** 1.3
springmvc引數繫結
1. 基本資料型別(以int為例,其他類似): Controller程式碼: @RequestMapping("saysth.do") public void test(int count) { } 表單程式碼: <form action="saysth.do"
springMVC引數繫結失敗的原因有以下2種
新搭建一個springMVC專案,發現通過postman 呼叫post方法,提交Body設定成form-data時,controller層無法自動繫結引數,翻閱資料後,發現是由下列1的原因引起。 1.form表單檔案上傳 設定enctype=”multipa
SpringMVC引數繫結(從請求中接受引數)
引數繫結(從請求中接收引數) 1)預設型別: 在controller方法中可以有也可以沒有,看自己需求隨意新增. httpservletRqeust,httpServletResponse,htt
SpringMVC引數繫結註解
以下文章轉自“開濤的部落格”在SpringMVC 的控制器中提供了很多請求資料繫結的註解,以及功能處理方法支援的引數型別:請求引數繫結註解:@RequestParam繫結單個請求引數值;@PathVariable繫結URI模板變數值;@CookieValue繫結Cookie資
springMVC引數繫結原理
主要核心的類是ServletInvocableHandlerMethod類,它是繼承InvocableHandlerMethod類,也就是InvocableHandlerMethod的子類。核心的繫結引數的方法是getMethodArgumentValues方法,顧名思義,方
SpringMVC 引數繫結詳解
概述 記得之前跟前端同事聯調介面的時候,後端springMVC需要接收陣列型別的引數,然後跟前端說需要傳陣列型別過來。後來前端童鞋傳了陣列,但是後端接收不成功,聯調失敗。那時候由於時間關係沒有仔細研究這塊,當時想了個辦法就是前端傳一個json字串,後端換成接收
springmvc 引數繫結註解詳解
簡介 Handler method引數繫結常用的註解,我們根據它們處理request的不同內容部分來看主要分為四類: A. 處理requesr uri部分的註解,@PathVariable B. 處理 request header部分的註解,@RequestH
springmvc(十六)springmvc註解開發-springmvc引數繫結-map繫結
也通過在包裝pojo中定義map型別屬性。 在包裝類中定義Map物件,並新增get/set方法,action使用包裝物件接收。 包裝類中定義Map物件如下: Public class QueryVo
SpringMVC引數繫結學習總結【前後端資料引數傳遞】
目錄 1. 繫結機制 2. 支援的資料型別 3. 引數請求中文亂碼解決 4.自定義型別轉換器 5、最後引數繫結學習小結 SpringMVC作為Controller
二、Springmvc+Mybatis 引數繫結之預設引數繫結 簡單型別繫結 POJO繫結 POST亂碼問題
web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/
SpringMVC入門丶請求引數繫結丶常用註解
SpringMVC入門 建立WEB工程,引入依賴 <!-- 版本鎖定 --> <properties> <spring.version>5.0.2.RELEASE</spring.version> </properties> &
SpringMVC框架(1)之(1.3 自定義引數繫結)
一、自定義引數繫結-屬性編輯器(不推薦) 問題:① 4.1 itemsList.jsp 中增加顯示 “訂購日期” 屬性;② JSP頁面中日期拿到的是字串,而提交到Controller中POJO類ItemsCustom 屬性物件的日期欄位要變成Date型別,即字串轉換成日期型別,無法自動轉
SpringMVC框架(1)之(1.3 引數繫結)
引數繫結 一、繫結簡單型別引數:整型、字串、float/double、日期、布林(eg:Controller中方法 public String editItemsSubmit(String name,Float price)) (eg:4.2 editItems.jsp 中 name
Springmvc之引數繫結
spring引數繫結過程 概念:從客戶端請求key/value資料,經過引數繫結,將key/value資料繫結到controller方法形參上。 springmvc中,接受頁面提交的資料是通過方法形參來接收,而不是在controller類定義成員變數來接收 第一步:
SpringMVC 完美解決PUT請求引數繫結問題(普通表單和檔案表單)
一 解決方案 修改web.xml配置檔案 將下面配置拷貝進去(在原有的web-app節點裡面配置 其它配置不變) <!-- 處理PUT提交引數(只對基礎表單生效) --> <filter> <filter-name>httpPutFormContentFilter
<SpringMvc>入門三 引數繫結
1.get請求 <%--請求引數的繫結--%> <%--get請求引數--%> <a href="/param/testParam1?username=tom&password=123456">請求引數繫結</a
SpringMVC請求引數繫結(用法)
目錄 1.把請求資料封裝到JavaBean類中 (1)自定義一個JavaBean類 package com.heima.domain; import java.io.Serializ
SpringMVC自定義引數繫結器【日期型別】
前提:由於日期型別有很多種格式,springmvc無法將字串轉換成日期型別,所以需要我們根據業務需求自定義引數繫結! 第一步:自定義引數繫結器---根據介面卡引數繫結器的編碼要求規範開發bean package com.cyn.ssm.converter; impor