SpringMVC封装POJO对象的时候,会调用request.getParamter(“属性名”) 并赋值给 POJO中每个属性。
在Tomcat 服务器中:
如果是POST请求:
1、会将请求体中的数据,封装一个map。
2、request.getParameter(“empName”)就会从这个map中取值。
3、SpringMVC封装POJO对象的时候,会调用request.getParamter(“属性名”) 并赋值给 POJO中每个属性。
如果是PUT请求:
Tomcat一看是PUT不会封装请求体中的数据为map,只有POST形式的请求才封装请求体为map
所以请求体中的数据,request.getParameter(“empName”)拿不到。
下面是Tomcat源代码的处理逻辑,只有post请求,才能封装请求体为map对象。
* org.apache.catalina.connector.Request(类名)--parseParameters(方法名) (3111行); * * protected String parseBodyMethods = "POST"; * if( !getConnector().isParseBodyMethod(getMethod()) ) { success = true; return; } *
put传递数据解决方案
我们要能支持直接发送PUT之类的请求还要封装请求体中的数据
1、配置上HttpPutFormContentFilter;
2、他的作用;将请求体中的数据解析包装成一个map。
3、request被重新包装,request.getParameter()被重写,就会从自己封装的map中取数据
在web.xml中配置过滤器,
<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>
大致的原理就是:
HttpServletRequest
本来就是 一个接口,在之前的接口实现类中,我们又添加了HttpPutFormContentFilter
对象,并重写了 之前接口实现类的getParameter
方法,该方法内部调用的是 HttpPutFormContentFilter
里面的方法。