Spring参数绑定

参数绑定相关注解

  1. @RequestParam,绑定单个请求数据,可以是URL中的数据,表单提交的数据或上传的文件;
  2. @PathVariable,绑定URL模板变量值;
  3. @CookieValue,绑定Cookie数据;
  4. @RequestHeader,绑定请求头数据;
  5. @ModelAttribute,绑定数据到Model;
  6. @SessionAttributes,绑定数据到Session;
  7. @RequestBody,用来处理Content-Type不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
  8. @RequestPart,绑定“multipart/data”数据,并可以根据数据类型进项对象转换;

基本数据类型-int

如果参数的属性是required的, 可以用int. 如果不是required的, 需要使用包装类型Integer. 因为值为null会导致异常.

  • Controller
@RequestMapping("saysth.do")
public void test(int count) {
}
  • form
<form action="saysth.do" method="post">
<input name="count" value="10" type="text"/>
</form>
`

包装类型-integer

  • Controller
@RequestMapping("saysth.do")
public void test(Integer count) {
}
  • HTML
    <form action="saysth.do" method="post">
    <input name="count" value="10" type="text"/>
    </form>
    `

自定义对象类型

  • Model
public class User {
private String firstName;
private String lastName;
...
}
  • Controller
@RequestMapping("saysth.do")
public void test(User user) {
}
  • HTML
    <form action="saysth.do" method="post">
    <input name="firstName" value="张" type="text"/>
    <input name="lastName" value="三" type="text"/>
    </form>

自定义复合对象类型

  • Model
public class ContactInfo {
private String tel;
private String address;
public String getTel() {
return tel;
}
...
}
public class User {
private String firstName;
private String lastName;
private ContactInfo contactInfo;
... getter & setter
}
  • 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());
}
  • HTML
<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>

List

  • Model
public class User {
private String firstName;
private String lastName;
...
}
public class UserListForm {
private List<User> users;
...
}
  • Controller
@RequestMapping("saysth.do")
public void test(UserListForm userForm) {
for (User user : userForm.getUsers()) {
System.out.println(user.getFirstName() + " - " + user.getLastName());
}
}
  • HTML
<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>

Set

  • Model
public class User {
private String firstName;
private String 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());
}
...
}
  • Controller
@RequestMapping("saysth.do")
public void test(UserSetForm userForm) {
for (User user : userForm.getUsers()) {
System.out.println(user.getFirstName() + " - " + user.getLastName());
}
}
  • HTML
<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>

Map

  • Model
public class User {
private String firstName;
private String lastName;
...
}
public class UserMapForm {
private Map<String, User> 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());
}
}
  • HTML
<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>

Json

前端的content type: contentType:’application/json;charset=utf-8’
controller方法的参数使用@RequestBody

  • Model
public class User {
private String firstName;
private String lastName;
...
}
  • Controller
@RequestMapping("json.do")
public void test(@RequestBody User user) {
return user;
}
  • HTML
var params = {
"firstName": "张",
"lastName": "三",
};
$.ajax({
type: 'post',
url: 'json.do',
contentType:'application/json;charset=utf-8',
dataType: 'json',
data: JSON.stringify(params),
success: function(data){
console.log(data);
}
});

XML

  • pom.xml
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
  • Model
public class User {
private String firstName;
private String lastName;
...
}
  • Controller
@RequestMapping("xml.do")
public void xml(@RequestBody User user) {
return user;
}
  • Postman
POST /xml HTTP/1.1
Host: localhost:8080
Content-Type: application/xml
Cache-Control: no-cache
Postman-Token: 03933f48-c29b-bfb8-bb10-29ed5c2c237c
<user>
<firstName>张</firstName>
<lastName>三</lastName>
</user>
分享到