spring-mvc源码阅读(一)servlet
2013-10-27 16:49
363 查看
在servlet容器中当一个请求到来的时候servlet容器会把请求分配给servlet进行处理,我们知道spring-mvc是通过DispatcherServlet来处理请求,DispatcherServlet的类图如下
![](https://img-blog.csdn.net/20131027164835000?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjU4OTYwMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
通过这个图片可以看到DispatcherServlet继承FrameworkServlet
在配置DispatcherServlet的时候要配置contextConfigLocation地址用来加载spring的配置文件
这个配置文件的初始化工作就是在FrameworkServlet中完成的
通过initServletBean完成初始化工作,加载spring配置文件
加载完成spring的配置文件后会生成webApplicationContext
当context生成后会调用onRefresh方法,而这个方法是在DispatcherServlet中实现的
它会执行如下代码
这段代码中可以看到,会初始化Resolver、Mapping、Adapter等类
servlet完成了初始化工作后,当接收一个请求的时候会调用DispatcherServlet 中的doService方法
这个方法会往request里面先设置一些属性如下:
request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
然后会执行doDispatch方法
在doDispatch()中首先检查这个request是否是包含文件的上传
如果是则创建MultipartHttpServletRequest
如下代码
processedRequest = checkMultipart(request);
然后主要会依次执行下面的代码
根据上面的代码得到处理一个请求的主要步骤
1、根据request找到对应的HandlerExecutionChain
2、通过HandlerExecutionChain和request找到对应的HandlerAdapter
3、执行spring过滤器的preHandle
4、生成ModelAndView
5、设置默认的ModelAndView
6、执行spring过滤器的postHandle
7、根据ModelAndView进行渲染
通过这个图片可以看到DispatcherServlet继承FrameworkServlet
在配置DispatcherServlet的时候要配置contextConfigLocation地址用来加载spring的配置文件
这个配置文件的初始化工作就是在FrameworkServlet中完成的
通过initServletBean完成初始化工作,加载spring配置文件
加载完成spring的配置文件后会生成webApplicationContext
当context生成后会调用onRefresh方法,而这个方法是在DispatcherServlet中实现的
它会执行如下代码
protected void initStrategies(ApplicationContext context) { initMultipartResolver(context); initLocaleResolver(context); initThemeResolver(context); initHandlerMappings(context); initHandlerAdapters(context); initHandlerExceptionResolvers(context); initRequestToViewNameTranslator(context); initViewResolvers(context); initFlashMapManager(context); }
这段代码中可以看到,会初始化Resolver、Mapping、Adapter等类
servlet完成了初始化工作后,当接收一个请求的时候会调用DispatcherServlet 中的doService方法
这个方法会往request里面先设置一些属性如下:
request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
然后会执行doDispatch方法
在doDispatch()中首先检查这个request是否是包含文件的上传
如果是则创建MultipartHttpServletRequest
如下代码
processedRequest = checkMultipart(request);
然后主要会依次执行下面的代码
mappedHandler = getHandler(processedRequest, false);//根据request找到mappedHandler HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());//根据mappedHandler找到对应的adapter mappedHandler.applyPreHandle(processedRequest, response)//执行HandlerInterceptor的preHandle mv = ha.handle(processedRequest, response, mappedHandler.getHandler());//生成ModelAndView applyDefaultViewName(request, mv);//如果生成的ModelAndView为空,设置默认的ModelAndView mappedHandler.applyPostHandle(processedRequest, response, mv);//执行HandlerInterceptor的postHandle processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);//进行渲染
根据上面的代码得到处理一个请求的主要步骤
1、根据request找到对应的HandlerExecutionChain
2、通过HandlerExecutionChain和request找到对应的HandlerAdapter
3、执行spring过滤器的preHandle
4、生成ModelAndView
5、设置默认的ModelAndView
6、执行spring过滤器的postHandle
7、根据ModelAndView进行渲染
相关文章推荐
- Spring framework MVC源码阅读笔记(一)
- SpringMVC DispatcherServlet执行流程及源码分析
- Spring源码阅读(八)—SpringMVC基础Servlet
- spring-mvc源码阅读(二)<mvc:annotation-driven/>做了什么
- spring-mvc源码阅读(三)RequestMappingHandlerMapping
- 【Spring】Spring Session的简单搭建与源码阅读
- SpringMVC深度探险(1,2,3,4)Spring源码阅读:Spring MVC 初始化 - 螺 丝 钉 / DispatcherServlet的初始化主线
- Spring学习1:Spring源码阅读环境搭建
- Spring+SpringMvc+Mybatis框架集成搭建教程五(项目源码发布到GitHub)
- Spring源码阅读-开闭原则
- org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
- Spring源码阅读-ApplicationContext对BeanFactory的增强
- java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码
- Spring 源码阅读-Spring概述
- Spring源码阅读-- IOC容器资源解析
- Spring源码阅读——1
- SpringMVC+Maven开发最小“自然语言理解”项目攻略(附源码打包下载及详细说明)
- SpringMVC servlet.xml配置
- Spring源码阅读之IoC容器初始化3 -- BeanDefinition在IoC容器中的注册
- Spring 源码阅读之BeanFactory