Servlet是什么

Servlet 是 Server Applet 的缩写,译作“服务器端小程序”,是一种使用 Java 语言来开发动态网站的技术。它可以接收客户端发送过来的请求,并响应数据给客户端。

Java 本身是一种十分强大的通用型编程语言,本身就具备处理 HTTP 请求、访问数据以及生成 HTML 页面代码等开发动态网站所需的能力。理论上,我们完全可以使用原生的 Java 来开发动态网站。

但使用原生的 Java 开发动态网站却并非易事,需要我们自己去解析 HTTP 请求的请求头、分析用户的请求参数、加载数据库组件等等,十分麻烦。这就导致使用原生 Java 开发动态网站几乎是一件不能被接受的事情。正是基于以上原因,Java 官方后来推出了 Servlet 技术。

Servlet 是基于 Java 的,它对开发动态网站需要使用的原生 Java API 进行了封装,形成了一套新的 API:Servlet API。Servlet 虽然被称作“小程序”,但是它的功能却异常强大,Java 能做的事情,Servlet 也能做。

使用 Servlet 开发动态网站非常方便,开发人员只需要集中精力对业务逻辑进行处理即可,而不需要为那些基础性的、通用性的功能编写代码,这使得 Servlet 在动态网站开发领域具备了很高的实用性。

可以这么说,Servlet 是 Sun 公司推出的一种基于 Java 的动态网站开发技术。编写 Servlet 代码需要遵循 Java 语法,Servlet 程序本质上其实就是一个按照 Servlet 规范编写的 Java 程序。与普通的 Java 程序一样,Servlet 程序的源代码也需要先编译成字节码文件(.class文件),然后再部署到服务器运行。

Servlet 具有以下特点:
  • Servlet 提供了可被服务器动态加载并执行的程序代码,为来自客户端的请求提供服务。
  • Servlet 完全使用 Java 语言编写,因此想要运行 Servlet 的服务器必须支持 Java 语言。
  • Servlet 是一种在服务器端运行的小程序,它不依赖于浏览器,不管浏览器是否支持 Java 语言,都能请求方法服务器端的 Servlet.

Servlet 是一种规范

所有的 Servlet 功能都是通过一个名为 jakarta.servlet.Servlet 的接口(Interface)向外暴露的,该接口的源码如下。
public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

我们可以看到,Servlet 接口仅提供了 5 抽象方法,并未给出任何方法实现,这是因为 Servlet 其实只是一种 Java Web 开发的规范,或者说是一套 Java Web 开发的技术标准。仅仅有规范是无法做任何事的,必须要有人去实现这个 Servlet 接口并重写其中方法,实现 Servlet 规范提到的各种功能才行。

例如:
public class ServletDemo implements Servlet {
    //TODO:
}

直接实现 Servlet 接口比较麻烦,需要实现多个方法,所以 Servlet 规范又提供了两个抽象类,分别是 GenericServlet 类和 HttpServlet 类,它们各自都实现了 Servlet 接口的很多常用功能。和 GenericServlet 类相比,HttpServlet 类更加方便,所以实际开发中一般都继承自 HttpServlet 类。

Servlet 规范是开放的,除了 Sun 公司之外,其它公司也可以实现 Servlet 规范,目前常见的实现了 Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为“Servlet 容器”。

关于 Servlet 容器的具体内容,我们会在《Servlet容器》一节中进行详细的介绍。

Servlet 版本

截止到 2023 年 1 月,Servlet 的最新版为 Servlet  6.1。下表列出了各种主要 Servlet 版本的发布日期及其对应的 Java 版本。
Servlet 版本 发布日期 Java EE 版本 Java SE
Servlet 6.1 - Jakarta EE 10 Java 17 及以上
Servlet 6.0 - Jakarta EE 10 Java 11 及以上
Servlet 5.0 - Jakarta EE 9 Java 8 及以上
Servlet 4.0 2017 年 9 月 Java EE 8 / Jakarta EE 8 Java 8 及以上
Servlet 3.1 2013 年 5 月 Java EE 7 Java 7 及以上
Servlet 3.0 2009 年 12 月 Java EE 6  Java 6 及以上
Servlet 2.5 2005 年 10 月 Java EE 5  Java5 及以上
Servlet 2.4 2003 年 11 月 J2EE 1.4  Java 1.4 及以上
Servlet 2.3 2001 年 8 月 J2EE 1.3  Java 1.3 及以上
Servlet 2.2 1999 年 8 月 J2EE 1.2  java 1.1 及以上
Servlet 2.1 1998 年 11 月 未指定  
Servlet 2.0   JDK 1.1  
Servlet 1.0 1997 年 6 月    

注意:2017 年 9 月,甲骨文宣布 Java EE 将提交给 Eclipse 基金会。“Java”是甲骨文拥有的商标,因此“Java EE”被重命名为“Jakarta EE”,因此从 Servlet 5.0 版本开始,所有与 Servlet 规范相关的类或接口都由 javax.servlet.xxx 修改为 jakarta.servlet.xxx。

关  闭