SpringMVC-简介

Model2 是基于 MVC 架构的设计模式。Servlet 作为前端控制器,负责接收客户端发送的请求。在 Servlet 中只包含控制逻辑和简单的前端处理;然后,调用后端 JavaBean 来完成实际的逻辑处理;最后,将其转发到相应的 JSP 页面来处理显式逻辑。

SpringMVC 的 DispatcherServlet

在 MVC 框架中,都包含一个用于调度控制的 Servlet。Spring MVC 提供了一个 org.springframework.web.servlet.DispatcherServlet 的 Servlet 充当前端控制器,所有的请求驱动都围绕这个 DispatcherServlet 来分派请求。

DispatcherServlet 是一个继承自 HttpServlet 的 Servlet 类,使用时需要把它配置在 web.xml 文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<servlet>
<servlet-name>dispatcher</servlet>
<servlet-calss>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- (可选)指定SpringMVC 的配置文件位置信息 -->
<init-param>
<param-name>contextConfigLoaction</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- DispatcherServlet 的映射声明 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet>
<url-patter>/</url-pattern>
</servlet-mapping>

DispatcherServlet 在 Web 应用程序启动时立即加载,并需要一个 SpringMVC 的配置文件(默认名称为Dispatcher-servlet.xml),默认会去 WEB-INF 文件夹下查找对应的 [servlet-name]-servlet.xml 文件。也可以把 SpringMVC 的配置文件放到应用程序文件夹中的任何地方,用 <init-param> 子元素进行描述。

Dispatcher-servlet.xml 配置文件被解析后,会创建一个 WebApplicationContext 容器对象,也称为上下文环境。WebApplicationContext 继承自 ApplicationContext 容器。有了 WebApplicationContext 容器,就可以使用 Spring 的 IOC、AOP 等其他功能。

SpringMVC 的执行流程

  1. 用户向服务器发送请求,请求被 SpringMVC 的前端控制器 DispatcherServlet 截获。
  2. DispatcherServlet 对请求 URL 进行解析,得到 URI。然后根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象,包括 Handler 对象以及 Handler 对象对应的拦截器,这些对象会被封装到一个 HandlerExceptionChain 对象中返回。
  3. DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapterHandlerAdapter 会被用于处理多种 Handler,调用 Handler 实际处理请求的方法。
  4. 提取请求方法中的模型数据,开始执行 Handler(Controller)。在填充 Handler 的入参过程中,根据配置,SpringMVC 会做一些额外的工作:
    • 消息转换:将请求消息(如 JSON、XML 等数据)转换成一个对象,将对象转换为指定的响应信息。
    • 数据转换:对请求消息进行数据转换,如 String 转换成 Integer、Double 等。
    • 数据格式化:对请求消息进行数据格式化,如将字符串转换成格式化数字或格式化日期等。
    • 数据验证:验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中。
  5. Handler 执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象,ModelAndView 对象中应该包含视图名或视图名加模型。
  6. 根据返回的 ModelAndView 对象,选择一个合适的 ViewResolver(视图解析器)返回给 DispatcherServlet
  7. ViewResolver 结合 Model 和 View 来渲染视图。
  8. 将视图渲染结果返回给客户端。