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