参考文章:https://blog.csdn.net/u014231646/article/details/79482195
什么是tomcat
Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选。
一个完整的web项目,有客户端(浏览器),服务器端,数据库(另一个服务器),你在本地安装Tomcat,就相当于你把自己电脑变成服务器,在同一个局域网内部,别人用浏览器是可以访问你发布的程序的,当然你可以在本机使用浏览器访问
tomcat的作用是啥呢
tomcat所做的事情主要有:开启监听端口监听用户的请求,解析用户发来的http请求然后访问到你指定的应用系统,然后你返回的页面经过tomcat返回给用户。
tomcat的原理
tomcat结构图:
Tomcat主要组件:服务器Server、服务Service、连接器Connector、容器Container。
其中连接器Connector和容器Container是Tomcat的核心。
组件之间的关系:一个容器Container和一个或多个连接器Connector组合在一起,加上其它的一些组件共同组成了一个服务Service,服务器Server提供一个或多个服务Service。
Connector
- 一个Connector将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理Engine(Container中的一部分),从Engine出获得响应并返回客户。
- Tomcat中有两个经典的Connector,
(1)一个直接侦听来自Browser的HTTP请求,HTTP/1.1 Connector在端口8080处侦听来自客户Browser的HTTP请求,即静态信息请求。
(2)另外一个来自其他的WebServer请求。AJP/1.3 Connector在端口8009处侦听其他Web Server(其他的HTTP服务器)的Servlet/JSP请求,即动态信息请求。 - Connector 最重要的功能就是接收连接请求然后分配线程让 Container 来处理这个请求,所以这必然是多线程的,多线程的处理是 Connector 设计的核心。
Container
Container是容器的父接口,它由四个子容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。通常一个Servlet class对应一个Wrapper,如果有多个Servlet定义多个Wrapper,如果有多个Wrapper就要定义一个更高的Container,如Context。
Context 还可以定义在父容器 Host 中,Host 不是必须的,但是要运行 war 程序,就必须要 Host,因为 war 中必有 web.xml 文件,这个文件的解析就需要 Host 了,如果要有多个 Host 就要定义一个 top 容器 Engine 了。而 Engine 没有父容器了,一个 Engine 代表一个完整的 Servlet 引擎。
各个子容器的简介:
- Engine 容器
Engine 容器比较简单,它只定义了一些基本的关联关系 - Host 容器
(1)理解:Host 是 Engine 的子容器,一个 Host 在 Engine 中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用。
(2)功能:负责安装和展开应用,并且标识这个应用以便能够区分它们;关联子容器外,还有就是保存一个主机应该有的信息。 - Context 容器
(1)理解:Context 代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host。
(2)功能:管理它里面的 Servlet 实例。 - Wrapper 容器
(1)理解:Wrapper 代表一个 Servlet,Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。
(2)功能:负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。
其他组件
Tomcat 还有其它重要的组件,如安全组件 security、logger 日志组件、session、mbeans、naming 等其它组件。这些组件共同为 Connector 和 Container 提供必要的服务。
HTTP请求过程
1、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得。
2、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
3、Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。
4、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)。
5、path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。
6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。
7、Context把执行完之后的HttpServletResponse对象返回给Host。
8、Host把HttpServletResponse对象返回给Engine。
9、Engine把HttpServletResponse对象返回Connector。
10、Connector把HttpServletResponse对象返回给客户Browser。
网友评论