文章目录
DispatcherServlet
Spring MVC 基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,用于构建松散耦合的 Web 应用。
Spring MVC 框架是围绕 DispatcherServlet 设计的,DispatcherServlet 用来处理所有的 HTTP 请求和响应。
DispatcherServlet 传入 HTTP 请求的事件序列
- 收到一个 HTTP 请求后,DispatcherServlet 根据 HandlerMapping 来选择并且调用适当的控制器
- 控制器接受请求,并基于使用的 GET 或 POST 方法来调用适当的 service 方法。service 方法将设置基于定义的业务逻辑的模型数据,并返回视图名称到 DispatcherServlet 中
- DispatcherServlet 会从 ViewResolver 获取帮助,为请求检取定义视图
- 一旦确定视图,DispatcherServlet 将把模型数据传递给视图,最后呈现在浏览器中
配置 DispatcherServlet
- 通过在 web.xml 配置 DispatcherServlet
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
- 借助 Servlet3 规范和 Spring 3.1 的功能增强,继承
AbstractAnnotationConfigDispatcherServetInitializer
的任意类会自动配置 DispatcherServlet 和 Spring 应用上下文
public abstract class AbstractAnnotationConfigDispatcherServletInitializer
extends AbstractDispatcherServletInitializer {
@Override
@Nullable
protected WebApplicationContext createRootApplicationContext() {
Class<?>[] configClasses = getRootConfigClasses();
if (!ObjectUtils.isEmpty(configClasses)) {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(configClasses);
return context;
}
else {
return null;
}
}
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
Class<?>[] configClasses = getServletConfigClasses();
if (!ObjectUtils.isEmpty(configClasses)) {
context.register(configClasses);
}
return context;
}
@Nullable
protected abstract Class<?>[] getRootConfigClasses();
@Nullable
protected abstract Class<?>[] getServletConfigClasses();
}
两个应用上下文
- 当 DispatcherServlet 启动时,会创建 Spring 应用上下文,并加装配置文件或配置类中所声明的 bean,如控制器、视图解析器以及处理器映射。
- ContextLoaderListener 也会创建 Spring 应用上下文,如驱动应用后端的中间层和数据层组件。
AbstractAnnotationConfigDispatcherServetInitializer
会同时创建 DispatcherServlet 和 ContextLoaderListener。
getRootConfigClasses()
方法返回的带有 @Configuration 注解的类将会用来定义 ContextLoaderListener 应用上下文的 bean。
getServletConfigClasses()
方法返回的带有 @Configuration 注解的类将会用来定义 DispatcherServlet 应用上下文的 bean。