SpringBoot云课堂

DispatcherServlet

2018-01-15  本文已影响24人  小弦弦喵喵喵

在颠覆者中,我们看到过如下代码。

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容器。

上一篇下一篇

猜你喜欢

热点阅读