tomcat启动,DispatcherServlet初始化时调用initMultipartResolver方法初始化用户自己注入的MultipartResolver,springmvc并没有注入默认的Multipart解析器,用户未注入时,默认Multipart解析器则则为空。因此,当我们需要使用multipart/form-data方式向服务端传参时我们需要自已手动注入自己需要的MultipartResolver,一般我们用org.springframework.web.multipart.commons.CommonsMultipartResolver,使用如下方式注入:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="104857600"/>
<property name="maxInMemorySize" value="4096"/>
</bean>
可能是因为org.springframework.web.multipart.commons.CommonsMultipartResolver需要Apache Commons的 FileUpload文件上传包和Servlet 3支持的原因,所以spring-mvc并没有默认注入CommonsMultipartResolver为Multipart解析器。
DispatcherServlet接收客户端请求后在DispatcherServlet的doDispatch方法会调用checkMultipart(HttpServletRequest request)方法去检查处理请求。
如果请求方式是以"multipart/"开头的并且存在Multipart解析器时,
1.判断请求是否已经为MultipartHttpServletRequest类型对象,如果是直接返回原本的HttpServletRequest请求对象。
2.判断请求是否有Multipart解析异常,如果有则打印debug级日志"Multipart resolution previously failed for current request - skipping re-resolution for undisturbed error rendering",返回原本的HttpServletRequest请求对象。
3.不是以上两种情况时,直接用Multipart解析器去解析请求,将请求处理为MultipartHttpServletRequest对象。
如果不满足请求方式是以"multipart/"开头并且存在Multipart解析器两个条件,checkMultipart将直接返回原本的HttpServletRequest请求对象。
Multipart解析器的事情就做完了。