ServletContext为IoC容器提供了宿主环境。IoC容器经过ContexLoaderListener初始化创建,ContexLoaderListener是注册在Web容器中的监听器,当Web容器初始化时,监听器会收到该事件从而发起Spring容器的初始化。DispatchServlet是Spring MVC处理请求的转发器,从而响应HTTP的请求。web
ContexLoaderListener会调用ContextLoader,ContextLoader又会建立XmlWebApplicationContext,XmlWebApplicationContext做为默认的IoC容器,负责从默认的/WEB-INF/applicationContext.xml
中加载BeanDefinition。app
ContextLoader在建立IoC容器XmlWebApplicationContext后会将其注册入servletContext的属性ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
中。post
DispatchServlet负责两个工做,根据web.xml初始化本身的上下文,响应http请求。url
在ContextLoader加载完成后,开始DispatchServlet的初始化。首先从ServletContext中获取WebApplicationContext做为双亲上下文,这里就是XmlWebApplicationContext,因此XmlWebApplicationContext定义的Bean能够被DispatchServlet获取,在DispatchServlet中查找Bean时,会首先从双亲上下文中查找。获取双亲上下文后,DispatchServlet会建立本身的上下文,而且将其注册进ServletContext的属性中,属性名为该servlet相关的,由于一个Web容器能够有多个servlet。spa
DispatchServlet上下文的初始化后会开始建立一些请求处理策略,如LocalResolver、HandlerMappings等。例如,初始化HandlerMappings就是从IoC容器中获取全部的HandlerMapping相关的Bean。code
HandlerMapping是对HTTP请求到controller的映射,HandlerMapping根据请求获取一个HandlerExecutionChain,其中包含了一个handler和多个interceptor,interceptor负责功能的加强。xml
例如SimpleUrlHandlerMapping在初始化时会将url和对应handler的bean放入map中保存。当请求到达时,会从SimpleUrlHandlerMapping中查找最长匹配url的handler,包装成HandlerExecutionChain返回。对象
当请求到来,从全部的HandleMapping中依次查找到匹配的HandlerExecutionChain,多个HandleMapping是按照优先级排序的。排序
HandlerExecutionChain得到后,先对请求执行intercepter的preHandler,而后执行handler,最后再次执行intercepter的postHandler,获得最终的ModelAndView对象。事件
最后根据ModelAndView渲染视图并返回。
以JSP视图为例。
Step1:ModelAndView得到后,会从中获取其对应的View,也就是根据ModelAndView指明的名称得到对应View的Bean。
Step2:View接着将数据进行合并,而后将数据放入requst中进行暴露。
Step3:根据请求,获取URL路径,定位资源。如JSP文件。
Step4:将包含数据的requst转发到目标资源路径,由web容器负责获取资源,而且将数据装入JSP。最后将拼装好的文件返回。