SpringMVC(二)AJAX发送PUTDELETE请求引发的血案:

it2022-05-05  139

解决Ajax中Restful风格PUT和DELETE请求传递参数无

问题:在Ajax中,采用Restful风格PUT和DELETE请求传递参数无效,传递到后台的参数值为null

原因: Tomcat会做: 1.将请求体中的数据,封装成一个map 2.request.getParameter(“id”)就会从这个map中取值 3.SpringMvc封装POJO对象的时候, 会进行request.getParamter()操作从map中获取值,然后把值封装到POJO中去。 AJAX发送PUT请求引发的血案: PUT请求,请求体中的数据,request.getParamter()拿不到 Tomcat一看是PUT请求,就不会把请求体中的key-value封装到map中,只有POST形式的请求会才封装到map中去。

解决方案: 解决方案 这个问题有两种解决方案,第一种比较复杂,第二种比较简单,正常我们肯定是使用第二种的,当然并不排除使用第一种方式的场景.

方案一 配置web.xml文件

<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>

在发送Ajax请求的时候,使用如下的格式: 可以看到不同的地方,首先配置HiddenHttpMethodFilter,这个类可以把POST转换成对应的_method=?的?号中的内容,从而实现请求.当然每次写Ajax请求的时候,都需要协商method字段,便于解析.

$.ajax({ url: "${pageContext.request.contextPath}/emp/" + id, type: "POST", /// data: $("#app form").serialize() +"&_method=PUT", success: function (result) { alert("操作成功!"); } });

方案二 方案二就比较简单了.只需要一个简单的web.xml的配置.

配置SpringMVC,把PUT或者DELETE请求转换成POST <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>

然后就可以很自然的使用Ajax请求而不需要做任何的处理.

$.ajax({ url: "${pageContext.request.contextPath}/emp/" + id, type: "PUT", data: $("#app form").serialize(), success: function (result) { alert("操作成功!"); } });

最新回复(0)