1. 情况描述:使用 $.aiax({}); 发送delete和put请求时,springmvc获取到的请求参数一直为null。
2.后台代码如下,可正常接受POST请求参数。
@RequestMapping(value="/Database/{id}",method=RequestMethod.DELETE)
@ResponseBody
public String deleteDatabase(@PathVariable(name="id",required=true)Integer id,
@RequestParam(value="name",required=false) String name,
@RequestParam(value="age",required=false) Integer age
) {
System.out.println(id+"--"+name+"--"+age);
String result = "0";
return result;
}
$.ajax({
url : "${ctp}/DatabaseOperate/Database/"+node.id,
type : "delete",
data : {"name":"mercy","age":22},
dataType : "json",
success : function(data){
console.log(data);
}
});
在上述代码情况下,id可以正常获取到,但name和age一直是null。用chrome监听请求,请求方式确实是DELETE,也携带了请求参数(Form Data形式),但后台获取的name和age就是null。
4. 原因:当在$.aiax({});直接设置type为delete或put时,请求会到达springmvc控制器,但是无法获取传过来的参数。
解决方式:将post请求转换为delete或put请求,这样后台就可以正常获取到传过来的请求参数。
① 在web.xml配置文件中添加一个将post请求转换为delete或put请求的filter:
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>springDispatcherServlet</servlet-name>
</filter-mapping>
注意:servlet-name中的值必须时springmvc的对应的servlet名称
② AJAX请求参数中必须带上如下键值对:_method=delete/put
data : {"_method":"delete","name":"mercy","age":22}
③ AJAX请求类型必须是POST
type : "post"
$.ajax({
url : "${ctp}/DatabaseOperate/Database/"+node.id,
type : "post",
data : {"_method":"delete","name":"mercy","age":22},
dataType : "json",
success : function(data){
console.log(data);
layer.msg("删除成功!");
}
});