什么是Spring中的Dispatcher Servlet?

Kev*_*vin 176 java spring spring-mvc

在这张图片中(我从这里得到),HTTP请求向Dispatcher Servlet发送了一些内容.

在此输入图像描述

我的问题是Dispatcher Servlet的作用是什么?

是否就像从网页上抛出信息并将其丢给控制器?

Aff*_*ffe 189

DispatcherServlet的工作是获取传入的URI并找到正确的处理程序组合(通常是Controller类上的方法)和视图(通常是JSP),它们组合起来形成应该在该位置找到的页面或资源.

我可能有

调度的servlet是"知道"该位调用该方法,当浏览器请求的页面,其结果与匹配的JSP文件相结合,使HTML文档.

它如何实现这一点因配置和Spring版本而异.

最终结果也没有理由是网页.它可以做同样的事情来定位RMI端点,处理SOAP请求,任何可以进入servlet的东西.

  • 它实际上在启动时扫描类路径以获取该注释,并将"/pages/Home.html"映射到Class + Method.如果你有两个方法都有"/pages/Home.html"而没有注释中的其他限制,那将是一个错误,它将抛出异常.如果你是oldschool,你也可以用XML连接它. (9认同)
  • 伟大的riposte,现在是一个问题,DispatcherServlet如何识别类名和方法名.你能告诉我一个配置的例子,其中我有两个类和两个方法名称,以及DispatcherServlet如何捕获正确的请求. (3认同)
  • 使用基于注解的 `@RestController` 时,我们需要一个 `Dispatcher Servlet` xml 文件吗? (2认同)
  • @viper 在 web.xml 中,即使您使用注释或 xml 配置,我们也始终需要配置调度程序 servlet (2认同)

Ale*_*kov 63

在Spring MVC中,所有传入的请求都通过一个servlet.这个servlet - DispatcherServlet是前端控制器.前端控制器是Web应用程序开发中的典型设计模式.在这种情况下,单个servlet接收所有请求并将它们传输到应用程序的所有其他组件.

该任务的任务DispatcherServlet是将请求发送到特定的Spring MVC控制器.

通常我们有很多控制器,并且DispatcherServlet为了确定目标控制器而引用以下映射器之一:

如果没有配置执行的DispatcherServlet用途BeanNameUrlHandlerMappingDefaultAnnotationHandlerMapping默认.

识别目标控制器后,DispatcherServlet向其发送请求.控制器根据请求执行一些工作(或将其委托给其他对象),然后返回到DispatcherServlet带有Model和View的名称.

View的名称只是一个逻辑名称.然后使用此逻辑名称搜索实际视图(以避免与控制器和特定视图耦合).然后DispatcherServlet引用ViewResolver并将View的逻辑名称映射到View的特定实现.

一些可能的实现ViewResolver是:

DispatcherServlet确定将显示结果的视图时,它将呈现为响应.

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


ska*_*man 46

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

看到春天文档描述这里.

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

  • @theband:你*可以*有多个`DispatcherServlets`,如果你的架构更有意义,但通常没有理由. (2认同)

Edu*_*rdo 39

我知道这个问题已被标记为已解决,但我想添加一个更新的图像来详细解释这个模式(来源:spring in action 4):

在此输入图像描述

说明

当请求离开浏览器(1)时,它携带有关用户要求的信息.至少,请求将携带请求的URL.但它也可能携带其他数据,例如用户以表格提交的信息.

请求旅行的第一站是Spring的DispatcherServlet.与大多数基于Java的Web框架一样,Spring MVC通过单个前端控制器servlet汇集请求.前端控制器是一种常见的Web应用程序模式,其中单个servlet将对请求的责任委托给应用程序的其他组件以执行实际处理.在Spring MVC的情况下,DispatcherServlet是前端控制器.DispatcherServlet的工作是将请求发送到Spring MVC控制器.控制器是处理请求的Spring组件.但是典型的应用程序可能有多个控制器,DispatcherServlet需要一些帮助来决定将请求发送到哪个控制器.因此,DispatcherServlet会查询一个或多个处理程序映射(2),以确定请求的下一个停止位置.处理程序映射在做出决策时特别关注请求所携带的URL.一旦选择了适当的控制器,DispatcherServlet就会以愉快的方式将请求发送到所选的控制器(3).在控制器处,请求丢弃其有效载荷(用户提交的信息)并在控制器处理该信息时耐心地等待.(实际上,设计良好的控制器本身很少或根本不执行处理,而是将业务逻辑的责任委托给一个或多个服务对象.)控制器执行的逻辑通常会导致一些需要传回的信息用户并在浏览器中显示.该信息称为模型.但是将原始信息发送回用户是不够的 - 它需要以用户友好的格式(通常是HTML)格式化.为此,需要将信息提供给视图,通常是JavaServer Page(JSP).控制器最后做的事情之一是打包模型数据并识别应该呈现输出的视图的名称.然后,它将请求以及模型和视图名称发送回DispatcherServlet (4).因此,控制器不会耦合到特定视图,传递回DispatcherServlet的视图名称不会直接标识特定的JSP.它甚至不一定表明视图是JSP.相反,它只带有一个逻辑名称,用于查找将产生结果的实际视图.DispatcherServlet查询视图解析器(5)以将逻辑视图名称映射到特定的视图实现,该实现可能是也可能不是JSP.既然DispatcherServlet知道哪个视图将呈现结果,那么请求的作业几乎已经结束.它的最后一站是视图实现(6),通常是JSP,它提供模型数据.请求的工作终于完成了.该视图将使用模型数据来呈现将由(不那么勤奋)响应对象(7)传送回客户端的输出.

  • 我见过的最令人惊讶的Dispatcher servlet解释.先生,这很棒. (2认同)
  • @Nesrin,你问这个问题已经很久了,但这里有一个答案:你在“@Controller”方法上方放置了一个名为“@ResponseBody”的特殊注释,指示返回的响应应直接写入 HTTP 响应正文,而不是放在模型或被解析为视图。 (2认同)

use*_*609 7

我们可以说像DispatcherServlet在Spring MVC中处理一切.

在Web容器启动时:

  1. DispatcherServlet将通过调用init()方法加载和初始化
  2. init()DispatcherServlet会尝试与命名约定像识别Spring配置文件 "servlet_name-servlet.xml",然后所有的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);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

因此,通常DispatcherServlet捕获请求URI并移交给HandlerMapping.HandlerMapping使用控制器方法搜索映射bean,其中控制器返回逻辑名称(视图).那么这个逻辑名称是发送到DispatcherServlet通过HandlerMapping.然后通过附加前缀和后缀DispatcherServlet告诉ViewResolver提供完整的视图位置,然后DispatcherServlet给客户端查看.