DispatcherServlet
在颠覆者中,我们看到过如下代码。
public class WebInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(MyMvcConfig.class);
ctx.setServletContext(servletContext); //2
Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); //3
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
servlet.setAsyncSupported(true);//1
}
}
那么这个DispatcherServlet起到了什么作用呢?
SpringMVC实现了两种常见的设计模式:前端控制器模式与MVC模式。
对于前端控制器系统,在设计时会为所有传入的请求公开一个单独的入口点。在Java Web中,这个入口点通常是个Servlet——这个特别的Servlet会将请求分派并委托给其他组件处理。对于SpringMVC来说,这个特别的Servlet就是DispatcherServlet。
MVC设计模式是一种架构风格,它整体描述了一个应用,提倡在请求线程必须经过的三个不同层次之间要明确分离的关注点,这三个层次分别是模型、视图与控制器。
当客户端的请求被Servlet容器拦截时,它会被路由到DispatcherServlet。DispatcherServlet会将请求发送给一个控制器。
SpringMVC的流程可以通过下图来描述。
SpringMVC流程(ViewResolver视图解析器,主要作用是把一个逻辑上的视图名称解析为一个真正的视图。Handler Mapping处理器映射,把一个URL指定到一个Controller上。)
DispatcherServlet是SpringMVC的入口点,DispatcherServlet依赖于HanderMapping的实现。根据不同的策略和特性,HanderMapping能够解析出适用于某个请求的控制器方法处理程序。
当DispatcherServlet有了控制器方法处理程序后,就会将请求指派给它。方法处理程序会将一个视图名(或是视图本身)以及填充好的模型数据返回给DispatcherServlet。
通过视图名,DispatcherServlet会请求ViewResolver的实现来查找并选择视图。
通过请求、视图与模型,DispatcherServlet就具备了构建客户端所需的一切。通过所有这些元素对视图进行处理后,会将响应返回给Servlet容器。