1、Tomcat的架构
这里可以看出
A、一个Tomcat就是一个Server,一个Server下会有多个Service,
B、Service只负责封装多个Connector和一个Container(Service本身不是容器,可以看做只是用来包装Connector和Container的壳,不负责具体功能)。
C、Connector主要负责处理与客户端的通信,Connector的实例用于监听端口,接受来自客户端的请求并将请求转交给Container(也叫engine)处理。同时将来自Container(也叫engine)的答复返回给客户端。
C、Container(也叫engine)下又有多个Host,每个Host下对应多个Context。
D、Context下才是我们的Servlet。
Tomcat为了使整个架构灵活,所以抽象出这么多层,每层之间都可以根据不同的维度产生一对多个配置。
对于Container(也叫engine)再在下图理解一下host,context和wrapper。
Engine :引擎,用来管理多个站点, 一个Service 最多只能有一个Engine。
Host :代表一个站点,也可以叫虚拟主机,通过配置Host 就可以添加站点。
Context :代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF 目录以及下面的web.xml 文件。
Wrapper :每个Wrapper 封装着一个servlet。
Context 和Host 的区别是Context 表示一个应用,比如,默认配置下webapps 下的每个目录都是一个应用,其中ROOT目录中存放着主应用,其他目录存放着别的子应用,而整个webapps 是一个站点。假如www.excelib.com 域名对应着webapps 目录所代表的站点,其中的ROOT 目录里的应用就是主应用,访问时直接使用域名就可以,而webapps/test 目录存放的是test 子应用,访问时需要www.host3.com/test ,每一个应用对应一个Context ,所有webapps 下的应用都属于www.host3.com 站点,而www.host3.com 则是另外一个站点,属于另外一个Host。
有了基本理解后,我们在打开tomcat/config目录下的server.xml文件如下:
默认的server.xml里面理解为host为localhost,对应着webapps目录,看到里面标签页就可以看到基本的构成层次。
2、Tomcat运行流程
假设来自客户的请求为:http://localhost:8080/test/index.jsp
- 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
- Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应
- Engine获得请求localhost:8080/test/index.jsp,匹配它所有虚拟主机Host
- Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
- localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
- Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
- path="/test"的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet
- Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类
- 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
- Context把执行完了之后的HttpServletResponse对象返回给Host
- Host把HttpServletResponse对象返回给Engine
- Engine把HttpServletResponse对象返回给Connector
- Connector把HttpServletResponse对象返回给客户browser
参考资料:
https://blog.csdn.net/caoyuanyenang/article/details/114401414
https://blog.csdn.net/gchd19921992/article/details/79071288
https://blog.csdn.net/chengc017/article/details/7090132/