zoukankan      html  css  js  c++  java
  • Spring MVC源码解析(二)

     

     架构流程:

    1、  用户发送请求至前端控制器DispatcherServlet,

    2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。  处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

    3、  DispatcherServlet通过HandlerAdapter处理器适配器调用处理器,  执行处理器(Controller,也叫后端控制器), Controller执行完成返回ModelAndView,  HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

    4、  DispatcherServlet将ModelAndView传给ViewReslover视图解析器,  ViewReslover解析后返回具体View

    5、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

    6、 DispatcherServlet响应用户

    以下组件通常使用框架提供实现:

    1)  DispatcherServlet:前端控制器

    用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

    2)  HandlerMapping:处理器映射器

    HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

    HandlerMapping 负责根据request请求找到对应的Handler处理器及Interceptor拦截器,将它们封装在HandlerExecutionChain 对象中给前端控制器返回。

         RequestMappingHandlerMapping:注解式处理器映射器,对类中标记@ResquestMapping的方法进行映射,根据ResquestMapping定义的url匹配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装url对应的方法Method 

        BeanNameUrlHandlerMapping:处理器映射器,根据请求的urlspring容器中定义的beanname进行匹配,从而从spring容器中找到bean实例。

    <!-- bean名url处理器映射 默认-->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
            <property name="order" value="3"></property>
        </bean>

       SimpleUrlHandlerMapping:BeanNameUrlHandlerMapping的增强版本,它可以将url和处理器beanid进行统一映射配置。

        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
                    <prop key="/home.do">homeController</prop>
                    <prop key="/a.do">homeController</prop>
                    <prop key="/b.do">homeController</prop>
                    <prop key="/c.do">homeController</prop>
                </props>
            </property>
            <property name="order" value="2"></property>
        </bean>

     3) Handler:处理器

    Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。

    由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。 

    4)  HandlAdapter:处理器适配器

    通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

      SimpleControllerHandlerAdapter:简单控制器处理器适配器,所有实现了org.springframework.web.servlet.mvc.Controller 接口的Bean通过此适配器进行适配、执行。

      HttpRequestHandlerAdapterhttp请求处理器适配器,所有实现了org.springframework.web.HttpRequestHandler 接口的Bean通过此适配器进行适配、执行。

      RequestMappingHandlerAdapter:注解式处理器适配器,对标记@ResquestMapping的方法进行适配。 

    springmvc使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter

     5)View Resolver:视图解析器

    View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。

    处理器映射器,根据请求的urlspring容器中定义的beanname进行匹配,从而从spring容器中找到bean实例。

    处理流程源码分析

    • 用户发送请求到DispatherServlet前端控制器
    • DispatherServlet调用HandlerMapping(处理器映射器)根据url查找Handler,DispatcherServlet中的doDispatch中获取           
    • DispatherServlet调用HandlerAdapter(处理器适配器)对HandlerMapping找到Handler进行包装、执行。
    • DispatherServlet 找一个合适的适配器
    • HandlerAdapter执行Handler完成后,返回了一个ModleAndView(springmvc封装对象)

    • DispatherServlet拿着ModelAndView调用ViewResolver(视图解析器)进行视图解析,解析完成后返回一个View(很多不同视图类型的View)
    •  

    • 视图解析:

    •  

    • DispatcherServlet进行视图渲染,将Model中数据放到request域,在页面展示

    • AbstractView中的render

    • InternalResourceView->renderMergedOutputModel

    •  将model数据放在request域:AbstractView

       

  • 相关阅读:
    hdu 2222 Keywords Search
    Meet and Greet
    hdu 4673
    hdu 4768
    hdu 4747 Mex
    uva 1513 Movie collection
    uva 12299 RMQ with Shifts
    uva 11732 strcmp() Anyone?
    uva 1401
    hdu 1251 统计难题
  • 原文地址:https://www.cnblogs.com/fanBlog/p/9578525.html
Copyright © 2011-2022 走看看