Tomcat Server组成

Tomcat Server的组成部分

1.1 - Server

A Server element representsthe entire Catalina servlet container.
(Singleton)

Server是整个Catalina容器的入口点,它是由Server接口实现,通过Serverfactory生成Server实例类
Server操作
1.读取资源
2.初始化
3.启动
4.服务阶段
5.关闭
1.2 - Service

A Service element representsthe combination of one or more Connector
components that share a single Engine

Service是这样一个集合:它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求。
Server可以包含一个或多个Service实例,但他们相互之间是完全独立的,他们仅共享JVM资源。通常我们会默认使用Tomcat-Standalone模式下的Serveice,这种方式下的Service提供解析JSP和Servlet的服务,Service有Service接口实现,实现类为StandarService.
Service操作。
1.启动并初始化
2.停止
1.3 - Connector
一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户。
TOMCAT有两个典型的Connector,一个直接侦听来自browser的http请求,一个侦听来自其它WebServer的请求。
Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求。
Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求。
Tomcat都是在容器里处理问题,而容器又到哪里取得输入信息呢?这里就要用到Connector,它会把从Socket传递过来的数据封装成 Request,传递给容器处理通常我们用到两种Connector,一个是http connector用来传递http请求,一个是AJP connector。
Connector是由Connector类实现。
Connector操作
1.构造加载协议
2.启动
3.请求
4.响应
5.关闭
1.4 - Engine

The Engine element representsthe entire request processing machinery
associated with a particular Service It receives and processes all
requests from one or more Connectors and returns the completed
response to the Connector for ultimate transmissionback to the client

Engine下可以配置多个虚拟主机VirtualHost,每个虚拟主机都有一个域名
当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理
Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理
当HTTP Connector把请求传递给顶级容器Engine时,我们的视线就移动到Container这个层面来了,container包含3个容 器:Engine,Host和Context,Engine收到Connector传递来的请求后,经过处理后将结果返回给 Service(Service是通过Connector这个媒介来和Engine互动的),Engine是由StandardEngine类实现
Engine操作
1.构造,创建过滤网
2.启动,初始化
3.关闭
1.5 - Host
代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配。
每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Contextpath。
当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理。
匹配的方法是“最长匹配”,所以一个path==”“的Context将成为该Host的默认Context。
所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配
Engine收到Connector传递过来的请求后,不会自己处理,而是交给合适的Host来处理,Host在这里就是虚拟主机的意思,通常我们只会用到“localhost”,即本地主机来处理,Host是由StandardHost类实现。
Host操作
1.构造,创建过滤网
2.启动初始化
3.处理请求
4.关闭
1.6 - Context
一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet组成。
Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类。
当Context获得请求时,将在自己的映射表(mappingtable)中寻找相匹配的Servlet类。
如果找到,则执行该类,获得请求的回应,并返回。
Host接到从Engine传过来的请求后,也不会自己处理,而是交给合适的Context来处理,例如http://127.0.0.1:8080 /foo/index.jsp和http://127.0.0.1:8080/bar/index.jsp,前者交给foo这个Context处理,后者 交给bar这个context处理。
Context操作
1.构造,创建过滤网
2.启动初始化
Context启动中完成以下操作:
(1)注册JMX(2)配置默认资源,可以部署war资源
(3)创建Realm对象(4)加载类加载器
(5)设置字符集(6)临时工作目录
(7)添加监听器
(8)绑定线程,启动Logger,Realm,Resource,value,Manager组件
3.关闭

Tomcat Server处理一个http请求的过程

假设来自客户的请求为:
http://localhost:8080/wsota/wsota_index.jsp
1) 请求被发送到本机端口8080,被在那里侦听的CoyoteHTTP/1.1 Connector获得
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host
4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为”“的Context去处理)
7) path=”/wsota”的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet
8) Context匹配到URLPATTERN为*.jsp的servlet,对应于JspServlet类
9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
10)Context把执行完了之后的HttpServletResponse对象返回给Host
11)Host把HttpServletResponse对象返回给Engine
12)Engine把HttpServletResponse对象返回给Connector
13)Connector把HttpServletResponse对象返回给客户browser
这里写图片描述

推荐文章

安卓-警报扩展

安卓-警报扩展

推荐文章

有没有办法在字符串上使用小于?

有没有办法在字符串上使用小于?

推荐文章

解码Android项目中存储为base64的png图像

解码Android项目中存储为base64的png图像

推荐文章

从MS Dynamics CRM回调到web服务

从MS Dynamics CRM回调到web服务

推荐文章

反向NSMutableDictionary

反向NSMutableDictionary

推荐文章

在动态调试BASH或SHELL脚本时,在循环内暂停

在动态调试BASH或SHELL脚本时,在循环内暂停

推荐文章

Android捕获呼叫按钮

Android捕获呼叫按钮

推荐文章

Maven/TestNG报告“Failures:0”,但随后报告“There are test Failures.”,怎么了?

Maven/TestNG报告“Failures:0”,但随后报告“There are test Failures.”,怎么了?

推荐文章

我正在读的代码中有奇怪的括号

我正在读的代码中有奇怪的括号

推荐文章

postgresql中PHP的COPY FROM问题

postgresql中PHP的COPY FROM问题

推荐文章

Java(Servlet)中的应用程序范围设置放在哪里?

Java(Servlet)中的应用程序范围设置放在哪里?

推荐文章

如何有效地删除字符串的一部分

如何有效地删除字符串的一部分

推荐文章

VS2010性能分析器:识别线程

VS2010性能分析器:识别线程

推荐文章

限制所有计算机上的网络速度

限制所有计算机上的网络速度

推荐文章

JSTREE,精确移动位置

JSTREE,精确移动位置

推荐文章

分叉进程和创建线程时出现问题

分叉进程和创建线程时出现问题