SpringMVC执行流程

SpringMVC执行流程

  • 具体步骤

    Ø 第一步:发起请求到前端控制器(DispatcherServlet)

    Ø 第二步:前端控制器请求HandlerMapping查找 Handler

    Ø 第三步:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略

    Ø 第四步:前端控制器调用处理器适配器去执行Handler

    Ø 第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler

    Ø 第六步:Handler执行完成给适配器返回ModelAndView

    Ø 第七步:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)

    Ø 第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可

    Ø 第九步:视图解析器向前端控制器返回View

    Ø 第十步:前端控制器进行视图渲染 (将数据(在ModelAndView对象中)填充到request域)

    Ø 第十一步:前端控制器向用户响应结果

springmvc组件

DispatcherServlet前端控制器

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

HandlerMapping处理器映射器

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

Handler处理器

它就是我们开发中要编写的具体业务控制器。由DispatcherServlet 把用户请求转发到 Handler。由Handler对具体的用户请求进行处理。

HandlAdapter处理器适配器

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

适配器对应的处理器以及这些处理器的作用:

  1. AnnotationMethodHandlerAdapter 主要是适配注解类处理器,注解类处理器就是我们经常使用的 @Controller 的这类处理器

  2. HttpRequestHandlerAdapter 主要是适配静态资源处理器,静态资源处理器就是实现了 HttpRequestHandler 接口的处理器,这类处理器的作用是处理通过 SpringMVC 来访问的静态资源的请求

  3. SimpleControllerHandlerAdapter 是 Controller 处理适配器,适配实现了 Controller 接口或 Controller 接口子类的处理器,比如我们经常自己写的 Controller 来继承 MultiActionController.

  4. SimpleServletHandlerAdapter 是 Servlet 处理适配器, 适配实现了 Servlet 接口Servlet 的子类的处理器,我们不仅可以在 web.xml 里面配置 Servlet,其实也可以用 SpringMVC 来配置 Servlet,不过这个适配器很少用到,而且 SpringMVC 默认的适配器没有他,默认的是前面的三种。

View Resolver视图解析器

ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象返回给DispatcherServlet 

View视图渲染器

view对象会调用render将model中的数据全部存放到request中完成了请求的处理,源码如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">interface</span> <span style="color:#0000ff">View</span> {
    <span style="color:#008855">String</span> <span style="color:#000000">RESPONSE_STATUS_ATTRIBUTE</span> <span style="color:#981a1a">=</span> <span style="color:#000000">View</span>.<span style="color:#770088">class</span>.<span style="color:#000000">getName</span>() <span style="color:#981a1a">+</span> <span style="color:#aa1111">".responseStatus"</span>;
    <span style="color:#008855">String</span> <span style="color:#000000">PATH_VARIABLES</span> <span style="color:#981a1a">=</span> <span style="color:#000000">View</span>.<span style="color:#770088">class</span>.<span style="color:#000000">getName</span>() <span style="color:#981a1a">+</span> <span style="color:#aa1111">".pathVariables"</span>;
    <span style="color:#008855">String</span> <span style="color:#000000">SELECTED_CONTENT_TYPE</span> <span style="color:#981a1a">=</span> <span style="color:#000000">View</span>.<span style="color:#770088">class</span>.<span style="color:#000000">getName</span>() <span style="color:#981a1a">+</span> <span style="color:#aa1111">".selectedContentType"</span>;
​
    <span style="color:#555555">@Nullable</span>
    <span style="color:#770088">default</span> <span style="color:#008855">String</span> <span style="color:#000000">getContentType</span>() {
        <span style="color:#770088">return</span> <span style="color:#221199">null</span>;
    }
   <span style="color:#aa5500">//把model里的数据存放到request,request和response负载跳转  </span>
   <span style="color:#008855">void</span> <span style="color:#000000">render</span>(<span style="color:#000000">Map</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span>, <span style="color:#981a1a">?></span> <span style="color:#000000">model</span>, <span style="color:#000000">HttpServletRequest</span> <span style="color:#000000">request</span>, 
                        <span style="color:#000000">HttpServletResponse</span> <span style="color:#000000">response</span>) <span style="color:#770088">throws</span> <span style="color:#000000">Exception</span>;
}</span></span>

相关推荐

  1. SpringMVC执行流程

    2024-01-10 16:42:01       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-10 16:42:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-10 16:42:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-10 16:42:01       82 阅读
  4. Python语言-面向对象

    2024-01-10 16:42:01       91 阅读

热门阅读

  1. .netcore 6 ioc注入的三种方式

    2024-01-10 16:42:01       51 阅读
  2. MinIO (五) .net core实现分片上传

    2024-01-10 16:42:01       40 阅读
  3. Hadoop之mapreduce参数大全-2

    2024-01-10 16:42:01       43 阅读
  4. Spring Boot 中自定义中文校验注解的实现

    2024-01-10 16:42:01       63 阅读
  5. K8S---kubectl edit命令

    2024-01-10 16:42:01       55 阅读
  6. 【2023】ArrayList和LinkedList详解介绍对比

    2024-01-10 16:42:01       60 阅读
  7. for循环延时时间计算

    2024-01-10 16:42:01       53 阅读
  8. Gorm 入门介绍与基本使用

    2024-01-10 16:42:01       45 阅读
  9. 《Linux C编程实战》笔记:线程终止

    2024-01-10 16:42:01       47 阅读