Servlet 的工作原理,在我开始解释 servlet 如何工作之前,让我们熟悉这三个术语。
Web 服务器:它可以处理客户端发送的 HTTP 请求,并通过 HTTP 响应响应请求。
Web 应用(webapp):我在本指南中将其称为 webapp,基本上该项目是您的 Web 应用,它是 servlet 的集合。
Web 容器:也称为 Servlet 容器和 Servlet 引擎,它是 Web Server 的一部分,与 Servlet 交互。这是管理 Servlet 生命周期的 Web Server 的主要组件。
您会发现本指南的某些部分已在 servlet 生命周期指南中介绍,但本指南主要介绍 servlet 应用(webapp)的工作,而不是生命周期的步骤。我强烈建议您阅读本文,深入了解 servlet 的实际工作原理。
Servlet 如何工作?
1)当 Web 服务器(例如 Apache Tomcat)启动时,servlet 容器部署并加载所有 servlet。在此步骤中,Servlet 容器创建ServletContext
对象。ServletContex
是一个接口,它定义了可以用来与 servlet 容器通信的方法集。
注:每个 webapp 只有一个
ServletContext
,这对所有 servlet 都是通用的。ServletContext
有几个有用的方法,如addListener()
,addFilter()
等。现在我不解释它们,因为我将在一个关于ServletContext
的单独文本中介绍它们。
2)一旦加载了 servlet,servlet 容器就会创建 servlet 类的实例。对于每个实例化的 servlet,调用其init()
方法。
3)客户端(用户浏览器)向某个端口上的 Web 服务器发送 Http 请求。每次 Web 服务器收到请求时,servlet 容器都会创建HttpServletRequest
和HttpServletResponse
对象。HttpServletRequest
对象提供对请求信息的访问,HttpServletResponse
对象允许我们在将 http 响应发送到客户端之前对其进行格式化和更改。
servlet 容器生成一个新线程,该线程为每个客户端请求调用service()
方法。service()
方法根据请求类型将请求调度到正确的处理程序方法。
例如,如果服务器收到Get
请求,则service()
方法会通过使用请求参数调用doGet()
方法将请求分派给doGet()
方法。类似地,诸如Post
,Head
,Put
等的请求被 servlet 的service()
方法分派给相应的处理程序doPost()
,doHead()
,doPut()
等。
4)当 servlet 容器关闭时,它会卸载所有 servlet 并为每个初始化的 servlet 调用destroy()
方法。