spring-mvc源码阅读(一)servlet
来源:互联网 发布:网络电视内容提供商 编辑:程序博客网 时间:2024/05/18 01:04
在servlet容器中当一个请求到来的时候servlet容器会把请求分配给servlet进行处理,我们知道spring-mvc是通过DispatcherServlet来处理请求,DispatcherServlet的类图如下
通过这个图片可以看到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找到对应的adaptermappedHandler.applyPreHandle(processedRequest, response)//执行HandlerInterceptor的preHandlemv = ha.handle(processedRequest, response, mappedHandler.getHandler());//生成ModelAndViewapplyDefaultViewName(request, mv);//如果生成的ModelAndView为空,设置默认的ModelAndViewmappedHandler.applyPostHandle(processedRequest, response, mv);//执行HandlerInterceptor的postHandleprocessDispatchResult(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-mvc源码阅读(一)servlet
- spring-mvc源码阅读(三)RequestMappingHandlerMapping
- Spring MVC 源码阅读笔记
- Spring源码阅读(八)—SpringMVC基础Servlet
- spring mvc 源码研读(一)
- Spring 源码阅读 AOP一
- Spring MVC源码分析—Servlet解析
- spring-mvc源码阅读(二)<mvc:annotation-driven/>做了什么
- 源码阅读(一)
- 源码阅读(一)
- Spring源码阅读(一):IOC容器的初始化
- spring源码阅读之Bean的加载(一)
- Spring源码阅读(一)——整体结构
- Tiny-Spring源码阅读(一)IOC的理解
- Spring源码阅读一——IOC
- Spring 源码阅读一 环境搭建
- Spring源码阅读之-BeanFactory(一)
- Spring 源码阅读(1)
- Documentation/sound/oss/Soundblaster
- 条件表达式
- make Image uImage与zImage的区别
- 求百米运动员的平均速度
- poj 3267 最少需要删除多少个多余字符来匹配字典中的单词
- spring-mvc源码阅读(一)servlet
- sql表中行复制
- 关于四舍五入
- mac 下设置网卡
- linux 无线网卡驱动
- 内核编译(make)
- 说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
- SDN无层网络与TCP/IP分层网络
- 排序算法的时间复杂度和空间复杂度