目录

前端传参了但是到了后端为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行左右的代码,有这样的一段代码.

https://www.jianshu.com/p/49e18046e2b4

image.png

有如下代码:

https://www.jianshu.com/p/49e18046e2b4

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”即可