不是。

很多人刚学 Spring MVC 时会把 ServletDispatcherServlet 混为一谈,但实际上:

Servlet
  └── DispatcherServlet

DispatcherServlet 只是 Servlet 的一种特殊实现。


1. 什么是 Servlet

Servlet 是 Java Web 规范中的一个接口。

public interface Servlet {
    void init();
    void service();
    void destroy();
}

作用:

接收HTTP请求
处理请求
返回响应

例如最原始的写法:

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req,
                         HttpServletResponse resp) {

        resp.getWriter().write("hello");
    }
}

请求流程:

浏览器
 ↓
Tomcat
 ↓
HelloServlet
 ↓
响应

这里没有 Spring。


2. DispatcherServlet 是什么

Spring MVC 为了解决 Servlet 开发的问题,设计了:

DispatcherServlet

其继承关系:

Servlet
  ↓
GenericServlet
  ↓
HttpServlet
  ↓
FrameworkServlet
  ↓
DispatcherServlet

所以:

DispatcherServlet 本质上也是 Servlet

只是功能更强。


3. 为什么需要 DispatcherServlet

假设不用 Spring MVC。

每个接口都要写一个 Servlet:

UserServlet
OrderServlet
ProductServlet

Tomcat:

/user -> UserServlet
/order -> OrderServlet
/product -> ProductServlet

项目大了以后:

几十个
几百个
上千个Servlet

维护困难。


Spring MVC 改成:

所有请求
      ↓
DispatcherServlet
      ↓
Controller

例如:

@GetMapping("/user/{id}")
public User query(Long id)

开发者只写 Controller。

DispatcherServlet 帮你完成:

URL匹配
参数绑定
JSON转换
异常处理
视图解析

4. 请求到达 DispatcherServlet 后发生什么

例如:

GET /user/1

流程:

Tomcat
 ↓
DispatcherServlet
 ↓
HandlerMapping
 ↓
UserController
 ↓
UserService
 ↓
返回结果

Spring 内部

@GetMapping("/user/{id}")
public User get(Long id)

会被解析成:

URL:
/user/{id}

Method:
get()

DispatcherServlet 根据 URL 找到对应方法。


5. Spring Boot 中 DispatcherServlet 在哪注册

很多人没看到配置,以为没有 Servlet。

其实 Spring Boot 自动配置了:

DispatcherServletAutoConfiguration

创建:

@Bean
DispatcherServlet

然后注册:

ServletRegistrationBean

相当于:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        DispatcherServlet
    </servlet-class>
</servlet>

<servlet-mapping>
    <url-pattern>/</url-pattern>
</servlet-mapping>

只是 Spring Boot 帮你做了。


6. Filter、Servlet、Interceptor 的关系

这是面试常问的。

请求:

Browser
 ↓
Tomcat
 ↓
Filter
 ↓
DispatcherServlet
 ↓
Interceptor
 ↓
Controller

执行顺序:

Filter
 ↓
Interceptor.preHandle
 ↓
Controller
 ↓
Interceptor.postHandle
 ↓
Interceptor.afterCompletion
 ↓
Filter

其中:

Filter

属于 Servlet 规范

javax.servlet.Filter

Tomcat 管理。


DispatcherServlet

属于 Spring MVC

org.springframework.web.servlet.DispatcherServlet

Spring 管理。


Interceptor

属于 Spring MVC

HandlerInterceptor

由 DispatcherServlet 调用。


面试标准答案

如果面试官问:

我们常说的 Servlet 就是 DispatcherServlet 吗?

可以回答:

不是。Servlet 是 Java Web 规范中的基础接口,用于处理 HTTP 请求;DispatcherServlet 是 Spring MVC 提供的一个前端控制器(Front Controller),它本身继承自 HttpServlet,因此本质上也是一个 Servlet。

在传统 Java Web 中,一个 URL 可能对应一个 Servlet;而在 Spring MVC 中,所有请求统一进入 DispatcherServlet,再由它根据 HandlerMapping 分发到具体的 Controller 方法处理。

因此 DispatcherServlet 是 Servlet 的一种实现,但 Servlet 不等于 DispatcherServlet。

一句话总结:

Servlet 是规范
DispatcherServlet 是 Spring MVC 对 Servlet 的高级实现
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐