關於WebMvc的配置
1.最暴力的配置方法就是直接繼承WebMvcConfigurationSupport
2.比較溫柔的做法就是使用註解@EnableWebMvc
這個註解是引入了DelegatingWebMvcConfiguration這樣一個代理配置類,它繼承了WebMvcConfigurationSupport,
然後通過注入WebMvcConfigurer來進行配置,所以,只要往容器裏裝入WebMvcConfigurer的自定義類就可以了。
3.自動配置類WebMvcAutoConfiguration裏已經引入了WebMvcAutoConfigurationAdapter,也就是WebMvcConfigurer子類,
同樣引入了EnableWebMvcConfiguration,是DelegatingWebMvcConfiguration子類,所以連註解@EnableWebMvc也不需要了。
注意:由於自動配置類WebMvcAutoConfiguration的引入條件是@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
所以,使用了上面1或者2時,是不會自動配置的,這樣也就失去了自動配置類做的配置。
由此可見,儘量使用第3種方法,優先使用application.properties來配置,不夠的地方,添加WebMvcConfigurer子類配置,
只有實在無法滿足要求時才使用2甚至1的方法。
實際上Spring的基本調用也比較簡單:
1.通過xml或者註解,創建各種HandlerMapping,這些類的目的就是創建從path到Handler的mapping。
HandlerMapping的唯一一個方法就是getHandler
2.便利各個HandlerMapping,找到Handler後,再遍歷各個HandlerAdapter,看看有誰能接受這個Handler。
HandlerAdapter的兩個主要方法
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
3.有了ModelAndView後,就可以渲染出頁面了
①HandlerMapping
BeanNameUrlHandlerMapping
SimpleUrlHandlerMapping//例:/static,/public
RequestMappingHandlerMapping
②HandlerAdapter
Servlet->SimpleServletHandlerAdapter
HttpRequestHandler->HttpRequestHandlerAdapter//例:ResourceHttpRequestHandler
Controller->SimpleControllerHandlerAdapter
HandlerMethod->RequestMappingHandlerAdapter
③HandlerMethodArgumentResolver
// Annotation-based argument resolution
@RequestParam->RequestParamMethodArgumentResolver
RequestParamMapMethodArgumentResolver
@PathVariable->PathVariableMethodArgumentResolver
PathVariableMapMethodArgumentResolver
@MatrixVariable->MatrixVariableMethodArgumentResolver
MatrixVariableMapMethodArgumentResolver
@ModelAttribute->ServletModelAttributeMethodProcessor
@RequestBody->RequestResponseBodyMethodProcessor
@RequestPart->RequestPartMethodArgumentResolver
@RequestHeader->RequestHeaderMethodArgumentResolver
RequestHeaderMapMethodArgumentResolver
@CookieValue->ServletCookieValueMethodArgumentResolver
@Value->ExpressionValueMethodArgumentResolver
@SessionAttribute->SessionAttributeMethodArgumentResolver
@RequestAttribute->RequestAttributeMethodArgumentResolver
// Type-based argument resolution
WebRequest
ServletRequest
MultipartRequest
HttpSession
Principal
Locale
TimeZone
"java.time.ZoneId"
InputStream
Reader
HttpMethod->ServletRequestMethodArgumentResolver
ServletResponse
OutputStream
Writer->ServletResponseMethodArgumentResolver
HttpEntity
RequestEntity->HttpEntityMethodProcessor
RedirectAttributes->RedirectAttributesMethodArgumentResolver
Model->ModelMethodProcessor
Map->MapMethodProcessor
Errors->ErrorsMethodArgumentResolver
SessionStatus->SessionStatusMethodArgumentResolver
UriComponentsBuilder
ServletUriComponentsBuilder->UriComponentsBuilderMethodArgumentResolver
④HandlerMethodReturnValueHandler
ModelAndView->ModelAndViewMethodReturnValueHandler
Model->ModelMethodProcessor
View->ViewMethodReturnValueHandler
StreamingResponseBody
ResponseEntity->StreamingResponseBodyReturnValueHandler
HttpEntity(not RequestEntity)->HttpEntityMethodProcessor
HttpHeaders->HttpHeadersReturnValueHandler
@ModelAttribute->ModelAttributeMethodProcessor
@ResponseBody->RequestResponseBodyMethodProcessor
void || CharSequence->ViewNameMethodReturnValueHandler
Map->MapMethodProcessor
ModelAttributeMethodProcessor