Spring MVC是如何工作的?

概述

这篇文章会基于Spring MVC模块的架构图和流程图讲解它是如何工作的。

Spring MVC模块随Spring框架一起发布。Spring框架中MVC模块跟框架其他部分集成的很好,而且模块本身很容易扩展。

Spring MVC基于MVC设计模式。这里列出Spring MVC中一些关键的类 :

  • DispatcherServlet

    对于war方式的web应用,DispatcherServlet 配置在web.xml中;对于spring boot 独立可运行jar 方式的web应用,DispatcherServlet 通过spring boot自动配置机制配置。DispatcherServlet 上配置了URL到该Servlet的映射,它作为前端控制器处理所有来自用户的请求。

  • ModelAndView

    在 Spring MVC中,该类用于持有模型(Model)和视图(View)。一个用户请求处理过程中,相应的要在视图(View)中展示的数据也就是模型(Model)会被放在一个ModelAndView对象中,交给View解释器处理成最终的响应数据返回给用户,这些数据通常是融合了数据,css,javascript的HTML。

  • SimpleFormController

    SimpleFormController是FormController的实现类。它提供了可配置的表单(form)和成功视图 (success view),以及一个onSubmit 链(chain)以方便重写(overriding)。验证失败时会自动重新提交到表单视图(form view),而验证(valid)通过的提交则会直接处理(render)成功视图 (success view)返回给用户。

简化的Spring MVC架构图

Spring MVC架构图(简化版本)

当DispatcherServlet接受到一个请求时,会有以下事件依次发生 :

  1. DispatcherServlet接收到请求request。
  2. DispatcherServlet通过HandlerMapping找到目标Controller控制器类并调用相应的控制器方法。
  3. 控制器类方法执行业务逻辑,然后构造一个ModelAndView对象返回给DispatcherServlet。
  4. DispatcherServlet从ModelAndView对象中找出指定要使用的view(通常是view模板的名字或路径)。
  5. DispatcherServlet把模型(Model,数据)传递给视图(View,视图模版)。
  6. 视图View处理逻辑使用Model处理指定的视图,然后DispatcherServlet把处理结果发送给Servlet容器。Servlet容器最终把结果发送给用户。

Spring MVC中的请求处理流程

Spring MVC是请求(request)驱动的,DispatcherServlet处理来自客户端的请求然后把请求派发给控制器。它和Spring IoC容器紧密整合,允许开发人员使用Spring框架的各种功能。

下图是Spring MVC中请求处理的流程图 :
Spring MVC request flow

Spring MVC中请求处理的一般流程是这样的 :

  1. 客户端访问服务器的某个地址URL。
  2. Spring前端控制器,也就是DispatcherServlet,接收到用户请求,找到合适的Url处理器映射(Url Handler mapping)。
  3. Url处理器映射(Url Handler mapping)包含了从用户请求的Url到相应的控制器方法的映射。这个过程中框架会读取配置文件或者利用注解信息。DispatcherServlet将用户请求派发到相应的控制器方法。
  4. 控制器方法会执行业务逻辑,最终构造一个ModelAndView对象,返回给前端控制器DispatcherServlet.
  5. DispatcherServlet根据ModelAndView的值,找到相应的视图解释器(view resolver)和视图(view)。这里的视图模板可以是 JSP,FreeMarker,Velocity,Themeleaf等。
  6. View和model被视图解释器处理,渲染生成最终的视图,封装成HttpServletResponse的形式返回给客户端。

这里需要注意的是,JSP和FreeMarker,Velocity,Themeleaf这些模板机制的有所不同。对于FreeMarker这类的模板机制,上面的流程执行之后,最终的结果数据就返回给浏览器端了。而对于JSP的情况,DispatcherServlet找到的处理JSP的View,通常是org.springframework.web.servlet.view.JstlView,它并不直接渲染和生成最终结果返回给客户端,而是将当前请求进一步封装后foward到一个org.apache.jasper.servlet.JspServlet这样的Servlet(该过程通常意味着在服务端再执行一个ApplicationFilterChain),该Servlet会调用相应的JSP文件生成的Servlet完成最终视图数据的渲染。

参考文章

本文主要内容译自 : How Spring MVC Works
[官方文档 : Web MVC framework]https://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/html/mvc.html)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值