关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

搞定Tomcat,这也太厉害了叭!

发布时间:2021-11-29 23:54:48

大部分企业的 Web 应用都运行在它上面,Tomcat 对于程序员来说算是老朋友了,那么今天带大家走近这位老朋友,看看它是如何处理 Web 请求,以及它内部的体系结构,这对帮助我们理解 Tomcat 的使用大有益处。

本文你将会学会如下内容:

  • Web 容器与 Tomcat
  • Tomcat 连接器
  • Tomcat 容器

Web 容器与 Tomcat

要说清楚 Tomcat 做的事情先要从早期的 Web 应用说起。

图 1:浏览器通过 HTTP 服务器获取静态资源

如图 1 所示,最开始用户通过浏览器查看诸如新闻之类的静态资源,此时就需要通过 HTTP 服务器向浏览器返回静态 HTML 资源,浏览器将解析的 HTML 呈现给使用者。

这里的 Web 容器就是用来存放 HTTP 服务器,能够处理网络请求并且进行响应。

随着互联网的发展,用户需求从静态资源转向了动态资源的获取,同时浏览器在资源获取的同时还会与服务端进行一些交互。

由此 Web 容器的功能开始有了扩展,除了能够处理 HTTP 请求,还需要 HTTP 服务器调用服务端程序也就是常说的 Web 应用。

图 2:通过 HTTP 服务器调用 Web 应用

针对这种需求,Sun 公司推出了 Servlet 技术, Servlet 是运行在服务端的 Java 小程序。

由于 Servlet 不能独立运行,因此需要由一个 Servlet 容器来承载它,并且对其进行初始化启动等管理操作。

图 3:Servlet 容器的引入

如图 3 所示,为了满足用户日益增常的需求在 Web 容器中加入了 Servlet 作为 Web 应用为用户提供动态资源。

为了承载 Servlet,也加入了 Servlet 容器,不过每个 Servlet 都代表一个业务类,包含了一些业务应用如果都接入到 Web 容器中会用户提供统一的服务响应就需要遵循统一的接口。

说白了就是要遵守一定规则才能放到 Servlet 容器中,方便进行管理,那么这个规则就是 Servlet 接口。从图中可以看出 Servlet 接口会对单个的 Servlet 进行标准定义。

图 4:Servlet 接口

如图 4 所示,对于 Servlet 接口而言定义了 init 方法用做 Servlet 资源的初始化,同时也定义 destroy 方法用做 Servlet 资源的释放。

其中 Service 方法用来实现具体的业务需求,可以看到该方法传入 ServletRequest 和 ServletResponse 两个参数,分别表示封装了用户的请求信息和 Servlet 的响应信息。

在后面我们会介绍到 Spring MVC 在 Tomcat 中运行时也是以 Servlet 的方式存在,由 DispatcherServlet 在 init 方法里创建 Spring MVC 容器。

接口中的 getServletConfig 方法会返回 ServletConfig,ServletConfig 是用来封装 Servlet 的初始化参数的,可以在 web.xml 配置 Servlet 参数,然后通过 getServletConfig 方法获取参数。

上面介绍了 Servlet 接口一下,再通过图 5 对 Servlet 接口调用的周边类进行深入了解。

图 5:Sevlet 类关系图

如图 5 所示,Servlet 接口依赖 ServletConfig 接口,该接口正好是用来处理 Servlet 配置参数的,ServletConfig 接口同时也会关联 ServletContext 获取 Servlet 上下文的信息。

Servlet 接口中的 service 方法依赖两个参数分别是 ServletRequest 和 ServletResponse。

同时有两个接口 HttpServletRequest 和 HttpServletResponse 会分别继承 ServletRequest 和 ServletResponse。

一般而言 Servlet 作为接口需要具体的实现类去实现这个接口,因此 Servlet 规范提供了一个抽象类名叫 GenericServlet,它实现了 Servlet。

接着有一个 HttpServlet 的类继承 GenericServlet,为了处理 HTTP 请求这类也会依赖 HttpServletRequest 和 HttpServletResponse。

Servlet 接口定义是 Servlet 容器的重要组成部分,Servlet 容器通过接口去管理接入的 Servlet 实体。

接下来看看 Servlet 容器的分类,这里按照工作模式将 Servlet 容器分为 3 类:

①独立运行的 Servlet 容器

在这种模式下,Servlet 容器作为构成 Web 服务器的一部分。当使用 Java 的 Web 服务器时会使用这种模式也是,Tomcat 的默认模式,如果不是基于 Java 的 Web 服务就需要使用下面两种模式。

②内置的 Servlet 容器

Servlet 容器由 Web 服务器插件和 Java 容器两部分组成。需要在 Web 服务器内部地址空间中打开一个 JVM,在此 JVM 上加载 Java 容器并运行 Servlet。

当容器请求 Servlet 的时候 Web 服务器插件会请求加载在这个 JVM 上的 Servlet,将请求通过 JNI 技术传递给 Java 容器,然后由 Java 容器把请求传给 Servlet 处理。

③外置的 Servlet 容器

Servlet 容器运行在 Web 服务器外部地址空问。通过 Web 服务器插件在 Web 服务器外部地址空间打开一个 JVM,用来加载 Java 容器来运行 Servlet。Web 服务器插件和 JVM 之间使用 IPC(进程间通信)机制通信。

Web 服务器将请求通过 IPC 技术传递给 Java 容器,然后 Java 容器把此请求交给 Servlet 来处理。

在了解 Servlet 接口规范和 Servlet 容器以后,我们知道如果需要加载不同的动态资源(Web 应用)需要利用 Servlet 容器去加载对应的 Servlet,那么这个加载过程是如何进行的?

我们接下来看看 Servlet 的请求和响应流程。



/template/Home/Zkeys/PC/Static