一、相关
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。
1:EndPoint 用来用来处理底层Socket的网络连接,Processor用于将EndPoint接收到的Socket封装成Request,Adapter用于将Request交给Container处理。
2:EndPoint由于是用来处理底层的Socket网络连接,因此EndPoint是用来实现Tcp/IP协议的,而Processor用来实现Http协议的。Adapter将请求适配到Servlet容器进行具体的处理。
3:Endpoint的抽象实现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方法这样请求得到了处理。