什么是Spring中的Dispatcher Servlet?

在这个图片(我从这里得到), HTTP请求发送一些事件到Dispatcher Servlet。

在这里输入图像说明

我的问题是调度程序Servlet是做什么的?

是像从网页上抛出的信息,并把它扔到控制器?

DispatcherServlet的工作是获取传入的URI,并find处理程序(通常是Controller类上的方法)和视图(通常是JSP)的合适组合,以形成应该在该位置find的页面或资源。

我可能有

  • 一个文件/WEB-INF/jsp/pages/Home.jsp
  • 和一个class的方法

     @RequestMapping(value="/pages/Home.html") private ModelMap buildHome() { return somestuff; } 

Dispatcher servlet是在浏览器请求页面时“知道”调用该方法的位,并将其结果与匹配的JSP文件组合以生成一个html文档。

它是如何实现这个configuration和Spring版本差别很大。

最终的结果也不是网页。 它可以做同样的事情来findRMI端点,处理SOAP请求,任何可以进入servlet的东西。

DispatcherServlet是Spring MVC的前端控制器模式的实现。

请参阅这里的Spring文档中的描述。

本质上,它是一个接收传入请求的servlet,并将该请求的处理委托给其中一个处理程序,其映射在DispatcherServletconfiguration中是特定的。

在Spring MVC中,所有传入的请求都通过一个servlet。 这个Servlet – DispatcherServlet是前端控制器。 前端控制器是Web应用程序开发中的典型devise模式。 在这种情况下,单个servlet接收所有请求并将其传送给应用程序的所有其他组件。

DispatcherServlet的任务是向特定的Spring MVC控制器发送请求。

通常我们有很多控制器,而DispatcherServlet引用下列其中一个组件来确定目标控制器:

  • BeanNameUrlHandlerMapping ;
  • ControllerBeanNameHandlerMapping ;
  • ControllerClassNameHandlerMapping ;
  • DefaultAnnotationHandlerMapping ;
  • SimpleUrlHandlerMapping

如果不configuration其他, DispatcherServlet使用BeanNameUrlHandlerMappingDefaultAnnotationHandlerMapping

当目标控制器被定义时, DispatcherServlet向它发送请求。 控制器根据请求执行一些工作(或将其委托给其他对象),并返回到DispatcherServlet Model和Model的名称。

视图的名称 – 它只是逻辑名称。 这个逻辑名然后用于search实际的视图(以避免与控制器和特定视图耦合)。 然后DispatcherServlet引用ViewResolver并将View的逻辑名称映射到View的特定实现。

ViewResolver实现:

  • BeanNameViewResolver ;
  • ContentNegotiatingViewResolver ;
  • FreeMarkerViewResolver ;
  • InternalResourceViewResolver ;
  • JasperReportsViewResolver ;
  • ResourceBundleViewResolver ;
  • TilesViewResolver ;
  • UrlBasedViewResolver ;
  • VelocityLayoutViewResolver ;
  • VelocityViewResolver ;
  • XmlViewResolver ;
  • XsltViewResolver

DispatcherServlet确定将显示结果(模型)的视图时,此视图将呈现给响应。

最后, DispatcherServletResponse对象返回给客户端。

  • Spring Web MVC框架的DispatcherServlet是FrontController的一个实现,它是一个Java Servlet组件。 即它是Spring Web Mvc应用程序的servlet前端。

  • DispatcherServlet t是FrontController类,它接收Spring Web mvc应用程序的所有传入HTTP客户端请求。

  • DispatcherServlet负责为我们的应用程序初始化spring web mvc框架,并且像其他Servlet一样,是一个作为HttpServlet子types实现的servlet。

  • DispatcherServlet还需要像我们的Web应用程序一样在任何其他Servlet中进行configuration,例如,Web应用程序部署描述符(web.xml)

我们可以configuration初始化参数来改变DispatcherServlet在定位Spring Beans XMLconfiguration文件和初始化应用程序上下文方面的行为。

  • 下图描述了有关DispatcherServlet的一切 在这里输入图像说明

我知道这个问题已被标记为已解决,但我想添加一个更详细的解释这种模式的图像(来源:春季在行动4):

在这里输入图像说明

说明

当请求离开浏览器(1)时 ,它携带关于用户请求的信息。 至less,请求将携带请求的URL。 但是它也可能带有额外的数据,比如用户在表单中提交的信息。

请求的第一站是Spring的DispatcherServlet。 像大多数基于Java的Web框架一样,Spring MVC通过一个前端控制器servlet来请求请求。 前端控制器是一种常见的Web应用程序模式,其中一个servlet将请求的责任委托给应用程序的其他组件,以执行实际的处理。 在Spring MVC的情况下,DispatcherServlet是前端控制器。 DispatcherServlet的工作是将请求发送到Spring MVC控制器。 一个控制器是一个处理请求的Spring组件。 但是典型的应用程序可能有多个控制器,而且DispatcherServlet需要一些帮助来决定将请求发送到哪个控制器。 因此,DispatcherServlet会查询一个或多个处理程序映射(2)来确定请求的下一站将在哪里。 处理程序映射在作出决定时特别注意请求所携带的URL。 一旦select了合适的控制器,DispatcherServlet将其请求的方式发送给选定的控制器(3) 。 在控制器处,请求会丢弃其有效载荷(由用户提交的信息),并耐心等待控制器处理该信息。 (实际上,一个devise良好的控制器本身几乎不处理或不处理,而是将业务逻辑的责任委托给一个或多个服务对象)。控制器执行的逻辑通常会导致一些信息需要被带回用户并显示在浏览器中。 这个信息被称为模型。 但是将原始信息发送回给用户是不够的 – 它需要以用户友好的格式(通常是HTML)进行格式化。 为此,需要将信息提供给视图,通常是JavaServer Page(JSP)。 控制器所做的最后一件事情就是打包模型数据,并确定应该呈现输出的视图的名称。 然后将请求连同模型和视图名称一起发送回DispatcherServlet (4) 。 因此,控制器不会耦合到特定的视图,传回DispatcherServlet的视图名称不会直接标识特定的JSP。 它甚至不一定暗示该视图是一个JSP。 相反,它只携带一个逻辑名称,用于查找将生成结果的实际视图。 DispatcherServlet咨询一个视图parsing器(5)来将逻辑视图名称映射到一个特定的视图实现,该实现可能是或不是JSP。 现在,DispatcherServlet知道哪个视图将呈现结果,请求的工作即将结束。 它的最后一步是视图实现(6) ,通常是一个JSP,它传递模型数据。 请求的工作终于完成了。 该视图将使用模型数据来呈现将由(不那么努力)响应对象(7)带回客户端的输出。

我们可以像DispatcherServlet一样关心Spring MVC中的所有事情。

在Web容器启动时:

  1. DispatcherServel将通过调用init()方法来加载和初始化
  2. DispatcherServlet init()将尝试使用"servlet_name-servlet.xml"这样的命名约定来标识Springconfiguration文档,然后所有的bean都可以被标识

例:

 public class DispatcherServlet extends HttpServlet { ApplicationContext ctx = null; public void init(ServletConfig cfg){ // 1. try to get the spring configuration document with default naming conventions String xml = "servlet_name" + "-servlet.xml"; //if it was found then creates the ApplicationContext object ctx = new XmlWebApplicationContext(xml); } ... } 

所以,一般在DispatcherServlet捕获请求URI并交给HandlerMappingHandlerMapping用控制器的方法search映射bean,其中控制器返回逻辑名称(view)。 然后这个逻辑名由HandlerMapping发送到DispatcherServlet 。 然后DispatcherServlet通过添加前缀和后缀来告诉ViewResolver给出完整的视图位置,然后DispatcherServlet将视图提供给客户端。