目录
4、Servlet 容器和 Web 服务器如何处理一个请求的?
我们简单的谈一谈关于 Web 服务器, Servlet 容器及其与 JVM 的关系。其实 Servlet 容器只不过是一个 Java 程序。
1、什么是 Web 服务器?
想要了解什么是 Servlet 容器,首先需要知道什么是 Web 服务器。
Web 服务器使用 HTTP 协议传输数据。在一般情况下,用户在浏览器(客户端)中键入 URL(例如www.baidu.com/static.html),并获取要读取的网页。所以服务器所做的就是向客户机发送一个网页。信息的交换采用指定请求和响应消息的格式的 HTTP 协议。
2、什么是 Servlet 容器?
正如我们看到的,用户/客户端只能从服务器请求静态网页。如果用户希望根据自己的输入阅读网页,那么这还不够好。Servlet 容器的基本思想是使用 Java 动态生成服务器端的网页。所以 Servlet 容器本质上是与 Servlet 交互的 Web 服务器的一部分。
“Servlet 容器”是一个装载一堆 Servlet 对象的“器具”(容器),并且具备管理这些对象的功能。
3、什么是 Servlet?
Servlet 是 javax.servlet 包中定义的接口。它声明了 Servlet 生命周期的三个基本方法:init()、service() 和 destroy()。它们由每个 Servlet Class(在 SDK 中定义或自定义)实现,并由服务器在特定时机调用。
- init() 方法在 Servlet 生命周期的初始化阶段调用。它被传递一个实现 javax.servlet.ServletConfig 接口的对象,该接口允许 Servlet 从 Web 应用程序访问初始化参数。
- service() 方法在初始化后对每个请求进行调用。每个请求都在自己的独立线程中提供服务。Web容器为每个请求调用 Servlet 的 service() 方法。service() 方法确认请求的类型,并将其分派给适当的方法来处理该请求。
- destroy() 方法在销毁 Servlet 对象时调用,用来释放所持有的资源。
从 Servlet 对象的生命周期中,我们可以看到 Servlet 类是由类加载器动态加载到容器中的。每个请求都在自己的线程中,Servlet 对象可以同时服务多个线程(线程不安全的)。当它不再被使用时,会被 JVM 垃圾收集。
像任何Java程序一样,Servlet 在 JVM 中运行。为了处理复杂的 HTTP 请求,Servlet 容器出现了。Servlet 容器负责 Servlet 的创建、执行和销毁。
4、Servlet 容器和 Web 服务器如何处理一个请求的?
- Web 服务器接收 HTTP 请求。
- Web 服务器将请求转发到 Servlet 容器。
- 如果对应的 Servlet 不在容器中,那么将被动态检索并加载到容器的地址空间中。
- 容器调用 init() 方法进行初始化(仅在第一次加载 Servlet 时调用一次)。
- 容器调用 Servlet 的 service() 方法来处理 HTTP 请求,即读取请求中的数据并构建响应。Servlet 将暂时保留在容器的地址空间中,可以继续处理其它 HTTP 请求。
- Web 服务器将动态生成的结果返回到浏览器/客户端。
5、JVM 的作用
Servlet 允许 JVM 在处理每个请求时使用单独的 Java 线程,这是 Servlet 容器的一个主要优点。每个 Servlet 是一个 Java 类,具有响应 HTTP 请求的特殊元素。
Servlet 容器的主要功能是将请求转发到正确的 Servlet 进行处理,并在 JVM 处理完后将动态生成的结果返回到正确的位置。
在大多数情况下, Servlet 容器在单个 JVM 中运行,但是当容器需要多个 JVM 时,会有一些其它的解决方案。