Spring技术内幕笔记(2):Spring MVC 与 Web

Spring MVC 与 Web

IoC容器与Web容器的关系

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的功能

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返回。对象

DispatchServlet处理请求的过程

当请求到来,从全部的HandleMapping中依次查找到匹配的HandlerExecutionChain,多个HandleMapping是按照优先级排序的。排序

HandlerExecutionChain得到后,先对请求执行intercepter的preHandler,而后执行handler,最后再次执行intercepter的postHandler,获得最终的ModelAndView对象。事件

最后根据ModelAndView渲染视图并返回。

ModelAndView呈现给客户端的过程

以JSP视图为例。

Step1:ModelAndView得到后,会从中获取其对应的View,也就是根据ModelAndView指明的名称得到对应View的Bean。

Step2:View接着将数据进行合并,而后将数据放入requst中进行暴露。

Step3:根据请求,获取URL路径,定位资源。如JSP文件。

Step4:将包含数据的requst转发到目标资源路径,由web容器负责获取资源,而且将数据装入JSP。最后将拼装好的文件返回。

相关文章
相关标签/搜索