前端传参了但是到了后端为null_解决前端Restful风格Put传递参数,后端为Null...
前端传参了但是到了后端为null_解决前端Restful风格(Put)传递参数,后端为Null…
出现问题的原因
这个问题其实是Tomcat的问题.
实际上,Tomcat把请求的数据(实体信息中的数据)封装成一个Map(键值对形式),request.getParameter(“”)就从map中取值,而SpringMVC会把每个属性的值调用getParameter方法封装,而Tomcat看到是PUT请求则不会封装请求数据到map,只有POST形式的请求才会封装到请求体。
为什么会出现这种情况呢?
实际上这是因为在设计Tomcat的时候就出现的问题.在Tomcat的源代码的Request.java类中,大约是3111行左右的代码,有这样的一段代码.
image.png
有如下代码:
image.png
这一段代码的作用是获取连接器,再判断请求的方法是否在规定的方法之中,如果存在,则继续,如果不存在,则直接返回,不进行数据的封装.与我们设置的方法比对的就是代码中的方法,这个方法是POST,所以我们的PUT方法和POST肯定是不一样的,最后只能是返回.于是就出现了上面的情况.
1、只能解决PUT
方案一
配置web.xml文件
HiddenHttpMethodFilter
org.springframework.web.filter.HiddenHttpMethodFilter
HiddenHttpMethodFilter
/*
在发送Ajax请求的时候,使用如下的格式:
$.ajax({
url: “${pageContext.request.contextPath}/emp/” + id,
type: “POST”,
data: $("#app form").serialize() +"&_method=PUT",
success: function (result) {
alert(“操作成功!”);
}
});
可以看到不同的地方,首先配置HiddenHttpMethodFilter,这个类可以把POST转换成对应的_method=?的?号中的内容,从而实现请求.当然每次写Ajax请求的时候,都需要协商method字段,便于解析.
方案二
方案二就比较简单了.只需要一个简单的web.xml的配置.
HttpPutFormContentFilter
org.springframework.web.filter.HttpPutFormContentFilter
HttpPutFormContentFilter
/*
$.ajax({
url: “${pageContext.request.contextPath}/emp/” + id,
type: “PUT”,
data: $("#app form").serialize(),
success: function (result) {
alert(“操作成功!”);
}
});
2、 支持PUT,DELETE请求
在web.xml中配置
HiddenHttpMethodFilter
org.springframework.web.filter.HiddenHttpMethodFilter
HiddenHttpMethodFilter
/*
原理是:在Aajx中发送post请求后,带_method参数,将其修改为PUT,或者DELETE请求
例子:JS代码中该为
$.ajax({
url:"${APP_PATH}/RecordController/record",
type:“POST”,
data:{id :id ,
_method:“PUT”},
success:function(result){
alert(“update success”);
}
});
或者在url中加&_method=”PUT”或者&_method=”DELETE”即可