tomcat的工作原理以及简介

Tomcat简介

Tomcat是一个JSP/Servlet容器。其作为Servlet容器,有三种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器,
1.Tomcat是运行在JVM中的一个进程。它定义为【中间件】,顾名思义,是一个在Java项目与JVM之间的中间容器。

2.Web项目的本质,是一大堆的资源文件和方法。Web项目没有入口方法(main方法),,意味着Web项目中的方法不会自动运行起来。

3.Web项目部署进Tomcat的webapp中的目的是很明确的,那就是希望Tomcat去调用
写好的方法去为客户端返回需要的资源和数据。
4. Tomcat可以运行起来,并调用写好的方法。那么,Tomcat一定有一个main方法。
5. 对于Tomcat而言,它并不知道我们会有什么样的方法,这些都只是在项目被部署进webapp下后才确定的,由此分析,必然用到了Java的反射来实现类的动态加载、实例化、获取方法、调用方法。但是我们部署到Tomcat的中的Web项目必须是按照规定好的接口来进行编写,以便进行调用

6.Tomcat如何确定调用什么方法呢。这取却于客户端的请求,http://127.0.0.1:8080/JayKing.Tomcat.Study/index.java?show这样的一个请求,通过http协议,在浏览器发往本机的8080端口,携带的参数show方法,包含此方法的路径为JayKing.Tomcat.Study,文件名为:index.java。

自从JSP发布之后,推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet, 这样Tomcat就诞生了。Tomcat是jakarta项目中的一个重要的子项目,其被JavaWorld杂志的编辑选为2001年度最具创新的java产品,同时它又是sun公司官方推荐的servlet和jsp容器,因此其越来越多的受到软件公司和开发人员的喜爱。servlet和jsp的最新规范都可以在tomcat的新版本中得到实现。其次,Tomcat是完全免费的软件,任何人都可以从互联网上自由地下载。Tomcat与Apache的组合相当完美。
在这里插入图片描述它的结构比较复杂,但是又比较模块化,所以只要我们找到了最核心的模块,对于tomcat的整体架构和工作原理就很好理解了。Connector(连接器)组件负责生成请求对象和响应对象的,Tomcat默认为HttpConnector,负责根据收到的Http请求报文生成Request对象和Response对象,并把这两个对象传递给Container,然后根据Response中的内容生成相应的HTTP报文。

Container是容器的父接口,所有子容器都必须实现这个接口,简单来说就是服务器部署的项目是运行在Container中的。Container里面的项目获取到Connector传递过来对应的的Request对象和Response对象进行相应的操作。

Connector可以根据不同的的设计和应用场景进行替换,而一个Container可以对应多个Connector。多个Connector和一个Container就形成了一个Service,而Service可以对外提供服务。

在这里插入图片描述
而service由server提供生存环境并控制其生命周期,
在这里插入图片描述

假设有一个请求http://localhost:8080/test/index.jsp 我们梳理一下流程

请求先发送到本机端口8080,然后被在那里侦听的Coyote HTTP/1.1 Connector获得;
2. Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应;

  1. Engine获得请求localhost:8080/test/index.jsp,匹配它所有虚拟主机Host;

  2. Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机);

  3. localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context;

  4. Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为""的Context去处理);

  5. path="/test"的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet;

  6. Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类;

  7. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法;

  8. Context把执行完了之后的HttpServletResponse对象返回给Host;

  9. Host把HttpServletResponse对象返回给Engine;

  10. Engine把HttpServletResponse对象返回给Connector;

  11. Connector把HttpServletResponse对象返回给客户browser;
    在这里插入图片描述
    上面我们知道了流程,但是connector是如何接受请求?又如何封装成Request和Response对象的呢?

connector结构
Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如我们之前说到的Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的

可以看到ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter

Endpoint用来处理底层Socket的网络连接,由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,

Processor用于将Endpoint接收到的Socket封装成Request,用来实现HTTP协议的

Adapter用于将Request交给Container进行具体的处理,用来将请求适配到Servlet容器进行具体的处理

Endpoint的抽象实现类AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。

到了这里,我们可以回答上面的问题了,但是Container是如何进行处理的以及处理完之后是如何将处理完的结果返回给Connector我们还不清楚,

在这里插入图片描述

Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;

Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;

Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;

Wrapper:每一Wrapper封装着一个Servlet;
在这里插入图片描述

下面我们结合tomcat 的文件目录说下
Context和Host的区别是Context表示一个应用,Tomcat中默认配置下webapps下的每一个文件夹目录都是一个Context,如图中所示,其中ROOT目录中存放着主应用,其他目录存放着子应用,而整个webapps就是一个Host站点

我们访问应用Context的时候,

如果是Host(webapps)下的其他应用,则可以使用http://www.test.com/docs进行访问,

默认指定的根应用(ROOT)是可以进行改变的

Container如何处理请求

Container处理请求是使用Pipeline-Valve管道来处理的

Pipeline-Valve是责任链模式,责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将处理后的请求返回,再让下一个处理着继续处理。

每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,这个Valve叫做BaseValve,BaseValve是不可删除的;

在上层容器的管道的BaseValve中会调用下层容器的管道。

在这里插入图片描述
当执行到StandardWrapperValve的时候,会在StandardWrapperValve中创建FilterChain,并调用其doFilter方法来处理请求,这个FilterChain包含着我们配置的与请求相匹配的Filter和Servlet,其doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的service方法,这样请求就得到了处理!

当所有的Pipeline-Valve都执行完之后,并且处理完了具体的请求,这个时候就可以将返回的结果交给Connector了,Connector在通过Socket的方式将结果返回给客户端。

如果执行过程中间出现问题就抛异常。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值