项目场景:
Restful使用put和delete时data里面的参数传输无效问题描述:
当我们遵循Restful风格编写代码时,前端页面发送ajax请求时,使用type为put/delete时,后台是接收不到前台发送的数据
1. 前台代码:
$("#putOne").click(function () {
//更新数据
$.ajax({
type:"put",
url:"/team/"+$("#id").val(),
//若data没有数据,可以接收到参数
data:$("#form").serialize(),
dataType:"json",
success:function (data) {
alert(data);
}
})
});
2. 后台控制器
@RequestMapping(value = "/team/{id}",method = RequestMethod.PUT)
@ResponseBody
public String update(@PathVariable("id") int id, Team team){
System.out.println(team);
for (Team team1:list) {
if(team1.getId() == id){
team1.setName(team.getName());
team1.setLocation(team.getLocation());
return "200";
}
}
return "500";
}
看debug结果,当前台发送数据时,我们明显的看到team中的三组数据都为null
原因分析:
Tomcat封装请求参数的过程:
1.将请求体中的数据,封装成一个map
2.request.getParameter(key)会从这个map中取值
3.SpringMvc封装POJO对象的时候,会把POJO中每个属性的值进行request.getParamter();
AJAX发送PU或者DELETE请求时,请求体中的数据通过request.getParamter()拿不到。
Tomcat一检测到是PUT或者DELETE就不会封装请求体中的数据为map,只有POST形式的请求才封装请求为
map。
解决方案:
2. web.xml配置过滤器
<!-- 使用Rest风格的URI 将页面普通的post请求转为指定的delete或者put请求
原理:在Aajx中发送post请求后,带_method参数,将其修改为PUT,或者DELETE请求-->
<filter>
<filter-name>httpMethodFilter</filter-name>
<filter-class>
org.springframework.web.filter.HiddenHttpMethodFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>httpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 再次测试
1. 前台代码
$("#putOne").click(function () {
$.ajax({
type:"POST",
url:"/team/"+$("#id").val(),
data:$("#form").serialize()+"&_method=put",
dataType:"json",
success:function (data) {
alert(data);
}
})
});
2. 控制器代码
@RequestMapping(value = "/team/{id}",method = RequestMethod.PUT)
@ResponseBody
public String update(@PathVariable("id") int id, Team team){
System.out.println(team);
for (Team team1:list) {
if(team1.getId() == id){
team1.setName(team.getName());
team1.setLocation(team.getLocation());
return "200";
}
}
return "500";
}
- debug结果