概述
无论是基于Spring Boot还是基于SSM框架的Web开发,都涉及到了Spring MVC框架的使用。Spring MVC是Spring Framework的其中一个产品,是一个强大灵活的基于MVC的Web框架,它包含以下优点:
- 请求统一通过内置的
DispatcherServlet
处理,开发者无需编写难以管理、维护的Filter
、Servlet
类。 - 分工明确,包括控制器、验证器、命令对象、模型对象、处理程序映射视图解析器等等,每一个功能实现由一个专门的对象负责完成
- 自带
Spring
框架的IoC和AOP功能,有效降低了代码的耦合度 - 配置相对于传统的
web.xml
更加简单方便,维护起来更加容易 - 支持国际化
- 支持多种视图技术
本文假定读者有一定的Spring MVC开发经验。
DispatcherServlet
DispatcherServlet
是整个Spring MVC的核心,它的继承体系如下:
可以看出它实现了javax.servlet.Servlet
接口,所以它本质上是一个Servlet
,并可通过web.xml
文件注册到Servlet容器上。
并且,它也实现了ApplicationContextAware
和EnvironmentAware
接口,所以在Spring
容器在创建DispatcherServlet
实例的时候,也会将IoC容器ApplicationContext
和环境参数容器Environment
注入到DispatcherServlet
,使其可以利用到Spring的IoC容器。
一般在开发基于Spring MVC的Web应用的时候,我们一般会在web.xml
文件中这么定义这个DispatcherServlet
:
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
可以看出和一般的Servlet
配置没什么区别,我们只需要将所有的URL请求产生的HttpServletRequest
都由这个DispatcherServlet
进行处理就可以了。同样和其它Servlet
类似,DispatcherServlet
是单例的,多个请求由同一个DispatcherServlet
处理。
DispatcherServlet
处理请求的流程可以用以下图片概括:
其处理流程可以概括为:
- 客户端发起请求后,由
Servlet
容器将请求包装为HttpServletRequest
对象,然后Servlet
容器通过反射创建DispatcherServlet
对象,调用其init
方法并传入ServletConfig
对象(存储了web.xml
文件定义的init-param
参数)初始化DispatcherServlet
,然后调用其service
方法并传入HttpServletRequest
和HttpServletResponse
进行服务。 Disp