1、问题:
根据restful风格URI的规则,在执行修改操作时,使用PUT请求,但是,如果使用Ajax直接发送PUT请求,会拿不到请求体中的数据。
2、原因:
tomcat:
1)将请求体中的数据封装成一个map对象;
2)request.getParameter("empName")
就会从这个map中取值; 3)
SpringMVC封装POJO对象的时候,会把POJO中每个属性的值,request.getParameter("empName");
3、 AJAX发送PUT请求引发的血案:
PUT请求:请求体中的数据,采用request.getParameter(“empName”)的方式拿不到。tomcat一看是PUT请求不会封装请求体中的数据为map,只有POST形式的请求才封装请求体为map。
tomcat源码:
org.apache.catalina.connector.Request--parseParameters() (3111多行)
protected String parseBodyMethods = "POST";
if ( !getConnector().isParseBodyMethod(getMethod())){
success = true;
return;
}
……
源码解读:使用getConnector()方法获得一个连接对象。只有POST请求才会执行后续的方法,如果不是POST请求,则会进入if语句当中,return结束!
4、解决方案
方案1:
web.xml:
<!--使用rest风格请求:将普通的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>
index.jsp: 在data后面添加&_method=PUT
$.ajax( {
url:"${PATH}/employee/"+$(this).attr("edit-id"),
type:"POST",
data:$("#emp_update_model form").serialize()+"&_method=PUT",
success:function (result) {
alert(result.msg);
}
});
方案2:
在web.xml中配置HttpPutFormContentFilter。
<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>
作用:1) 将请求体中的数据解析包装成一个map;
2) 重新包装request请求:request.getParameter()被重写,就会从自己封装的map中取数据。