Spring MVC会根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中。这种将请求消息数据与后台方法参数建立连接的过程就是Spring MVC中的数据绑定。
在数据绑定过程中,Spring MVC框架会通过数据绑定组件(DataBinder)将请求参数串的内容进行类型转换,然后将转换后的值赋给控制器类中方法的形参,这样后台方法就可以正确绑定并获取客户端请求携带的参数了。
根据客户端请求参数类型和个数的不同,我们将Spring MVC中的数据绑定主要分为:
简单数据绑定、复杂数据绑定和json数据绑定。以及restful风格的数据绑定。根据具体业务具体分析使用何种数据绑定。
绑定默认数据类型
HttpServletRequest:通过request对象获取请求信息;
HttpServletResponse:通过response处理响应信息;
HttpSession:通过session对象得到session中存放的对象;
Model/ModelMap:Model是一个接口,ModelMap是一个接口实现,作用是将model数据填充到request域。
1.简单数据绑定:基本数据类型绑定、pojo类绑定、pojo多对象数据绑定、自定义转换器或格式化(待定)
1.1基本数据类型绑定(例如int、String、Double等类型)
前端<input name=”id” value=”1”/> or url:http://taobao.com/selectUser?id=1
@RequestMapping("/selectUser")
public String selectUser(Integer id) {.....}
或者<input name=”user_id” value=”1” /> or url:http://taobao.com/selectUser?user_id=1
@RequestMapping("/selectUser")
public String selectUser(@RequestParam(value="user_id")Integer id) {.....}
1.2 pojo类绑定(针对多类型、多参数的请求,可以使用POJO类型进行数据绑定)
前端<form action="${pageContext.request.contextPath }/registerUser" method="post">
<input type="text" name="username" />
<input type="text" name="password" /></form>
@Getter
@Setter
Public class User(){
Private String username;
Private String password;
}
@RequestMapping("/registerUser")
public String registerUser(User user) {
String username = user.getUsername();
Integer password = user.getPassword();
}
1.3 pojo多对象数据绑定(前端信息包含两个对象的数据,如张三个人信息,和父亲的信息)
前端 <form action="${pageContext.request.contextPath }/putInformation" method="post">
<input type="text" name="userName" />
<input type="text" name="userAge" />
<input type="text" name="father.userName" />
<input type="text" name="father.userAge" />
@Setter
@Getter
Public class User(){
Private String userName;
Private Integer userAge;
Private User father;
}
@RequestMapping("/putInformation")
public String registerUser(User user) {
String username = user.getUserName();
Integer userage= user.getUserAge();
User father = user.getFather;
}
2复杂数据绑定:数组的绑定、集合的绑定
2.1 数组的绑定(前端请求需要传递到后台多个相同名称参数的情况,同种类型的请求参数封装到一个数组中,后台就可以进行绑定接收了,如多个用户的id)
前端
<form action="${pageContext.request.contextPath }/deleteUsers" method="post">
<table>
<tr><td>选择</td><td>用户名</td></tr>
<tr><td><input name="ids" value="1" type="checkbox"></td><td>tom</td></tr>
<tr><td><input name="ids" value="2" type="checkbox"></td><td>jack</td></tr>
<tr><td><input name="ids" value="3" type="checkbox"></td><td>lucy</td></tr>
</table>
</form>
@RequestMapping("/deleteUsers")
public String deleteUsers(Integer[] ids) {
if(ids !=null){
for (Integer id : ids) {System.out.println("删除了id为"+id+"的用户!");} }else{System.out.println("ids=null");}
}
2.2 集合的绑定(数组的绑定是针对前端传递的是同一参数名下的同一类型数据,而集合绑定的是多个同一对象的数据,如多个用户的信息,包含了id、name等)
前端
<form action="${pageContext.request.contextPath }/editUsers" method="post">
<table>
<tr><td>选择</td><td>用户名</td></tr>
<tr><td><input name="users[0].id" value="1" type="checkbox" /></td>
<td><input name="users[0].username" value="tome" type="text" /></td></tr>
<tr><td><input name="users[1].id" value="2" type="checkbox" /></td>
<td><input name="users[1].username" value="jack" type="text" /></td></tr>
</table><input type="submit" value="修改" />
</form>
@Getter
@Setter
public class UserVO {
private List<User> users;
}
@Getter
@Setter
public class User {
private Integer id;
Private String username;
}
@RequestMapping("/editUsers")
public String editUsers(UserVO users) {
for (User user : users) {
if(user.getId() !=null){
System.out.println("修改了id为"+user.getId()+"的用户名为:"+user.getUsername());}}
}
3 json数据绑定(先创建json对应的java对象,包含可能的数据类型和对象)
Json数据格式
对象结构:
例如:一个address对象包含城市、街道、邮编等信息,使用JSON的表示形式如下:
{"city":"Beijing","street":"Xisanqi","postcode":100096}
数组结构:
例如: ["abc",12345,false,null]
组合形式:
{
"name": "zhangsan"
"hobby":["篮球","羽毛球","游泳"]
"address":{
"city":"Beijing"
"street":"Xisanqi"
"postcode":100096
}
}
使用如下2两种注释实现绑定
@requestBody 放在类方法入参位置,表示通过json数据格式接收前端传递的数据,并自动转为java对象
@responseBody 放在类方法前,表示返回json格式的数据给前端,java对象会自动转为json数据格式
客服端contentType=application/json表示发送的是json数据,使用@requestBody 注释接收
客服端默认contentType=application/x-www-for m-urlen 表示发送的是key/value的数据,不需要使用@requestBody
Example:
前端(使用Ajax实现把前端数据封装成json格式,并发送给后端)
<input type="button" οnclick="saveFriend()" value="保存friend" />
<script type="text/javascript">/**
* 保存朋友
*/function saveFriend(){
var friends = new Array();
var o1 = {
"family": "大宅门",
"otherName": "lisi",
"desc": "亲密无间的好朋友"
}
var o2 = {
"family": "军大院",
"otherName": "wangwu",
"desc": "关系一般"
}
friends.push(o1);
friends.push(o2);
//要发送的参数
var params = {
"id": 1,
"name": "zhangsan",
"age": 10,
"friends":friends
};
$.ajax({
type: 'post',
url: '${pageContext.request.contextPath }/saveStudent',
contentType:'application/json;charset=utf-8',
dataType: 'json',
/**
* 前端可传输json数据格式,也可把json数据包装成一个字符串传输,在后端使用fastjson类的方法把字符串转换为java对象。
*/
data: JSON.stringify(params),
success: function(data){
console.log(data);
}
});
}</script>
@RequestMapping("/saveStudent")
@ResponseBody
public void saveStudent(@RequestBody StudendAndFriend studendAndFriend){}
后端包装类
public class StudendAndFriend {
private int id;
private String name;
private int age;
private List<Friend> friends;
}
public class Friend {
private String family;
private String otherName;
private String desc;
}
4 restful风格
4.1 url的restful风格(前端控制器需进行rest配置,以保证能对user/{id}这种地址进行处理)
Example:
@RequestMapping("/user/{id}")
public void saveStudent(@PathVariable(“id”) Integer id){}
4.2请求方法的restful风格(同一个url根据请求方法的不同,如get、post、delete等实现不同的接收处理)
Example:
Public class UserEdit(){
@GetMapping("/user")
public void getStudent(){A方案处理}
@PostMapping("/user")
public void saveStudent(){B方案处理}
}