深入理解剖析Tomcat

深入理解剖析Tomcat

第一章:一个简单的web服务器

HTTP1.1介绍

HTTP请求(请求方法,请求头,实体(传给服务端的数据))

深入理解剖析Tomcat_第1张图片

请求方法:url,协议/版本

深入理解剖析Tomcat_第2张图片

 

HTTP响应(1.协议-状态码-描述2:响应头3:响应实体段(服务端返回的数据))

 

深入理解剖析Tomcat_第3张图片

socket类

创建 public Socket(String host,int port);

端对端的发送和接收数据

Socket.getOutputStream  Socket.getInputStream  

ServerSocket 服务器套接字,因为不知道客户端何时发出请求,所以ServerSocket 随时待命,一旦发现客户端请求,就建立一个socket来进行通信。

应用程序

HttpServer,Request,Response

HttpServer  由静态资源的路径 final String WEB_ROOT

Final String SHUTDOWN_COMMAND=”/SHUTDOWN”

Await 方法:ServerSocket .accept()方法获取请求,发送的信息,在根据url发送资源,然后判断url是不是SHUTDOWN,如果是就终止这个servlet;

Request:

根据传入的InputStream 获取parseUrl解析HTTP请求的url

Response:

sendStaticResource()方法,根据request解析的url,判断服务器是否有这个资源,如果有这个资源,就返回资源,如果没有就返回“File Not Found”;

第二章:一个简单的servlet容器

Javax.servlet.Servlet 接口

Init,service,destory,getservletConfig,getServletInfo;5个方法,看见名字顾名思义相信大家都会懂吧。

HTttpserver1

加了一个处理servlet的判定如果是servlet就调用ServletProcessorl方法否则调用StaticResponseProcessor方法

Request

实现servletRequese接口

多了很多实现的方法

Response

实现servletResponse接口

StaticResponseProcessor

调用response.staticResponseProcessor()返回静态资源的路径

ServletProcessorl

根据获得request的url 获取servlet的名字采用类加载器,根据URLClassLoader加载servlet类,返回servlet的处理过程,返回数据给view,进行渲染。

Constants

第三章:连接器

连接器的功能负责创建HttpservletResponse,HttpservletResquest的实例,就是把从socket到Request之间需要有个转换过程

连接器模块

连接器及其支持类(HttpConnector,HttpProcessor)

表示HTTP的请求,响应(HttpResponse,HttpResquest)及其支持类

外观类(HttpResponseFacade,HttpResquestFacade)

常量类

HttpConnector负责请求工作,HttpProcessor负责创建HttpResponse,HttpResquest对象,HttpConnector和server的await()实现的功能差不多,负责分配请求。

HttpConnector:

是一个线程 implement Runnable  run方法实现的功能

等待HTTP请求HttpProcessor

调用HttpProcessor的process方法

为每个请求创建HttpProcessor的实例

 

HttpProcessor:

创建HttpResponse,HttpResquest对象

解析第一行内容和请求头信息你,填充HttpResquest对象。ReadLine,ReadHeader方法,

还会查看jsessionid的状态,解析请求头

process方法获取request根据url判断是否是servlet分别派发给servletProcessor,和staticResponseProcessor

 

HttpResquest:

  1. 读取套接字的输入流

SocketInputStream  readRequestLine  readHeader

  1. 解析请求行

parseRequest 寻找url和传递的参数

查找jsessionid根据jsessionid   设置setRequestedSessionId();

  1. 解析请求头

 

  1. 解析Cookie
  2. 获取参数

启动模块

Bootstarp(启动类加载器)----->extension(扩展类加载器)------>application(应用类加载器)

 

核心模块

第四章Tomcat的默认连接器

处理过程:

深入理解剖析Tomcat_第4张图片

 

过程:1. 等待应入HTTP请求

  1. 创建request,response对象
  2. 调用invoke方法,反射,class类加载器创建servlet的类的service方法。

HTTP1.1新特性

  1. 加入了持久连接,加快浏览器的下载功能。

Connection:keep-alive

  1. 块编码,分块发送数据。
  2. 状态码100,代表请求是否接收大文件

Connector接口

重要方法:getContainer:得到与连接器相互连接的servlet

     setContainer:设置与连接器相互连接的servlet

CreateReuqest,CreateResponse

HttpConnector类

HttpConnector  实现了connector接口

  1. 创建服务器套接字initialize()创建ServerSocket
  2. 维护HttpProcessors实例

HttpProcessors对象池用来处理多个HTTP请求,和线程池大同小异

  1. 提供HTTP的请求

createProcessor方法不会创建一个新的HttpProcessor实例,重HttpProcessors对象池获取HttpProcessor实例,如果没有可以获取的就关闭套接字,不对引入的HTTP请求做出反应。

HttpProcessors对接收的HTTP请求进行分类处理(静态资源,servlet,controller)

HttpProcessor类

HttpProcessor的run方法

获取套接字,进行HTTP处理,调用连接器的recycle()方法将当前的HttpProcessor实例压入栈中。

先要等HttpConnector类获取到套接字

HttpProcessor才能顺利往下执行,不然会一直等待的。

处理请求

使用process方法来处理请求

Process方法三个步骤:解析连接,解析请求,解析请求头,调用invoke(request,response)创建servlet实例

Container最重要的就是invoke()方法,反射生成servlet实例。

第五章servlet容器

Container接口

Catalina容器分为4类

Engine:整个引擎,Host:包含一个或多个Context容器的虚拟主机,Context:一个web应用程序包含多个Wrapper,Wrapper:就是一个servlet

管道任务

管道包含了servlet容器将要调用的容器,一个管道包含很多个阀,阀就像过滤器一样

当调用完管道阀就会调用基础阀,最后调用的是基础阀,一层层的阀的调用完成servlet该完成的任务

Pipeline接口

加入,移除阀

Value接口

阀实现了value接口的主要方法就是invoke()

Wrapper接口

表示一个独立servlet定义

Context接口

添加wrapper实例

还有实现Wrapper实例的请求映射,作为servlet请求路径

Wrapper应用程序

包含一个Pipeline实例,Loader实例,Pipeline包含一个基础阀

Bootstrap类加载器

第6章生命周期

Lifecycle(生命周期)

父组件启动自动启动子组件,父组件关闭自动关闭子组件,

监听器一样,或者是拦截器就是一个组件开始,关闭。Lifecycle就是在start,stop前后做一些处理.

Lifecycle最重要的方法是start,stop

LifecycleEvent(生命周期事件)

包含一个Lifecycle实例

LifecycleListener(生命周期监听事件)

当监听事件,发生时候会调用LifecycLeSuppor事件.

父组件管理子组件的过程.

  1. 日志记录器

Logge接口

LoggeBase实现Logge接口

FileLogger(写到文件,还有就是包括定时清理文件,文件多大就分文件存储),SystemEroorLogger,SystemOutLogger(打印到控制台)继承LoggeBase。

第8章载入器

java的类载入器

Java虚拟机使用类载入器来载入需要的类,首先在java核心库,以及CLASSPATH中指明的目录相关类,如果找不到就抛出java.lang.ClassNotFoundException异常

Bootstarp---->extension----->aplication----->user 双亲委派模型,加载类

BootStarp用于引导启动Java虚拟机,当调用javax.exe程序的时候以及核心类包括java.lang,java.io

Extension  负责载入标准扩展目录中的类/jdk/jre/lib/ext下面的类

aplication就是自己写的类

代理模型,双亲委派模型

Tomcat 使用自定义的原因:1.为了在载入类中指定某种规则

2为了缓存以及载如的类

3为了首先预载入,方便使用

Loader接口

Servlet类只能载如当前项目的WEB-INF/lib目录下的库。

Reloader 自动重载,就算你在修改代码的时候自动,更新到TOMCAT容器中。

WebappLoader类

Tomcat的类加载,做了权限限定就是每个application,只能加载本项目下的类,不能加载到别的项目底下去做加载,还有就是,tomcat的修改类的重加载设置,就是不用重新启动tomcat,自动更换tomcat里面的class文件。

第9章Session管理

Session对象

相当与一个会话所管理的内存,session对象总是存在与session管理器中,可以使用get/setmanager()方法来进行实例和管理器相关联起来。

Session还有一个过期时间,根据你多久未访问而自动重session容器中移除session

Manager

Session管理器继承了Manager接口。

 

Manager接口

将Manager与Context容器相关联,创建session的实例。

Session的换出和备份

将超过时间的换出内存,把换出内存的做了备份。

 

存储器

把session对象持久化,两种方案持久化为文件,持久化到jdbc数据库

深入理解剖析Tomcat_第5张图片

你可能感兴趣的:(Tomcat,Tomcat)