138.md 3.0 KB
Newer Older
W
wizardforcel 已提交
1
# Spring 中的`DispatcherServlet`
W
init  
wizardforcel 已提交
2 3 4

> 原文: [https://javatutorial.net/dispatcher-servlet-in-spring](https://javatutorial.net/dispatcher-servlet-in-spring)

W
wizardforcel 已提交
5
调度器 Servlet 是 [Spring Web MVC 中最重要的组件](https://javatutorial.net/implementing-spring-mvc-controllers)
W
init  
wizardforcel 已提交
6 7 8

![java-featured-image](img/e0db051dedc1179e7424b6d998a6a772.jpg)

W
wizardforcel 已提交
9
为什么调度器 servlet 是最重要的组件? 因为它充当胶水,这意味着它接收到传入的 URL 并找到正确的方法和视图。 它通过 **HTTP 请求**接收 URL。 您还可以将其视为中间件,因为它与两端进行通信 - HTTP 请求的发送方和 Spring 应用程序。调度器 Servlet 完全**集成**在 IoC 容器中,并允许您使用 Spring 拥有的所有功能。
W
init  
wizardforcel 已提交
10 11 12

![Dispatcher Servlet example](img/7278e3b6b6bc80336ad492e1b2587755.jpg)

W
wizardforcel 已提交
13
### `DispatcherServlet`工作流程
W
init  
wizardforcel 已提交
14 15 16

以上介绍是顶级概述。 现在,让我们更具体地了解它在幕后的发生方式。

W
wizardforcel 已提交
17 18
1.  服务器请求到达服务器,并且调度器 Servlet 收到。
2.  为调度器 Servlet 授予了**处理程序对象**,在大多数情况下,它将是`HandlerExecutionChain`的实例,该实例来自`HandlerMapping`对象,该对象基于 URL 映射 。
W
init  
wizardforcel 已提交
19
    1.  有两种定义 URL 映射的方法:
W
wizardforcel 已提交
20
        1.  `web.xml`文件
W
init  
wizardforcel 已提交
21
        2.  控制器的方法注释
W
wizardforcel 已提交
22 23
3.  已从处理程序对象中检索到`HandlerInterceptor`对象的一个​​或多个实例。
4.  从处理程序对象中检索`HandlerAdapter`的实例。
W
init  
wizardforcel 已提交
24
    1.  由于这个实例,我们可以调用句柄方法,该方法导致执行控制器类具有的任何逻辑。
W
wizardforcel 已提交
25 26
5.  `HandlerInterceptor`实例上的后处理逻辑已执行。 这是调用渲染方法之前的最后一步。
6.`ViewResolver`实例完成返回给响应的适当视图组件。
W
init  
wizardforcel 已提交
27 28
7.  最后,在该视图的实例上调用了渲染方法。

W
wizardforcel 已提交
29
分派器 Servlet 继承自`HttpServlet`,并在 Web 应用程序的`web.xml`文件中声明。 同样,如果您从上面阅读了步骤 2,您将看到我们需要 URL 映射。 首先,URL 映射将请求映射到分派器处理程序进行处理。 现在,使用 URL 映射的一种方法是将其存储在相同的`web.xml`文件中。
W
init  
wizardforcel 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

```java
<web-app>

    <servlet>
        <servlet-name>example</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>example</servlet-name>
        <url-pattern>*.form</url-pattern>
    </servlet-mapping>

</web-app>
```

W
wizardforcel 已提交
48
此代码段示例摘自 [Spring 文档](https://docs.spring.io/spring/docs/3.0.0.M4/spring-framework-reference/html/ch15s02.html)
W
init  
wizardforcel 已提交
49

W
wizardforcel 已提交
50
示例代码段显示,所有以`.form`结尾的请求都将由示例调度器 servlet 处理。
W
init  
wizardforcel 已提交
51

W
wizardforcel 已提交
52
初始化调度器 servlet 后,框架将在应用程序的`web-inf`目录中查找名称为`[servlet-name]-servlet.xml`的文件,并在该目录中创建 Bean 并覆盖在全局范围内以相同名称定义的 bean 的所有定义。