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实例。
下面是Tomcat内部细节图:
imageTomcat是一个基于组件形式的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.xml
和Webapp_HOMEconf/web.xml
载入Servlet类,当Context获取请求时,将在自己的映射表中找相匹配的Servlet类,如果找到,则执行该类,获得请求的回应并返回。 -
Wapper:Wapper代表一个Servlet,它负责管理一个Servlet,包括Servlet的装载、初始化、执行和资源回收。Wapper是最底层的容器了,它没有子容器了。Wapper的实现类是StandardWapper,StandardWapper还实现了拥有一个Servlet初始化信息的ServletConfig,由此看出StandardWapper将直接和Servlet的各种信息打交道
Tomcat的启动过程
Tomcat作为一个Java应用,也一定是由面方法启动的。以Tomcat7为例,bin目录下的启动脚本catalina.sh文件中指出了main方法所在的类org.apache.catalina.startup.Bootstrap
。探寻Tomcat的启动流程也是从这个方法开始的。参考
在输入参数带有”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处理; -
构造
HttpServletReques
t对象和HttpServletResponse
对象,作为参数调用Servlet的doGet
或doPost
方法; -
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://www.fanyilun.me/2016/10/10/Tomcat%E7%9A%84%E5%90%AF%E5%8A%A8%E5%88%86%E6%9E%90/