Tomcat 是什么

为什么说 Tomcat 既是 Web 服务器又是 Servlet 容器?

什么是 Web 服务器

一个请求的过程可以看成是一个从 Web 服务器获取资源的过程:客户端通过一个 url 地址访问 DNS 服务器,DNS 将 url 解析成对应的 ip 地址,向暴露的公网中的对应 ip 的服务器发起请求,服务器将资源返回给客户端。

因此我们可以从作用的角度给 Web 服务器一个简单的定义:接受网络上的请求,处理并返回结果的一个应用程序。

我们一步步让上面这个定义变得更明确。

我们知道,网络通信的端点是套接字(socket),socket 本身就是一套 api(将 Linux, windows等系统提供的 api 封装而成so或者是dll文件),客户端通过形如socket.connect(host)的方式,服务端通过形如while(socket.accept())的方式,实现了双方的通信。

两端的套接字基于 TCP/UDP 的协议,在客户端封装字节流,在服务端解析字节流,协议的作用就体现在这。所谓让 Web 服务器支持 http 协议,其实就是指的两端都支持 TCP/UDP。

到这我们可以重新定义一下 Web 服务器:接受 socket 请求,与客户端建立连接,处理并返回结果的应用程序。

Web服务器的工作步骤:

  • 连接过程
  • 请求过程
  • 应答过程
  • 关闭连接

什么是 Servlet

Servlet 即 Server Applet(运行在服务端的小程序),说白了就是javax.servlet.Servlet,一个接口。

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 接口定义的是一套处理网络请求的规范,所有实现 servlet 的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init() 和 destroy(),还有一个处理请求的 service(),也就是说,所有实现servlet 接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:

  • 你初始化时要做什么
  • 你销毁时要做什么
  • 你接受到请求时要做什么

servlet 是一个规范,那实现了 servlet 的类,就能处理请求了吗?

答案是,不能。

servlet 中从来不会有监听什么 8080 端口,servlet 不会直接和客户端打交道!

那请求怎么来到 servlet 呢?答案是 servlet 容器,比如我们最常用的 tomcat,同样,你可以随便谷歌一个 servlet 的 hello world 教程,里面肯定会让你把 servlet 部署到一个容器中,不然你的 servlet 压根不会起作用。

tomcat 才是与客户端直接打交道的家伙,他监听了端口,请求过来后,根据url等信息,确定要将请求交给哪个 servlet 去处理,然后调用那个 servlet 的 service 方法,service 方法返回一个 response 对象,tomcat 再把这个 response 返回给客户端。

简单理解,Servlet 就是 tomcat 中一个个处理器,入参是 HttpRequest 和 HttpResponse,我们写的业务逻辑就是 Servlet 的一部分。

Tomcat

因此,我们常说的 Tomcat 服务器既包括了 Web 服务器的功能,同时也是一个 Servlet 容器。

在没有 spring 的情况下,tomcat 规范了如下 Web项目格式

WebRoot
---- html、jsp、css、js文件
---- WEB-INF
-------- classes 目录
-------- lib 目录
-------- web.xml
文章作者: yPhantom
文章链接: https://guoyuxiang.cn/2021/04/07/what's-tomcat/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Life Note