Tomcat浅析

一、相关

Applet-客户端小程序|Servlet-(Server Applet)服务端小程序:需要将html硬编码在java代码中然后将代码放在jvm中运行之后将运行结果返回给前端(因为jvm无法直接处理如CGI相关的协议需要使用servlet进行过渡一下)。那么我们需要通过servlet交互那么就要遵循servlet协议

Servlet Container 是一种基于Servlet协议 能够接受前端请求,并将运行结果返回给前端的一种容器。

Jsp 就是在Servlet的前面加了一层jasper(将遵循jsp规范的代码转换成遵循servlet的代码在将遵循servlet的代码交由jdk进行编译执行)

Web Container = Servlet Container + Jasper 。

二、Tomcat架构组件

Tomcat配置层次:
 

<server>

	<service>

	   <conector>

			   <engine>

					<host>

						 <context>

						 </context>

					</host>

			 </engine>

	  </conector>

	</service>

</server>

顶级组件:位于整个配置的顶层。

容器类:可以包含其他组件的组件。

连接器组件:连接用户请求至Tomcat。

被嵌套类的组件:位于一个容器当中,不能包含其他组件。

容器类engine ——核心容器。一般叫做catalina引擎负责通过connector接收用户请求

              host——类似于httpd 中的虚拟主机,支持基于FQDN的虚拟主机。

              context——最内层的容器类组件,一个context代表一个web应用程序:配置context的主要目的是:指定对应的webapp的根目录。还能为webapp指定额外的属性:如部署方式等

服务:

         service:将连接器关联至engine(因此一个service内部可以有多个connector,但只能有一个engine)。

顶级组件:

         server:表示一个运行于jvm中的tomcat实例。 tomcat内有多个用户请求时通过线程来响应 ,所以任何一个tomcat服务本身只能运行一个进程。

嵌套类组件:

          valve:(阀门)拦截请求并在将其转至对应的webapp之前进行某种处理操作。可用于任何容器中。

                     access log valve

                     remote address  filter valve  基于IP做访问控制。

          logger: 日志记录器——用于记录组件内部的状态信息。可用于除context之外的任何容器中。

          realm:关联一个用户认证库实现认证和授权-可以用于任何容器类的组件中。

                       UserDatabaseRealm:使用JNDI自定义的用户认证库。

                       MemoryRealm: tomcat-users.xml中。

                       JDBCRealm: 基于JDBC连接至数据库中查找用户。

 初步总结

顶级Server 下面可以有多个Service,Service下面包括connector和ServletContainer 可以有多个connector ,一个Service只有一个container这是因为一个服务可以有多个连接(connector用于接收请求并将请求封装成request和response来具体处理,container用于封装和管理servlet,以及具体处理request请求),connector最底层使用的是socket来进行连接的,request和response是按照http协议来封装的,所以connector需要实现tcp/ip协议和http协议。connector是使用protocolHandler来处理请求的不同的protocolHandler代表不同的连接类型,ProtocolHandler包含了三个组件:EndPoint、Processor、Adapter。

1EndPoint 用来用来处理底层Socket的网络连接,Processor用于将EndPoint接收到的Socket封装成Request,Adapter用于将Request交给Container处理

2EndPoint由于是用来处理底层的Socket网络连接,因此EndPoint是用来实现Tcp/IP协议的,而Processor用来实现Http协议的。Adapter将请求适配到Servlet容器进行具体的处理

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

container用于封装和管理servlet以及处理request请求,container里面有一个Engine和可以有多个Host在host下面可以有多个context和多个wrapper。engine是用来管理多个站点的,一个service最多只能有一个Engine,Host代表一个站点,也可以叫做虚拟主机,通过配置host就可以添加站点。context代表一个应用程序,对应着平时我们开发的一套程序,wrapper 每一个wrapper封装着一个servlet。container对于请求的处理是使用的Pipeline-valve(责任链模式)

Pipeline-valve使用的责任链模式与普通的责任链模式是不同的:a、每个pipeline都有特定的valve,而且是管道的最后一个执行,这个valve叫做baseValve,baseValve是不可删除的,b、在上层容器的管道的baseValve中会调用下层容器的管道

4我们知道container有四个子容器而这四个子容器的BaseValve分别为:StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve

处理流程大致是

EnginePipeline下面的  EngineValve1->EngineValve2->............->StandardEngineValve然后调用HostPipeline下面的HostValve1

->HostValve2->.....................->StandardHostValve 然后调用ContextEngine 下面的 ContextValve1->ContextValve2->................->StandardContextValve 然后调用WrapperPipeline 下面的 WrapperValve1->wrapperValve2->....................->StandardWrapperValve 当执行到StandardWrapperValve的时候会在StandardWrapperValve 中创建FilterChain 并调用doFilter方法来处理请求,这个FilterChain包含着我们配置的与请求相匹配的FIlter和Servlet,doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的Service方法这样请求得到了处理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值