springmvc原理-POJO对象是如何赋值的及PUT请求如何赋值

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 里面的方法。