SpringMVC九大组件
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> viewResolvers
SpringMVC的所有工作都是依赖以上解析器完成的,并且这些解析器都是接口,开发人员可以通过实现这些接口,配置自己的解析器。便于开发人员进行功能拓展.
组件初始化:
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
SpringMVC执行步骤
1.请求发出后,SpringMvc先验证请求是否为静态资源,如果为静态资源就交给web服务器去处理,如果不是就提交给DispatcherServlet,DispatcherServlet最后通过doDispatch()方法处理请求。
2.doDispatch先检查文件是否为上传文件请求。
3.根据HandlerMapping的映射信息找到处理器(Controller)类和拦截器类。
4.如果没找到处理器就抛出404异常,如果找到处理器类就拿到这个类的所有适配器HandleAdapter(执行方法)。
5.拦截器的preHandle方法执行。
6.适配器执行目标方法。
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//此处返回的mv是一个ModelAndView对象
7.拦截器的postHandle方法执行。
8.进入processDispatchResult方法
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException)
//此处开始渲染界面
9.拦截器afterCompletion()方法执行。
如何获取处理器getHandler()细节
从图中可以看出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/>必须一起使用才行!!
如何获取处理器适配器getHandlerAdapter()细节
同获取处理器的方法类似,Spring MVC遍历所有HanlderAdapter,最后获取到AnnoationMethodHandlerAdapter。
注意:<mvc:default-servlet-handler/>和<mvc:annotation-driven/>同样会影响Adapter,AnnotationMethodHandlerAdapter会被换成RequestMappingHandlerAdapter;
preHandle()细节
如何执行目标方法 mv=ha.handle()细节
1.执行
mv = ha.handle(processedRequest, response, mappedHandler.getHandler())
2.再进入
3.进入了
return this.invokeHandlerMethod(request, response, handler);
此处的图片是没有标注<mvc:default-servlet-handler/>和<mvc:annotation-driven/>的情况下会进入的AnnotationMethodHandlerAdapter时的执行方法。
标注<mvc:default-servlet-handler/>和<mvc:annotation-driven/>后进入RequestMappingHandlerAdapter的执行方法。
mv=ha.handle()总结:在invokeHandlerMethod方法中,不管是AnnotationMethodHandlerAdapter还是RequestMappingHandlerAdapter都会最先找到所有标注了@ModelAttribute的方法,并提前运行这些方法,然后把这些方法的返回值放入隐含模型中或者包装起来,然后再执行目标方法,执行完方法以后最后会返回一个ModelAndView对象。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。