杰瑞科技汇

Java程序与Servlet如何交互协作?

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

Java程序与Servlet如何交互协作?-图1
(图片来源网络,侵删)

你可以把它们想象成:

  • 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类。

Java程序与Servlet如何交互协作?-图2
(图片来源网络,侵删)

核心类比:餐厅

  • Web服务器:整个餐厅。
  • Java Servlet容器:餐厅的“前台”或“服务生团队”,Tomcat、Jetty就是最常见的容器,它负责管理Servlet的生命周期,接收请求并分发。
  • Servlet:餐厅里的“点菜员”或“厨师”,他不能自己开餐厅,必须在前台(容器)的安排下工作,他的职责是:
    1. 接收顾客(浏览器)的点单(HTTP请求)。
    2. 根据菜单(业务逻辑)做菜(处理请求)。
    3. 把做好的菜(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的生命周期是固定的,包含以下几个阶段:

  1. 加载和实例化:当第一个请求到达时,容器会加载Servlet类并创建一个实例(或者服务器启动时预加载)。
  2. 初始化:容器调用 init() 方法,这个方法只在Servlet的生命周期中执行一次,用于做一些初始化工作,比如建立数据库连接、加载配置文件等。
  3. 请求处理:对于每一个到来的请求,容器都会创建一个新的线程,并调用 service() 方法(开发者通常重写 doGet(), doPost() 等方法),这个阶段可以被调用无数次
  4. 销毁:当服务器关闭或应用被卸载时,容器会调用 destroy() 方法,这个方法也只执行一次,用于释放资源,如关闭数据库连接。

与普通Java程序对比

Java程序与Servlet如何交互协作?-图3
(图片来源网络,侵删)
  • 普通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程序中的一个方法,它接收 HttpServletRequestHttpServletResponse 两个对象作为参数,这两个对象由容器创建并传入,分别代表了请求和响应。

步骤2:打包和部署

  1. HelloServlet.class 打包成一个WAR(Web Application Archive)文件。
  2. 将这个WAR文件部署到Servlet容器(如Tomcat)的 webapps 目录下。
  3. 启动Tomcat服务器。

步骤3:运行和访问

  1. 浏览器访问 http://localhost:8080/myapp/hello
  2. Tomcat(容器)接收到请求,发现URL路径是 /hello
  3. Tomcat根据 @WebServlet 注解找到 HelloServlet 这个Java类。
  4. Tomcat调用 HelloServletservice() 方法(内部会根据请求类型调用 doGet())。
  5. HelloServlet 中的Java代码被执行,生成HTML内容,并通过 response 对象返回给浏览器。
  6. 浏览器接收到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技术栈的基石。

分享:
扫描分享到社交APP
上一篇
下一篇