学习tomcat源码知识

下面是我自己学习的笔记,其他人看不懂就不要看了

特别注明 :我之前的公司的领导,包括:刘天龙、冉大亮、刘申、丛立、袁国健。

看了请给我的下面来个评价。

 

1.miniBrown是模拟浏览器,会发送http
2.BootStrap是创建了一个SocketServer
3.request类,里面包括socket、url、输入流
4.response类,里面包括返回流、类型比如text/html
5.const类,里面有各种常量
6.文本文件,这是一个功能。找到文件,并输出String给response
7.日志,这是一个功能。没什么意思,不用看
8.耗时任务,这是一个功能。没什么意思,不用看
9.线程池,这是一个功能。没什么意思,不用看
10.多应用,Context 类,每一个context对象就表示是一个应用
里面有path和docBase;除了root文件夹,其他的path和docBase是一样的
并保存在contextMap缓存里
改造request类,request类里面有一个context,因为每个请求都会对应一个应用中的什么资源
11. 配置型多应用,一般来说不需要这个。
12.tomcat的内置对象有哪些
Server, Service, Engine, Host, Connector
1个host表示主机,对应一个ContextMap,ContextMap就是应用的缓存。 即1个主机,可以部署多个应用
1个request对应一个context应用,对应一个host主机
engine不需要学习。1个engine对应多个host
service不需要学习。1个service对应多个engine
server不需要学习。1个server对应多个service
13.404页面的含义。当找不到对应的文件
14.500页面的含义。出错了
15.mimetype。就是一个文件后缀格式的映射,输出到resonse的contextType字段上
16.二进制文件。这是一个功能。不需要学习
17.connector。就是说对外开放多个端口的意思
18.httpprocessor
19.HelloServlet。就是一个普通的servlet类。输入是request和response
20.配置servlet。读取每一个context中的web.xml,将里面的类解析出来加载到context的list缓存中
21.invokeServlet。用于处理servlet。根据url获得servlet类,反射获得类并执行service方法
22.defaultServlet。用于处理文本请求。如果根据url可以找到类,那么就用invokeServlet;如果根据url不能找到类,那么就用defaultServlet
JspServlet 用于处理JSP
23.类加载器。反射是由类加载器来完成的,类加载器的职责是class文件变成类
类加载器分为三种:c++、java、java
c++是加载jre\lib,java是加载jre\lib\ext,java是加载自己的代码
class.getClassLoader()可以知道当前类的类加载器是什么
类的唯一性:一个类加载器中,一个类只有一个对应的类对象
双亲委派机制:先去C++的启动类加载器中寻找,再去java的扩展类加载器中寻找,再去java的应用程序类加载器中寻找
24.tomcat中类加载器
1.使用批处理.bat脚本,先将bootStrap类和commonClassLoader打包,这样他们就会使用appClassLoader
2.然后每个context去创建一个新的WebappClassLoader类加载器。
3.类加载器的层次:c++,java,java,每个context的类加载器
25.webAppClassLoader.一个context对应一个webAppClassLoader
每次调用servlet,就会先去该context中找到webAppClassLoader,然后反射获得servlet的方法进行调用
26. 热加载。context中的class文件或者jar文件被修改后,context就重新加载
对context下的文件添加监听器
触发监听,则重载context:停止类加载器和监听、从contextMap缓存中删除,加载新的context,加载到contextMap缓存中
27.ServletContext。
1个context对应1个ServletContext,
conetxt的意思是 一个工程
servletContext的意思是 工程里面的servlet的上下文
servletContext是servlet的核心
28.ServletConfig。 在配置文件中配置servlet后,还可以配置parm-name parm-value;
这些会变成servletConfig
29.servlet单例。
保存在context中的ServletPool中<Class<?>,HttpServlet>
30.servlet生命周期
实例化(创建这个类)、初始化(调用init方法)、提供服务(调用service方法)、销毁(调用destroy方法)、被回收
31.servlet自启动。web.xml中配置了load-on-startup=1表示servlet随着context的启动而自启动
以前是第一次调用该servlet的时候,通过classLoader加载class,将servlet放入到servletPool缓存中
现在是启动context的时候,通过classLoader加载class,将servlet放入到servletPool缓存中
32.session。
SessionManager包括多个StandardSession
每个StandardSession包含多个key value的值
每个context对应一个SessionManager,每个SessionManager有一个现成,用于清理过期Session
JSESSIONID保存在哪里?保存在请求和相应的报文头中的cook中
33.JSP。JSP是被JSPServlet处理的。
先把JSP转化成java,class,运行
JSPC这个类是最关键的类,但是很难懂,所以就不写了
jsp变成java,本质上是在work目录下,创建一个jsp.java, 他的本质还是一个servlet
java变成class,
34. JspClassLoader。map中缓存了所有的JspClassLoader,每个jsp都对应一个JspClassLoader
当jsp变化时,就会生成一个新的JspClassLoader。JspClassLoader是由webClassLoader创建的
35.Filter的初始化。
在javaweb项目中,需要写几个Filter的类,并在web.xml中进行配置
在tomcat的代码中,web.xml中的每个配置对应一个StandardFilterConfig,然后他们都保存到FilterPool的缓存中
36.Filter匹配模式。(这个不需要看。没有意义)
完全匹配/通配/后缀匹配/其他匹配
37.Filter责任链
ApplicationFilterChain表示,每个servlet的拦截器,调用doFilter和service方法
38.war的部署
war的部署分为静态部署和动态部署
静态部署就是说:当tomcat没有启动的时候,war已经在webapp目录下了
代码:解压war包(先复制war,在解压成class,在删除刚刚复制的war),然后加载servlet到缓存中
动态部署就是说:tomcat已经运行中,此时向webapps目录下扔了一个war,就会自动解压并部署,生成对应的context
代码:监控类WarFileWatcher,用于监控webapps,当发现新创建的war文件时,调用load方法

 

posted @ 2022-07-21 11:13  纯丿乱  阅读(47)  评论(0编辑  收藏  举报