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架构图
当DispatcherServlet接受到一个请求时,会有以下事件依次发生 :
- DispatcherServlet接收到请求request。
- DispatcherServlet通过HandlerMapping找到目标Controller控制器类并调用相应的控制器方法。
- 控制器类方法执行业务逻辑,然后构造一个ModelAndView对象返回给DispatcherServlet。
- DispatcherServlet从ModelAndView对象中找出指定要使用的view(通常是view模板的名字或路径)。
- DispatcherServlet把模型(Model,数据)传递给视图(View,视图模版)。
- 视图View处理逻辑使用Model处理指定的视图,然后DispatcherServlet把处理结果发送给Servlet容器。Servlet容器最终把结果发送给用户。
Spring MVC中的请求处理流程
Spring MVC是请求(request)驱动的,DispatcherServlet处理来自客户端的请求然后把请求派发给控制器。它和Spring IoC容器紧密整合,允许开发人员使用Spring框架的各种功能。
下图是Spring MVC中请求处理的流程图 :
Spring MVC中请求处理的一般流程是这样的 :
- 客户端访问服务器的某个地址URL。
- Spring前端控制器,也就是DispatcherServlet,接收到用户请求,找到合适的Url处理器映射(Url Handler mapping)。
- Url处理器映射(Url Handler mapping)包含了从用户请求的Url到相应的控制器方法的映射。这个过程中框架会读取配置文件或者利用注解信息。DispatcherServlet将用户请求派发到相应的控制器方法。
- 控制器方法会执行业务逻辑,最终构造一个ModelAndView对象,返回给前端控制器DispatcherServlet.
- DispatcherServlet根据ModelAndView的值,找到相应的视图解释器(view resolver)和视图(view)。这里的视图模板可以是 JSP,FreeMarker,Velocity,Themeleaf等。
- 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)