SpringMVC的九大组件:
1.文件上传解析器:private MultipartResolver multipartResolver
2.国际化解析器:private LocalResolver localResolver
3.主题解析器:private ThemeResolver themeResolver
4.Hanlder映射信息:private List<HandlerMapping> handlermappings
5.Handler适配器:private List<HandlerAdapter> handlerAdapters
6.异常解析器:private List<HandlerExceptionResolver> handlerExceptionResolvers
7.重定向解析器:private RequestToViewNameTranslator viewNameTranslator;
8.flash解析器:private FlashMapManager flashMapManager
9.视图解析器:private List<ViewResolver> viewResolversweb
SpringMVC的全部工做都是依赖以上解析器完成的,而且这些解析器都是接口,开发人员能够经过实现这些接口,配置本身的解析器。便于开发人员进行功能拓展.spring
组件初始化:服务器
protected void initStrategies(ApplicationContext context) { initMultipartResolver(context); initLocaleResolver(context); initThemeResolver(context); initHandlerMappings(context); initHandlerAdapters(context); initHandlerExceptionResolvers(context); initRequestToViewNameTranslator(context); initViewResolvers(context); initFlashMapManager(context); }
1.请求发出后,SpringMvc先验证请求是否为静态资源,若是为静态资源就交给web服务器去处理,若是不是就提交给DispatcherServlet,DispatcherServlet最后经过doDispatch()方法处理请求。
2.doDispatch先检查文件是否为上传文件请求。
3.根据HandlerMapping的映射信息找处处理器(Controller)类和拦截器类。
4.若是没找处处理器就抛出404异常,若是找处处理器类就拿到这个类的全部适配器HandleAdapter(执行方法)。
5.拦截器的preHandle方法执行。
6.适配器执行目标方法,返回一个ModelAndView。mvc
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
7.拦截器的postHandle方法执行。
8.若是出现异常则调用异常处理器处理异常不然就是用render()渲染页面。
9.拦截器afterCompletion()方法执行。app
从图中能够看出Spring MVC遍历了全部的HandlerMapping,在DefaultAnnoationHandlerMapping中的handlerMap寻找到了和请求地址对应的处理器。
注意:在SpringMVC配置文件中使用<mvc:default-servlet-handler/>时,会发现'DefaultAnnoationHandlerMapping'没有了变成'SimpleSimpleUrlHandlerMapping'了,那是由于<mvc:default-servlet-handler/>的做用。此时的项目是不能处理请求的只能访问静态资源,由于SimpleSimpleUrlHandlerMapping默认把请求都交给Tomcat处理。此时就要加入<mvc:annotation-driven/>,<mvc:annotation-driven/>会加入了一个RequestMappingHandlerMapping负责处理请求。所以<mvc:annotation-driven/>和<mvc:default-servlet-handler/>必须一块儿使用才行!!post
同获取处理器的方法相似,Spring MVC遍历全部HanlderAdapter,最后获取到AnnoationMethodHandlerAdapter。
注意:<mvc:default-servlet-handler/>和<mvc:annotation-driven/>一样会影响Adapter,AnnotationMethodHandlerAdapter会被换成RequestMappingHandlerAdapter;this
mv = ha.handle(processedRequest, response, mappedHandler.getHandler())中最重要的就是最后的一句spa
return this.invokeHandlerMethod(request, response, handler);
在invokeHandlerMethod方法中,spring MVC会找到全部@ModelAttribute方法,并提早运行这些方法,而后把这些方法的返回值放入隐含模型中,而后再执行目标方法.code