Java Web开发之Tomcat

Tomcat服务器是Java开发中最常用的Web服务器。

Tomcat是什么?

Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。

由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。但是,不能将Tomcat和Apache HTTP服务器混淆,Apache HTTP服务器是一个用C语言实现的HTTPWeb服务器;这两个HTTP web server不是捆绑在一起的。Apache Tomcat包含了一个配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。

Tomcat的系统结构

了解一下Tomcat内部的基本概念:

  • Tomcat最顶层的容器时Server,代表的是整个服务器。一个Tomcat只有一个Server。一个Server可以有多个Service。

  • Service可以有多个Connector,但是只有一个Container。

  • Connector主要负责接收浏览器发过来的TCP连接请求,创建一个Request和Response对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的Request和Response对象传给处理这个请求的线程,处理这个请求的线程就是Container组件要做的事情了。

  • Container用于封装和管理Servlet实例。

image

下面是Tomcat内部细节图:

image

Tomcat是一个基于组件形式的Web容器,其中server.xml 配置如下:

  • Server服务器:代表整个Tomcat,它包含所有的容器。

  • Service服务:相当于一个集合,包含多个Connector(连接)、一个Engine(引擎),它还负责处理所有的Connector获取客户的请求。

  • Connector连接器:一个Connector在指定接口上侦听客户的请求,并将客户的请求交给Engine来处理并获得回应返回给客户请求。

  • Engine引擎:一个Engine下可以配置多个虚拟主机Host,每个主机都有一个域名。当Engine获得一个请求时,会把这请求发送到相应的Host上,Engine有一个默认的虚拟主机,如果没有虚拟主机能够匹配这个请求,那就由这个默认的虚拟主机来进行处理请求。

  • Host主机:代表一个虚拟主机,每个虚拟主机都每个网络域名匹配。每个虚拟主机下面可以部署一个或者多个Webapp ,每个Web对应一个Context,有一个Context Path,当一个Host获取请求时,就把该请求匹配到某个Context上。

  • Context应用服务:一个Context对应一个Web Application ,一个Web有一个或者多个Servlet组成。Context在创建的时候根据配置文件CATALINA_HOME/conf/web.xmlWebapp_HOMEconf/web.xml 载入Servlet类,当Context获取请求时,将在自己的映射表中找相匹配的Servlet类,如果找到,则执行该类,获得请求的回应并返回。

  • Wapper:Wapper代表一个Servlet,它负责管理一个Servlet,包括Servlet的装载、初始化、执行和资源回收。Wapper是最底层的容器了,它没有子容器了。Wapper的实现类是StandardWapper,StandardWapper还实现了拥有一个Servlet初始化信息的ServletConfig,由此看出StandardWapper将直接和Servlet的各种信息打交道

image
image

Tomcat的启动过程

Tomcat作为一个Java应用,也一定是由面方法启动的。以Tomcat7为例,bin目录下的启动脚本catalina.sh文件中指出了main方法所在的类org.apache.catalina.startup.Bootstrap。探寻Tomcat的启动流程也是从这个方法开始的。参考

image

在输入参数带有”start”时,tomcat会执行启动,主要调用三个方法,分别是

  • bootstrap.init() :1.先从JVM启动参数中读取Tomcat目录路径2.然后初始化Tomcat的classLoader

  • bootstrap.load() :根据conf/server.xml 文件创建Server并调用Server的init方法进行初始化。(调用各级组件和容器的init())

  • bootstrap.start() :1.调用各级组件和容器的start()(bootstrap.start()会依次调用catalina.start()、server.start()、service.start()、engine.start()和host.start()),然后部署Web项目。

    (deamon即bootstrap对象,在init时创建)

Tomcat处理请求的过程

现在来模拟一个Tomcat处理一个Http请求的过程:

设置一个来自客户端的URL:http://localhost:8080/webgateway/index

  • 服务器8080端口接收到客户端发来的请求,被一个在那里监听的叫HTTP1.1的Connector获取了这个链接请求;

  • Connector把请求交给同在Service下的Engine去处理,并等待Engine的响应;

  • Engine把URL解析,并把请求传给相对应的Host处理,如果没有相对应的Host,则用默认名叫Localhost的Host处理;

  • Host在把URL解析为/webgateway/index, 匹配Context-path为/webgateway/index的Context去处理(如果匹配不到就把该请求交给路径名为""的Context去处理);

  • Context-path为/webgateway/index 的Context会匹配Servlet Mapping为/index 的Servlet处理;

  • 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用Servlet的doGetdoPost方法;

  • Context把处理完的HttpServletResponse对象返回给Host;

  • Host把HttpServletResponse对象返回给Engine;

  • Engine把HttpServletResponse对象返回给Connector;

  • Connector把HttpServletResponse对象返回给客户browser。

参考资料

https://www.jianshu.com/p/7b6ce4b90bae

https://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/index.html

http://kael-aiur.com/tomcat%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB/tomcat%E7%9A%84%E7%BB%93%E6%9E%84%E5%92%8C%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5.html

http://www.fanyilun.me/2016/10/10/Tomcat%E7%9A%84%E5%90%AF%E5%8A%A8%E5%88%86%E6%9E%90/

你可能感兴趣的:(Java Web开发之Tomcat)