Servlet:Web 开发的基石
在 Java Web 开发早期,Servlet 是绝对的主角。虽然现在的框架层出不穷,但回顾 Servlet 时代,其逻辑清晰、职责分明的设计思想依然值得借鉴。Servlet 的核心任务很明确:统一接收请求、处理业务、返回响应。
网络编程离不开 Socket,但直接操作 Socket 过于繁琐且协议复杂。Servlet(以 HttpServlet 为例)屏蔽了底层细节,将 HTTP 请求封装为 HttpServletRequest,响应封装为 HttpServletResponse。开发者只需关注业务逻辑,无需处理底层的网络 IO 细节。这种分离正是框架设计的初衷。
使用 Servlet 通常遵循以下步骤:
- 继承 HttpServlet 并重写 doGet() 或 doPost() 方法。
- 从 Request 中提取参数,调用 Service/Dao 层准备数据。
- 将结果放入 Response,通过转发或重定向跳转页面。
- 在 web.xml 中注册 Servlet 并配置 url-pattern。
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4">
<servlet>
<servlet-name>ShoppingServlet</servlet-name>
<servlet-class>com.myTest.ShoppingServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShoppingServlet</servlet-name>
<url-pattern>/shop/ShoppingServlet</url-pattern>
</servlet-mapping>
</web-app>
原生 Servlet 的局限
随着系统复杂度提升,原生 Servlet 逐渐显露出不足:
- 每个 Servlet 仅处理单一请求,类数量膨胀导致维护困难。
- 参数提取、校验、视图跳转等重复性工作需手动编写。
- URL 映射硬编码在 web.xml 中,缺乏灵活性。
- 业务逻辑与前端渲染耦合紧密,难以适应技术栈变更。
为了解决这些问题,我们需要一个更强大的调度者来接管这些杂务,这就是 DispatcherServlet 登场的原因。
Spring MVC 的两级控制器架构
Spring MVC 引入了两级控制器概念。DispatcherServlet 作为前端控制器(Front Controller),负责统一调度;而具体的业务逻辑则由次级控制器(Handler)处理。虽然很多文档称其为 Controller,但在 Spring MVC 内部机制中,它被称为 Handler。这就像 List 接口可以有 ArrayList 实现一样,Handler 是一个抽象概念,Controller 是其具体实现之一。


