我们常说的 servlet 就是 DispatcherServlet 吗
不是。
很多人刚学 Spring MVC 时会把 Servlet 和 DispatcherServlet 混为一谈,但实际上:
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 的高级实现更多推荐


所有评论(0)