コンテナ
コネクタと容器:Tomcatは、2つのコア・コンポーネントを有します。ソケットコネクタ処理とサーブレット要求を取得するために通信アプリケーション層プロトコルを解析します。サーブレットコンテナは、要求を処理する責任があります。
Tomcatのでは、コンテナは、サーブレットをロードするために使用されます。
第二に、コンテナ階層
Tomcatは4つのコンテナ、エンジン、ホスト、コンテキスト、ラッパーを設計しました。
サーブレットコンテナを作る。この階層化アーキテクチャではTomcatは、良好な柔軟性を持っています。
図1に示すように、各容器ことを理解され
コンテキストは、Webアプリケーションを表し、
ラッパーがサーブレットを表し、Webアプリケーションは、複数のサーブレットを有することができます。
ホストは、仮想ホスト(またはサイト)を表し、あなたがTomcatに複数の仮想ホストアドレスを設定することができ、次の仮想ホストは、複数のWebアプリケーションを展開することができます。
複数の仮想サイトを管理するために使用されるエンジンのプレゼンテーションエンジンは、サービスはエンジンの最大を持つことができます。
図2に示すように、server.xmlを用いて理解されるように構成されました
3、Tomcatはこれらのコンテナを管理する方法
これらの容器は、これらのコンテナを管理するための組み合わせパターンのデザインモードでのツリー構造を形成する親子関係を、持っています。
具体的な実現:すべてのコンポーネントのコンテナは、コンテナそのContaninerインタフェースを実装し、ラッパー・コンテキストを使用する、ホスト、エンジンコンテナが一貫性を有しています。
コンテナインタフェース:
public interface Container extends Lifecycle { public void setName(String name); public Container getParent(); public void setParent(Container container); public void addChild(Container child); public void removeChild(Container child); public Container findChild(String name); }
其中LifeCycle接口用来统一管理各个组件的生命周期。
三,请求定位 Servlet 的过程
1,Tomcat是如何确定请求是由哪个Wrapper容器里的Servlet来处理呢?
Tomcat通过使用Mapper组件来完成。Mapper组件的功能就是将用户请求的URL定位到一个Servlet。
原理:
Mapper组件中保存了Web应用的配置信息,容器组件和访问路径的映射关系。(Host容器中配置的域名,Context容器中的Web应用路径,以及Wrapper容器里的Servlet映射路径。)
定位过程:
当一个请求到来时,Mapper组件通过解析请求URL里的域名和路径,然后到自己保存的Map里去查找,就能定位到一个Servlet。注意:一个请求URL最后只会定位到一个Wrapper容器,也就是一个Servlet。
1.1,根据端口号选定Service和Engine
Tomcat的每个连接器都监听不同的端口(比如Tomcat默认的HTTP连接器监听8080端口),比如:URL中的端口号8080,那么这个请求会被HTTP连接器接收,因为连接器属于一个Service组件,这样Service组件就确定了。因为一个Service组件中有多个连接器和一个容器,就是Engine容器。所以Engine容器也可以确定。
1.2,根据域名确定Host
Service和Engine确定后,Mapper组件通过URL中的域名去查找相应的的Host容器。
1.3,根据URL路径找到Context组件
Host确定以后,Mapper根据URL的路径来匹配相应的Web应用的路径,即对应的Context容器
1.4,根据URL找到Wrapper(Servlet)
Context确定以后,Mapper再根据web.xml中配置的Servlet映射路径来找到具体的Wrapper和Servlet
2,除了Servlet会处理请求,在查找路径上的父子容器都会对请求做一些处理。
连接器中的Adapter会调用容器的Service方法来执行Servlet,最先拿到请求的是Engine容器,Engine容器对请求做一些处理后,会把请求传给自己自容器Host继续处理,以此类推,最后这个请求传给Wrapper容器,Wrapper会调用最终的Servlet来处理。
3,调用过程通过Pipeline-Value管道来实现
Pipeline-Value是责任链模式:
在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后再调用下一个处理者继续处理。