在上一篇文章中我們分析了SpringMVC對簡單對象和@RequestParam注解的解析過程,這一章中我們繼續分析其他形式的參數解析過程。
下面來看一下我們的第一個請求:http://localhost:8086/allRequestFormat/requestAndResponseRequest?userName=zhangsan
對應的背景處理代碼是:
我們的請求處理方法中的兩個參數是HttpServletRequest和HttpServletResponse類型,那麼SpringMVC在調用requestAndResponseRequest這個方法的時候是怎麼解析到這兩個參數的值的呢?我們先看HttpServletRequest這個參數,這個參數是ServletRequestMethodArgumentResolver這個類來解析的。在上一篇文章中,我們知道通過調用argumentResolvers.supportsParameter這個方法來判斷HandlerMethodArgumentResolver的實作類是否支援對應的參數的解析,和resolveArgument方法來實作真正的參數解析。
是以我們先看一下ServletRequestMethodArgumentResolver這個類中的supportsParameter這個方法的内容:
從上面的代碼中我們可以看到如果參數類型為WebRequest類型、ServletRequest類型、MultipartRequest類型、HttpSession類型、Principal類型、InputStream類型、Reader類型或者HttpMethod類型、Locale類型、TimeZone類型、ZoneId類型則使用這個參數解析器進行參數的解析工作。
下面我們在看一下ServletRequestMethodArgumentResolver是怎麼進行參數解析工作的:
從上面的代碼中我們發現最主要的是NativeWebRequest這個對象,我們可以從這個對象中擷取到HttpServletRequest,從HttpServletRequest中擷取一系列的其他對象的值。我們可以看一下NativeWebRequest這個對象的值是怎麼建立的。在RequestMappingHandlerAdapter#invokeHandlerMethod中有這樣一段代碼:
在ServletWebRequest這個對象中持有request和response這兩個對象的引用。ServletWebRequest的UML類圖關系如下:

是以resolveArgument中的NativeWebRequest其實是ServletWebRequest這個對象。
上面分析完了HttpServletRequest,我們還有一個參數類型是HttpServletResponse,那麼這個HttpServletResponse這個參數是誰解析的呢?是ServletResponseMethodArgumentResolver來解析的。我們看一下它的supportsParameter方法的實作:
ServletResponseMethodArgumentResolver解析的參數類型是:ServletResponse類型、OutputStream類型和Writer類型。我們再看下一resolveArgument方法中對參數解析的實作:
這個參數的解析過程和ServletRequestMethodArgumentResolver中對象參數的解析過程如出一轍。我們對HttpServletRequest和HttpServletResponse參數的解析就先到這裡了。