解决springmvc获取ajax发送DELETE或PUT请求时参数为NULL的情况
我们都知道想要使用PUT请求和DELETE请求就要使用RESR风格,
在web.xml文件中配置HiddenHttpMethodFilter过滤器如下:
<!-- HiddenHttpMethodFilter过滤器可以将POST请求转化为put请求和delete请求! -->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
但是配置过滤器之后,仍旧不能和post一样正常使用put,
如果直接发送ajax=PUT形式的请求,前台有参数,但是controller接收请求的对象的属性参数都为null,也就是后台根本接受不到任何参数
问题:
请求体中有数据,但是后台接收不到任何数据
原因:
产生这个问题的原因和Tomcat有关
Tomcat处理参数的过程:
1.将请求体中的数据,封装成一个map
2.request.getParameter(“id”)就会从这个map中取值
3.SpringMvc封装POJO对象的时候, 会把POJO中每个属性的值进行request.getParamter();
4.AJAX发送PUT,DELETE请求引发的PUT,DELETE请求请求体中的数据,request.getParamter()拿不到
Tomcat一看是PUT,DELETE就不会封装请求体中的数据为map,默认只有POST形式的请求才封装请求为map。
解决方式一:
给POST请求带上“_method”参数:
date带上“_method=PUT”参数或者DELETE参数
$.ajax({
url:"${APP_PATH}/emp/"+$(this).attr("edit-id"),
type:"POST",
data:$("#empUpdateModal form").serialize()+"&_method=PUT",
success:function(result){
alert("success");
}
});
@RequestMapping(value="/emp/{empId}",method=RequestMethod.POST)
@ResponseBody
public Msg updateEmp(Employee employee){
employeeService.updateEmp(employee);
return Msg.success();
}
解决方式二:重点!!敲黑板!
虽然方法一可以使用,但是还有更方便的方法,可以直接使用PUT或DELETE请求:
将post请求转换为delete或put请求,这样后台就可以正常获取到传过来的请求参数。
在web.xml配置文件中添加一个将post请求转换为delete或put请求的filter:
<!--请求过滤器 ,使用Rest风格的URL,将页面普通的post请求转为指定的delete或put请求-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 解决PUT请求参数为NULL问题:可直接发PUT请求,避免后端接收不到数据 -->
<filter>
<filter-name>HttpPutFormContentFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpPutFormContentFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@RequestMapping(value="/emp/{empId}",method=RequestMethod.PUT)
@ResponseBody
public Msg updateEmp(Employee employee){
employeeService.updateEmp(employee);
return Msg.success();
}
上一篇: go get问题记录
下一篇: get请求