Servlet是Java程序的一种,专门用于运行在Web服务器上,处理和响应来自客户端(通常是浏览器)的HTTP请求。

你可以把它们想象成:
- Java程序:这是一个非常广泛的概念,指的是用Java语言编写的任何应用程序,它可以是一个桌面应用(如记事本)、一个移动应用(Android App)、一个命令行工具,也可以是一个Web应用。
- Servlet:它是Java程序的一个特殊子集,专门为Web应用而生,它就像一个“守门员”或“前台接待”,专门在Web服务器里工作,负责接收用户的HTTP请求(比如点击链接、提交表单),然后进行处理,并返回一个HTTP响应(通常是HTML页面)。
下面我们从几个维度来深入剖析这个关系。
核心定义与类比
什么是Java程序?
Java程序是基于Java语言编写的软件,它遵循Java的规范,由Java虚拟机执行,其形态多种多样:
- 独立应用程序:有独立的入口点(
public static void main(String[] args)),直接在操作系统上运行,一个计算器、一个游戏。 - Web应用程序:运行在服务器上,通过网络提供服务,Servlet就是这类应用的核心组件。
什么是Servlet?
Servlet(Server Applet,服务器小程序)是Java EE(现在叫Jakarta EE)规范的一部分,它不是一个可以直接运行的程序,而是一个接口,开发者通过实现这个接口来创建可以处理HTTP请求的Java类。

核心类比:餐厅
- Web服务器:整个餐厅。
- Java Servlet容器:餐厅的“前台”或“服务生团队”,Tomcat、Jetty就是最常见的容器,它负责管理Servlet的生命周期,接收请求并分发。
- Servlet:餐厅里的“点菜员”或“厨师”,他不能自己开餐厅,必须在前台(容器)的安排下工作,他的职责是:
- 接收顾客(浏览器)的点单(HTTP请求)。
- 根据菜单(业务逻辑)做菜(处理请求)。
- 把做好的菜(HTTP响应,通常是HTML)交给前台,由前台端给顾客。
- Java程序:餐厅里的所有人,包括厨师、服务员、经理、收银员等,Servlet只是其中一个特定角色的“厨师”。
技术层面的关系
1 依赖关系
Servlet本身依赖于Java标准库,特别是Java EE(或Jakarta EE)提供的API,这些API(如 javax.servlet.http.HttpServlet)定义了Servlet的规范和功能,写一个Servlet,你首先得有一个Java程序的基础。
2 生命周期
Servlet的生命周期由Servlet容器(如Tomcat)管理,而不是由开发者手动控制,一个普通的Java程序是自己创建、自己运行、自己销毁的,而Servlet的生命周期是固定的,包含以下几个阶段:
- 加载和实例化:当第一个请求到达时,容器会加载Servlet类并创建一个实例(或者服务器启动时预加载)。
- 初始化:容器调用
init()方法,这个方法只在Servlet的生命周期中执行一次,用于做一些初始化工作,比如建立数据库连接、加载配置文件等。 - 请求处理:对于每一个到来的请求,容器都会创建一个新的线程,并调用
service()方法(开发者通常重写doGet(),doPost()等方法),这个阶段可以被调用无数次。 - 销毁:当服务器关闭或应用被卸载时,容器会调用
destroy()方法,这个方法也只执行一次,用于释放资源,如关闭数据库连接。
与普通Java程序对比:

- 普通Java程序:
main()-> 业务逻辑 ->System.exit()。 - Servlet:
init()(一次) ->service()(多次) ->destroy()(一次)。
3 运行环境
- 普通Java程序:在独立的JVM中运行。
- Servlet:必须在Servlet容器中运行,容器提供了一个运行环境,包括处理网络通信、多线程管理、会话管理等复杂功能,让开发者可以专注于业务逻辑。
一个简单的例子来展示关系
下面我们通过一个完整的例子来看一个Servlet是如何作为一个Java程序来工作的。
目标:创建一个简单的Servlet,当用户访问 http://localhost:8080/myapp/hello 时,浏览器上显示 "Hello, Servlet World!"。
步骤1:创建一个普通的Java类(它将成为一个Servlet)
我们创建一个名为 HelloServlet.java 的类,它继承自 HttpServlet,并重写 doGet 方法。
// HelloServlet.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; // 用于Servlet 3.0+的注解配置
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 这是一个Servlet,它是一个特殊的Java程序。
* 它的功能是处理GET请求并返回一个简单的HTML响应。
*/
@WebServlet("/hello") // 这个注解告诉容器,这个Servlet的访问路径是 "/hello"
public class HelloServlet extends HttpServlet {
// 初始化方法,容器启动时调用一次
@Override
public void init() throws ServletException {
System.out.println("HelloServlet 正在被初始化...");
}
// 处理GET请求的核心方法
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 设置响应内容类型为HTML
response.setContentType("text/html;charset=UTF-8");
// 2. 获取一个输出流,用于向客户端写入响应内容
PrintWriter out = response.getWriter();
// 3. 写入HTML内容
out.println("<html>");
out.println("<head><title>我的第一个Servlet</title></head>");
out.println("<body>");
out.println("<h1>Hello, Servlet World!</h1>");
out.println("</body>");
out.println("</html>");
}
// 销毁方法,容器关闭时调用一次
@Override
public void destroy() {
System.out.println("HelloServlet 正在被销毁...");
}
}
代码分析:
public class HelloServlet extends HttpServlet:这行代码表明HelloServlet是一个Java类(因为它有class关键字),并且它继承了HttpServlet,从而具备了处理HTTP请求的能力。@WebServlet("/hello"):这是一个注解,是现代Servlet开发的主流方式,它告诉Servlet容器:“我是一个Servlet,请把所有对/hello路径的请求交给我处理”。doGet(...):这是Java程序中的一个方法,它接收HttpServletRequest和HttpServletResponse两个对象作为参数,这两个对象由容器创建并传入,分别代表了请求和响应。
步骤2:打包和部署
- 将
HelloServlet.class打包成一个WAR(Web Application Archive)文件。 - 将这个WAR文件部署到Servlet容器(如Tomcat)的
webapps目录下。 - 启动Tomcat服务器。
步骤3:运行和访问
- 浏览器访问
http://localhost:8080/myapp/hello。 - Tomcat(容器)接收到请求,发现URL路径是
/hello。 - Tomcat根据
@WebServlet注解找到HelloServlet这个Java类。 - Tomcat调用
HelloServlet的service()方法(内部会根据请求类型调用doGet())。 HelloServlet中的Java代码被执行,生成HTML内容,并通过response对象返回给浏览器。- 浏览器接收到HTML并渲染,显示 "Hello, Servlet World!"。
这个过程清晰地表明:
Servlet的执行,本质上就是容器在调用一个Java类(HelloServlet)的方法,这个Java类遵循Servlet的规范,并运行在容器提供的特殊环境中。
总结与对比
| 特性 | 普通 Java 程序 | Servlet (Java Web 程序) |
|---|---|---|
| 定义 | 用Java语言编写的任何应用程序 | 实现了Servlet接口的Java类,用于Web开发 |
| 运行环境 | 独立的JVM | Servlet容器 (如Tomcat, Jetty) |
| 入口点 | public static void main(String[] args) |
无 main 方法,由容器通过 init(), service(), destroy() 管理生命周期 |
| 主要用途 | 桌面应用、工具、移动应用等 | 处理HTTP请求,生成动态Web内容 |
| 通信方式 | 文件I/O、网络Socket、GUI交互等 | HTTP请求/响应 |
| 依赖 | Java SE标准库 | Java EE (Jakarta EE) API + Servlet容器 |
Servlet是Java技术在Web领域的一个具体应用和规范,它不是Java的对立面,而是Java程序为了适应Web服务器环境而演化出的一种特殊形态。 学习Servlet,就是学习如何用Java语言来编写能够响应网络请求的服务器端组件,在现代Java Web开发中,虽然Spring MVC等框架已经成为了主流,但它们在底层依然是基于Servlet原理工作的,理解Servlet是理解整个Java Web技术栈的基石。
