https://www.cnblogs.com/roobtyan/p/9576685.html
原因:
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。
解決方案
這個問題有兩種解決方案,第一種比較復雜,第二種比較簡單,正常我們肯定是使用第二種的,當然並不排除使用第一種方式的場景.
方案一
- 配置web.xml文件
- 將POST請求轉發為put/delete請求
<!--使用Rest風格的URI--> <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請求的時候,使用如下的格式:
$.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的配置.
<!--配置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 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>
然后就可以很自然的使用Ajax請求而不需要做任何的處理.
$.ajax({ url: "${pageContext.request.contextPath}/emp/" + id, type: "PUT", data: $("#app form").serialize(), success: function (result) { alert("操作成功!"); } });