springMvc运行机制

1、 html

spring的启动过程:前端

1.首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境;web

2.其 次,在web.xml中会提供有contextLoaderListener。在web容器启动时,会触发容器初始化事件,此时 contextLoaderListener会监听到这个事件,其contextInitialized方法会被调用,在这个方法中,spring会初始 化一个启动上下文,这个上下文被称为根上下文,即WebApplicationContext,这是一个接口类,确切的说,其实际的实现类是 XmlWebApplicationContext。这个就是spring的IoC容器,其对应的Bean定义的配置由web.xml中的 context-param标签指定。在这个IoC容器初始化完毕后,spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,将其存储到ServletContext中,便于获取;spring

3.再 次,contextLoaderListener监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这里是DispatcherServlet,这个servlet其实是一个标准的前端控制器,用以转发、匹配、处理每一个servlet请 求。DispatcherServlet上下文在初始化的时候会创建本身的IoC上下文,用以持有spring mvc相关的bean。在创建DispatcherServlet本身的IoC上下文时,会利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE 先从ServletContext中获取以前的根上下文(即WebApplicationContext)做为本身上下文的parent上下文。有了这个 parent上下文以后,再初始化本身持有的上下文。这个DispatcherServlet初始化本身上下文的工做在其initStrategies方 法中能够看到,大概的工做就是初始化处理器映射、视图解析等。这个servlet本身持有的上下文默认实现类也是 mlWebApplicationContext。初始化完毕后,spring以与servlet的名字相关(此处不是简单的以servlet名为 Key,而是经过一些转换,具体可自行查看源码)的属性为属性Key,也将其存到ServletContext中,以便后续使用。这样每一个servlet 就持有本身的上下文,即拥有本身独立的bean空间,同时各个servlet共享相同的bean,即根上下文(第2步中初始化的上下文)定义的那些 bean。mvc

 

 

2、DispatcherServlet 处理流程app

在整个 Spring MVC 框架中,DispatcherServlet 处于核心位置,它负责协调和组织不一样组件完成请求处理并返回响应工做。在看 DispatcherServlet 类以前,咱们先来看一下请求处理的大体流程:框架

  1. Tomcat 启动,对 DispatcherServlet 进行实例化,而后调用它的 init() 方法进行初始化,在这个初始化过程当中完成了:
  2. 对 web.xml 中初始化参数的加载;创建 WebApplicationContext (SpringMVC的IOC容器);进行组件的初始化;
  3. 客户端发出请求,由 Tomcat 接收到这个请求,若是匹配 DispatcherServlet 在 web.xml 中配置的映射路径,Tomcat 就将请求转交给 DispatcherServlet 处理;
  4. DispatcherServlet 从容器中取出全部 HandlerMapping 实例(每一个实例对应一个 HandlerMapping 接口的实现类)并遍历,每一个 HandlerMapping 会根据请求信息,经过本身实现类中的方式去找处处理该请求的 Handler (执行程序,如Controller中的方法),而且将这个 Handler 与一堆 HandlerInterceptor (拦截器) 封装成一个 HandlerExecutionChain 对象,一旦有一个 HandlerMapping 能够找到 Handler 则退出循环;(详情能够看 [Java]SpringMVC工做原理之二:HandlerMapping和HandlerAdpater 这篇文章)
  5. DispatcherServlet 取出 HandlerAdapter 组件,根据已经找到的 Handler,再从全部 HandlerAdapter 中找到能够处理该 Handler 的 HandlerAdapter 对象;
  6. 执行 HandlerExecutionChain 中全部拦截器的 preHandler() 方法,而后再利用 HandlerAdapter 执行 Handler ,执行完成获得 ModelAndView,再依次调用拦截器的 postHandler() 方法;
  7. 利用 ViewResolver 将 ModelAndView 或是 Exception(可解析成 ModelAndView)解析成 View,而后 View 会调用 render() 方法再根据 ModelAndView 中的数据渲染出页面;
  8. 最后再依次调用拦截器的 afterCompletion() 方法,这一次请求就结束了

http://www.cnblogs.com/tengyunhao/p/7518481.htmlpost

相关文章
相关标签/搜索