在 Java Web 开发中,Servlet
、HttpServlet
和 DispatcherServlet
是非常常见的类。
一、Servlet 接口(javax.servlet.Servlet)
✅ 基本介绍:
- 所属包:
javax.servlet.Servlet
- 作用:是所有 Servlet 的根接口,定义了 Servlet 生命周期的基本方法。
- 特点:
- 与协议无关(可以用于任何协议,如 HTTP、FTP 等)。
- 是一个底层接口,通常我们不会直接实现它,而是继承其子类(如
HttpServlet
)。
🧱 核心方法:
方法 | 描述 |
---|---|
init(ServletConfig config) | 初始化方法,在第一次请求时调用一次 |
service(ServletRequest req, ServletResponse res) | 处理客户端请求的核心方法 |
destroy() | 销毁方法,在服务器关闭或重新部署时调用 |
getServletInfo() | 返回有关该 Servlet 的信息 |
getServletConfig() | 返回配置对象 |
💡 示例代码:
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig config) {
System.out.println(" <init-param> " + servletConfig.getInitParameter("name"));
}
@Override
public void service(ServletRequest request, ServletResponse response) throws IOException {
response.getWriter().write("Hello from Servlet!");
}
@Override
public void destroy() { }
@Override
public String getServletInfo() {
return "A simple servlet";
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
⚠️ 注意:一般不建议直接实现
Servlet
接口,而是继承HttpServlet
。
配置普通 Servlet
假设我们有一个简单的Servlet类名为HelloServlet
,其完整类路径为com.example.HelloServlet
。在项目的部署描述符文件web.xml
中进行配置。
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
<!-- 可选:初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>张三</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
这里定义了一个名为HelloServlet
的Servlet,并将其映射到URL模式/hello
上。当用户访问这个URL时,就会触发这个Servlet。
二、HttpServlet 抽象类(javax.servlet.http.HttpServlet)
✅ 基本介绍:
- 所属包:
javax.servlet.http.HttpServlet
- 作用:专门用于处理 HTTP 协议的抽象类,是
Servlet
的扩展。 - 特点:
- 只处理 HTTP 请求(GET、POST、PUT、DELETE 等)。
- 提供了
doGet()
、doPost()
等方法,开发者只需重写这些方法即可。
🧱 核心方法:
方法 | 描述 |
---|---|
doGet(HttpServletRequest req, HttpServletResponse resp) | 处理 GET 请求 |
doPost(HttpServletRequest req, HttpServletResponse resp) | 处理 POST 请求 |
service(HttpServletRequest req, HttpServletResponse resp) | 根据 HTTP 方法自动调用 doGet/doPost 等 |
💡 示例代码:
public class HelloHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<h1>Hello from HttpServlet!</h1>");
}
}
✅ 更推荐使用
HttpServlet
来开发基于 HTTP 的 Web 应用。
由于HttpServlet
是处理HTTP请求的特殊类型,它的配置方式与普通的Servlet几乎相同。如果我们的HttpServlet
实现类名为HelloHttpServlet
,且位于com.example
包下,我们可以这样配置:
<servlet>
<servlet-name>HelloHttpServlet</servlet-name>
<servlet-class>com.example.HelloHttpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloHttpServlet</servlet-name>
<url-pattern>/httpHello</url-pattern>
</servlet-mapping>
三、DispatcherServlet(org.springframework.web.servlet.DispatcherServlet)
✅ 基本介绍:
- 所属框架:Spring MVC
- 作用:前端控制器(Front Controller),负责接收所有请求并协调 Spring MVC 各个组件进行处理。
- 特点:
- 是 Spring MVC 的核心组件之一。
- 负责请求分发、视图解析、异常处理等。
- 不是标准的 Servlet,而是对
HttpServlet
的封装和增强。
🧱 工作流程简述:
- 用户发送 HTTP 请求。
DispatcherServlet
拦截请求。- 使用
HandlerMapping
找到对应的 Controller。 - 调用 Controller 并获取 Model 数据。
- 使用
ViewResolver
解析视图名。 - 渲染视图并返回响应。
💡 示例配置(web.xml + spring-servlet.xml):
web.xml 配置:
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
spring-servlet.xml 配置:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
示例 Controller:
@Controller
public class HelloController {
@RequestMapping("/hello")
public String sayHello(Model model) {
model.addAttribute("message", "Hello from DispatcherServlet!");
return "hello"; // 对应 /WEB-INF/views/hello.jsp
}
}
四、三者的关系总结
类型 | 层级 | 用途 | 是否协议相关 | 是否 Spring 组件 |
---|---|---|---|---|
Servlet | 最基础接口 | 定义生命周期和基本操作 | 否 | 否 |
HttpServlet | 抽象类 | 专用于处理 HTTP 请求 | 是(HTTP) | 否 |
DispatcherServlet | Spring MVC 核心类 | Spring MVC 的前端控制器,整合 MVC 流程 | 是(HTTP) | 是 |
五、类图结构示意(简化版)
DispatcherServlet
是 Spring MVC 中的一个特殊 Servlet,继承自FrameworkServlet
,而FrameworkServlet
又继承自HttpServlet
。
在这里插入图片描述
六、应用场景对比
场景 | 推荐使用 |
---|---|
编写简单的 HTTP 请求处理逻辑 | HttpServlet |
构建模块化、可维护的 Web 应用 | DispatcherServlet (配合 Spring MVC) |
实现非 HTTP 协议的服务 | 自定义 Servlet 实现 |
七、结语
- 如果你只是想快速构建一个处理 HTTP 请求的小型应用,可以选择
HttpServlet
; - 如果你需要构建大型、模块化的 Web 应用,强烈推荐使用 Spring MVC 和
DispatcherServlet
; Servlet
是整个 Java Web 体系的基础,了解它是掌握现代框架的前提。