3.2.7.4.DispatcherServlet
Spring MVC 的前端控制器,接收所有 HTTP 请求并根据请求分发到对应的处理器方法。
常用方法:
doService():处理请求并返回响应。

DispatcherServlet 是 Spring 框架中最核心的组件之一,主要负责处理客户端的 HTTP 请求,调度各个处理器(Controller),并最终将响应返回给客户端。
它是 Spring MVC 架构中的前端控制器(Front Controller)。前端控制器模式是一种设计模式,它通过一个中央组件来协调请求和响应的处理。
3.2.7.4.1.DispatcherServlet 的工作流程
DispatcherServlet 的主要任务是根据请求的 URL 找到适当的处理器(通常是 Controller),然后将请求交给该处理器进行处理,处理完后返回响应给客户端。
其工作流程大致如下:
1)接收请求: 当客户端发起请求时,DispatcherServlet 会接收到所有的 HTTP 请求(通过 web.xml 配置或者 Java 配置的方式映射)。
2)解析请求: DispatcherServlet 会解析请求的 URL,识别请求的类型(GET、POST 等),并确定应该由哪个 Controller 来处理这个请求。
3)选择处理器: DispatcherServlet 会通过 HandlerMapping 查找哪个 Controller 对应当前的请求 URL。HandlerMapping 会根据请求的 URL 和请求方法(GET、POST 等)来查找合适的 Handler(处理器)。
4)执行处理器: 一旦确定了处理器,DispatcherServlet 会将请求转发给对应的 Controller 中的处理方法。此时,Controller 可以进行业务逻辑处理,并返回一个 ModelAndView 对象。
5)调用视图解析器: DispatcherServlet 会通过 ViewResolver 来查找并返回视图(如 JSP、Thymeleaf 等)。这个视图将最终被呈现给用户。
6)渲染视图: 根据 ViewResolver 返回的视图,DispatcherServlet 会将模型数据填充到视图中,生成最终的响应内容并返回给客户端。
3.2.7.4.2.DispatcherServlet 配置
在 Spring MVC 中,DispatcherServlet 通常在 web.xml 或 Java 配置类中进行配置。
下面是一个典型的配置示例:
使用 web.xml 配置:
xml
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/application-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> |
使用 Java 配置:
@Configuration @EnableWebMvc @ComponentScan(basePackages = "com.example.controller") public class WebConfig implements WebMvcConfigurer { @Bean public DispatcherServlet dispatcherServlet() { return new DispatcherServlet(); } @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("home"); } } |
3.2.7.4.3.DispatcherServlet 的常用组件
1)HandlerMapping:
HandlerMapping 是一个接口,它的实现类负责根据请求的 URL 映射到具体的 Controller。例如,RequestMappingHandlerMapping 是最常见的实现类,它会根据方法上的 @RequestMapping 注解来映射请求。
2)HandlerAdapter:
HandlerAdapter 是一个接口,它的实现类负责调用处理器方法并处理返回值。常见的实现类包括 RequestMappingHandlerAdapter,它会调用标注了 @RequestMapping 注解的方法并返回结果。
3)ViewResolver:
ViewResolver 是一个接口,负责将逻辑视图名解析成具体的视图对象(如 JSP、Thymeleaf 模板)。常见的实现类有 InternalResourceViewResolver(JSP 视图)和 ThymeleafViewResolver(Thymeleaf 视图)。
4)LocaleResolver:
LocaleResolver 负责处理请求的国际化问题,根据请求的区域信息(如语言、国家)来选择对应的语言资源文件。
5)ExceptionResolver:
ExceptionResolver 用于统一处理异常,它会捕捉到 Controller 层抛出的异常,并返回合适的响应(如 JSON、HTML 错误页面等)。
3.2.7.4.4.DispatcherServlet 相关的注解
Spring 通过注解来简化 DispatcherServlet 的配置和使用,常见的注解包括:
1)@Controller:标记一个类为 Controller,处理客户端的请求。
2)@RequestMapping:用于方法上,映射一个 HTTP 请求到该方法。
3)@GetMapping, @PostMapping 等:这些是 @RequestMapping 的快捷方式,分别用于处理 GET 和 POST 请求。
4)@ResponseBody:表示方法的返回值直接作为 HTTP 响应体,通常用在 REST 风格的接口中。
3.2.7.4.5.DispatcherServlet 的生命周期
DispatcherServlet 作为一个 Servlet,其生命周期和其他 Servlet 类似,通常包括以下几个阶段:
1)初始化:通过 web.xml 或 Java 配置进行初始化,加载 Spring 配置文件并创建上下文(ApplicationContext)。
2)处理请求:接收到请求时,DispatcherServlet 会根据配置的 HandlerMapping 和 HandlerAdapter 查找并调用对应的处理器。
3)生成响应:调用视图解析器生成视图并渲染,最后返回给客户端。
4)销毁:当应用停止时,DispatcherServlet 会销毁,并释放相关资源。
