Servlet 到底是什么?
Servlet 是 Java 提供的一种用于构建 Web 服务器端程序的技术。更准确地说,Servlet 是实现了 Java Servlet API 接口的 Java 类。
它的核心作用是:
- 接收和处理来自客户端的 HTTP 请求。
- 生成并发送 HTTP 响应给客户端。
简单来说,我们可以将 Servlet 理解为一个运行在 Web 服务器(更精确地说是 Servlet 容器,如 Tomcat, Jetty, Undertow 等)中,专门用来处理 Web 请求和响应的 Java 程序组件。
它不是一个独立的、可以像 main 方法那样直接运行的 Java 类。它必须部署到符合 Servlet 规范的容器中才能工作。
它和普通的 Java 类有什么区别?
最大的区别在于它们的 用途、运行环境和生命周期管理方式:
-
用途 (Purpose):
- 普通 Java 类: 设计用于执行任何 Java 任务,可以是独立的应用程序、库的一部分、数据结构等等。它们执行的是通用的计算逻辑。
- Servlet: 专门设计用于处理 Web 请求(通常是 HTTP 请求)。它们是 Web 应用的一部分,响应特定的 URL 请求。
-
运行环境 (Execution Environment):
- 普通 Java 类: 可以在任何安装了 JRE 的环境中独立运行,例如通过
java ClassName命令。 - Servlet: 必须运行在 Servlet 容器(也称为 Web 容器)中。Servlet 容器提供了运行 Servlet 所需的环境(如网络连接管理、请求解析、线程管理、生命周期管理等)。你不能像运行普通 Java 类那样直接运行一个 Servlet 类。
- 普通 Java 类: 可以在任何安装了 JRE 的环境中独立运行,例如通过
-
生命周期管理 (Lifecycle Management):
- 普通 Java 类: 它们的生命周期通常由程序员通过
new关键字创建对象,以及通过垃圾回收器自动回收来管理。 - Servlet: 它们的生命周期完全由 Servlet 容器 管理。容器负责实例化 Servlet 对象、调用其生命周期方法(
init(),service(),destroy())以及在需要时销毁 Servlet 实例。开发过程中我们不用直接创建或销毁 Servlet 实例。
- 普通 Java 类: 它们的生命周期通常由程序员通过
-
如何被调用 (How It’s Invoked):
- 普通 Java 类: 通常通过调用其
main方法(作为应用程序入口)或者被其他对象调用其方法来执行。 - Servlet: 由 Servlet 容器 在接收到与该 Servlet 映射的 URL 请求时调用其
service()方法(或doGet(),doPost()等方法,如果继承了HttpServlet)。Servlet 的调用是被动的,由外部的 Web 请求触发。
- 普通 Java 类: 通常通过调用其
-
接口与规范 (Interface & Specification):
- 普通 Java 类: 可以实现或继承任何接口或类,通常没有强制实现的特定 Web 相关接口。
- Servlet: 必须实现
javax.servlet.Servlet接口(或者更常见的是继承实现了该接口的javax.servlet.GenericServlet或javax.servlet.http.HttpServlet抽象类)。实现这个接口是为了遵循 Servlet API 规范,以便容器能够识别和管理它。
-
线程模型 (Threading Model):
- 普通 Java 类: 如果用作多线程环境下的共享资源,需要我们自己负责线程安全。
- Servlet: 默认情况下,Servlet 容器会为每个到来的请求分配一个线程,但通常只创建一个 Servlet 实例来处理所有请求。这意味着 Servlet 实例是多线程共享的。因此,Servlet 需要特别注意线程安全问题,避免在实例变量中存储线程非安全的状态。这一点是 Servlet 编程中一个重要的注意事项。
一个比喻:
- 普通 Java 类 就像一个普通的工人,他可以做各种工作,由人(程序员)直接指挥他开始工作(调用方法)。
- Servlet 就像一个在工厂(Servlet 容器)里工作的流水线工人,他只负责处理从流水线(网络)送来的特定类型的“零件”(Web 请求),并且他的工作(生命周期、何时处理哪个请求)由工厂的管理系统(Servlet 容器)来安排和调度。
总结:
Servlet 是一种特殊的 Java 类,它是 Java Web 开发的核心组件,负责处理 Web 请求和生成 Web 响应。它与普通 Java 类最大的区别在于其Web 处理能力、必须运行在Servlet 容器中,并且其生命周期由容器管理。学习 Servlet 就是学习如何编写遵循 Servlet API 规范的 Java 类,并理解它们如何在 Web 容器中工作。

被折叠的 条评论
为什么被折叠?



