在这个图像(我从获得)中,HTTP请求向Dispatcher Servlet发送了一些东西。
我的问题是Dispatcher Servlet做了什么?
这是不是有点像从网页上抛出的信息,然后把它扔给控制器呢?
发布于 2010-05-05 06:59:21
DispatcherServlet的工作是接收传入的URI,并找到处理程序(通常是控制器类上的方法)和视图(通常是JSP)的正确组合,这些组合形成了应该在该位置找到的页面或资源。
我可能有过
在类上使用/WEB-INF/jsp/pages/Home.jsp
@RequestMapping(value="/pages/Home.html")私有页面buildHome() { ModelMap buildHome;}
Dispatcher servlet是在浏览器请求页面时调用该方法,并将其结果与匹配的JSP文件组合以生成html文档的部分。
它如何实现这一点因配置和Spring版本的不同而有很大不同。
也没有理由最终结果必须是网页。它可以做同样的事情来定位RMI端点,处理SOAP请求,以及任何可以进入servlet的东西。
发布于 2015-11-19 03:02:40
在Spring MVC中,所有传入的请求都通过单个servlet。这个servlet -- DispatcherServlet
--是前端控制器。前端控制器是web应用开发中一种典型的设计模式。在这种情况下,单个servlet接收所有请求并将它们传输到应用程序的所有其他组件。
DispatcherServlet
的任务是向特定的Spring MVC控制器发送请求。
通常我们有很多控制器,DispatcherServlet
引用以下映射器之一来确定目标控制器:
BeanNameUrlHandlerMapping
;ControllerBeanNameHandlerMapping
;ControllerClassNameHandlerMapping
;DefaultAnnotationHandlerMapping
;SimpleUrlHandlerMapping
.如果未执行任何配置,则DispatcherServlet
默认使用BeanNameUrlHandlerMapping
和DefaultAnnotationHandlerMapping
。
识别出目标控制器后,DispatcherServlet
会向其发送请求。控制器根据请求执行一些工作(或将其委托给其他对象),并将模型和视图的名称返回给DispatcherServlet
。
视图的名称只是一个逻辑名称。然后使用此逻辑名称搜索实际的视图(以避免与控制器和特定视图耦合)。然后,DispatcherServlet
引用ViewResolver
并将视图的逻辑名称映射到视图的特定实现。
ViewResolver
的一些可能实现包括:
BeanNameViewResolver
;ContentNegotiatingViewResolver
;FreeMarkerViewResolver
;InternalResourceViewResolver
;JasperReportsViewResolver
;ResourceBundleViewResolver
;TilesViewResolver
;UrlBasedViewResolver
;VelocityLayoutViewResolver
;VelocityViewResolver
;XmlViewResolver
;XsltViewResolver
.当DispatcherServlet
确定将显示结果的视图时,它将被呈现为响应。
最后,DispatcherServlet
将Response
对象返回给客户端。
发布于 2017-06-06 10:12:43
我知道这个问题已经被标记为已解决,但我想添加一个更新的图像来详细解释这个模式(来源: 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页。控制器所做的最后一件事是打包模型数据,并标识应该呈现输出的视图的名称。然后,它将请求连同模型和视图名称一起发送回DispatcherServlet (4)。因此,控制器不会耦合到特定的视图,传递回DispatcherServlet的视图名称不会直接标识特定的JSP。它甚至不一定表明视图是一个JSP。相反,它只带有一个逻辑名称,该名称将用于查找将产生结果的实际视图。DispatcherServlet咨询视图解析器(5)以将逻辑视图名称映射到特定视图实现,其可以是也可以不是JSP.既然DispatcherServlet知道哪个视图将呈现结果,那么请求的工作就快结束了。它的最后一站是视图实现(6),通常是JSP,它在这里传递模型数据。请求的工作终于完成了。视图将使用模型数据来呈现输出,这些输出将由(不是很努力的)响应对象(7)传回客户机。
https://stackoverflow.com/questions/2769467
复制相似问题