1. 程式人生 > >springmvc引數繫結

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