在此图片中(我来自 here ), HTTP 请求向 Dispatcher Servlet发送内容。
我的问题是 Dispatcher Servlet 做什么?
是否类似于从网页上抛出信息并将其丢给控制器?
答案 0 :(得分:181)
DispatcherServlet 的工作是获取传入的URI并找到合适的处理程序组合(通常是 Controller 类上的方法)和组合的视图(通常是JSP)形成应该在该位置找到的页面或资源。
我可能有
/WEB-INF/jsp/pages/Home.jsp
和类
上的方法@RequestMapping(value="/pages/Home.html")
private ModelMap buildHome() {
return somestuff;
}
Dispatcher servlet 是“知道”在浏览器请求页面时调用该方法的位,并将其结果与匹配的JSP文件组合以生成html文档。
它如何实现这一点因配置和Spring版本而异。
最终结果也没有理由是网页。它可以做同样的事情来找到 RMI 端点,处理 SOAP 请求,任何可以进入servlet的东西。
答案 1 :(得分:52)
在Spring MVC中,所有传入的请求都通过一个servlet。这个servlet - DispatcherServlet
- 是前端控制器。前端控制器是Web应用程序开发中的典型设计模式。在这种情况下,单个servlet接收所有请求并将它们传输到应用程序的所有其他组件。
DispatcherServlet
的任务是将请求发送到特定的Spring MVC控制器。
通常我们有很多控制器,DispatcherServlet
指的是以下映射器之一,以确定目标控制器:
BeanNameUrlHandlerMapping
; ControllerBeanNameHandlerMapping
; ControllerClassNameHandlerMapping
; DefaultAnnotationHandlerMapping
; SimpleUrlHandlerMapping
。如果未执行任何配置,DispatcherServlet
默认使用BeanNameUrlHandlerMapping
和DefaultAnnotationHandlerMapping
。
识别目标控制器后,DispatcherServlet
向其发送请求。控制器根据请求执行一些工作
(或将其委托给其他对象),并使用模型和视图名称返回DispatcherServlet
。
View的名称只是一个逻辑名称。然后使用此逻辑名称搜索实际视图(以避免与控制器和特定视图耦合)。然后DispatcherServlet
引用ViewResolver
并将View的逻辑名称映射到View的特定实现。
ViewResolver
的一些可能的实现是:
BeanNameViewResolver
; ContentNegotiatingViewResolver
; FreeMarkerViewResolver
; InternalResourceViewResolver
; JasperReportsViewResolver
; ResourceBundleViewResolver
; TilesViewResolver
; UrlBasedViewResolver
; VelocityLayoutViewResolver
; VelocityViewResolver
; XmlViewResolver
; XsltViewResolver
。当DispatcherServlet
确定将显示结果的视图时,它将呈现为响应。
最后,DispatcherServlet
将Response
对象返回给客户端。
答案 2 :(得分:46)
DispatcherServlet
是Spring MVC对front controller pattern的实现。
请参阅Spring文档here中的说明。
本质上,它是一个接收传入请求的servlet,并将该请求的处理委托给多个处理程序之一,其映射在DispatcherServlet
配置中是特定的。
答案 3 :(得分:30)
我知道这个问题已被标记为已解决,但我想添加一个更新的图像来详细解释这个模式(来源: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)传回给客户端的输出。
答案 4 :(得分:6)
我们可以说DispatcherServlet
负责处理Spring MVC中的所有内容。
在Web容器启动时:
DispatcherServlet
将通过调用加载并初始化
init()
方法init()
的DispatcherServlet
将尝试识别Spring
具有命名约定的配置文档
"servlet_name-servlet.xml"
然后可以识别所有豆类。示例:
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并移交给HandlerMapping
。 HandlerMapping
使用控制器方法搜索映射bean,其中控制器返回逻辑名称(视图)。然后,此{1}}将此逻辑名称发送给DispatcherServlet
。然后HandlerMapping
通过附加前缀和后缀告诉DispatcherServlet
提供完整的视图位置,然后ViewResolver
为客户提供视图。
答案 5 :(得分:0)
调度程序控制器显示在图中,所有传入请求都被充当前端控制器的调度程序servlet拦截。 调度程序Servlet从XML文件获取处理程序映射的条目,并将请求转发到Controller。
答案 6 :(得分:0)
<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<context:component-scan base-package="com.demo" />
<context:annotation-config />
<mvc:annotation-driven />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="datasource" />
</bean>
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/employee" />
<property name="username" value="username" />
<property name="password" value="password" />
</bean>
</beans>
答案 7 :(得分:0)
您可以说 Dispatcher Servlet 充当任何请求的入口和出口点。每当请求到来时,它首先进入 Dispatcher Servlet(DS),然后 DS 尝试识别其处理程序方法(您在控制器中定义的处理请求的方法),一旦处理程序映射器(DS 询问处理程序映射器)返回控制器,调度程序 servlet 知道可以处理此请求的控制器,现在可以转到此控制器以进一步完成请求的处理。现在控制器可以用适当的响应进行响应,然后 DS 转到视图解析器以识别视图所在的位置,一旦视图解析器告诉 DS,它就会获取该视图并将其作为最终响应返回给您。我正在添加一张我从 YouTube 频道 Java 指南中获取的图像。