DispatcherServlet 是 Spring MVC 框架的核心组件之一,它负责处理所有的 HTTP 请求,并将请求分发给相应的控制器进行处理。
DispatcherServlet 的工作流程
DispatcherServlet
在处理请求时,会经历以下流程:
1. 接收请求
当用户发送 HTTP 请求到 Web 应用程序时,DispatcherServlet
会拦截该请求。它充当整个应用程序的前端控制器,确保所有请求都通过它进行处理。
2. 查找处理器映射 (HandlerMapping)
DispatcherServlet
会根据请求的 URL 查找与之匹配的处理器映射 (HandlerMapping
)。处理器映射会将请求映射到相应的控制器 (Controller
)。Spring 提供了多种方式来定义处理器映射,例如注解、XML 配置等。
3. 创建处理器
一旦找到合适的处理器映射,DispatcherServlet
会创建相应的控制器对象。这通常是通过依赖注入容器(如 Spring 的 ApplicationContext
)来管理和创建的。
4. 执行处理器
然后,DispatcherServlet
会调用控制器的处理方法 (Handler Method
) 来处理请求。控制器中的业务逻辑会在此阶段执行,处理用户请求并生成相应的响应数据。
5. 处理结果
控制器处理完请求后,会返回一个 ModelAndView
对象。该对象包含了视图名称和数据模型。视图名称用于指定将要渲染的视图,数据模型包含了需要在视图中展示的数据。
6. 查找视图解析器 (ViewResolver)
DispatcherServlet
会查找与视图名称匹配的视图解析器 (ViewResolver
)。视图解析器负责将逻辑视图名称解析为实际的视图对象(例如 JSP、Thymeleaf 模板等)。
7. 渲染视图
最后,视图解析器会根据视图名称和数据模型渲染视图,并将最终生成的 HTML 页面返回给用户。整个流程在此结束,用户会看到处理后的页面内容。
DispatcherServlet 的优势
解耦
DispatcherServlet
将请求处理过程分解成多个独立的组件,例如处理器映射、控制器、视图解析器等。这种解耦设计提高了代码的可维护性和可扩展性,各个组件可以独立开发和测试。
灵活
DispatcherServlet
支持多种配置方式,可以根据不同的需求进行定制。开发者可以通过注解、XML 配置文件等方式灵活配置应用程序的各个部分,满足不同场景的需求。
可扩展
DispatcherServlet
提供了多种扩展点,可以方便地进行功能扩展。例如,可以自定义处理器映射、视图解析器、拦截器等,以实现特定的业务需求和功能。
配置方式
1. 纯 MVC 模式
配置方式: 需要手动配置 DispatcherServlet
和编写 web.xml
文件。
1.在 web.xml
文件中配置 DispatcherServlet
:
告诉 Web 容器如何加载和实例化 DispatcherServlet。
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.在 spring-servlet.xml
文件中配置 DispatcherServlet
的属性:
- 这部分配置告诉 DispatcherServlet 如何加载和解析 Spring MVC 配置文件。
<bean id="dispatcherServlet" class="org.springframework.web.servlet.DispatcherServlet">
<property name="contextConfigLocation" value="classpath:spring-mvc.xml" />
</bean>
3.使用 @Configuration
和 @EnableWebMvc
注解配置 DispatcherServlet
@Controller
注解用于标识一个类为 Controller,表示该类负责处理 Web 请求。@RequestMapping
注解用于映射请求 URL 到 Controller 中的方法。
@Controller
public class MyController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "hello"; // 视图名称
}
}
2. Spring Boot 模式
在 Spring Boot 中,默认情况下已经集成了 Spring MVC,并自动配置了 DispatcherServlet。因此,您不需要显式地配置 DispatcherServlet,它会自动启动并运行。
Spring Boot 中使用 DispatcherServlet 的方式:
- 创建 Controller: 使用
@Controller
注解标记您的 Controller 类,并使用@RequestMapping
注解映射请求 URL 到 Controller 方法。 - 启动应用程序: 运行 Spring Boot 应用程序,DispatcherServlet 会自动启动并处理请求。
@RestController
public class MyController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}
MyController
类被 @RestController
注解标记为 Controller,hello
方法被 @GetMapping
注解标记为处理 GET 请求 /hello
。当用户访问 /hello
路径时,DispatcherServlet 会找到 MyController
类,并调用 hello
方法,然后将返回值 "Hello, Spring Boot!" 返回给客户端。