Spring MVC

關於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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章