一、我们知道,tomcat可以由org.apache.catalina.startup.Bootstrap这个类启动,这个类型做了两件事情:
1、指定classloader
2、引导Catalina启动,使用reflection反射技术,调用org.apache.catalina.startup.Catalina的process()方法, 并传递参数过去。public void process(String args[])
Catalina.java的process()做几件事:
a: 使用Digester技术装配tomcat各个容器与组件(server.xml文件加载);
b: 为top level的server做初始化工作
c: 从Server这个容器开始启动,————转下一步(二)
d: 为Server做一个hook程序,当Server 关闭时,关闭整个Tomact容器
e: 监听8005端口,如果发shutdown,关闭8005端口的socket
二、启动容器
Server(代表整个容器):触发Server容器中的启动前、启动中、启动后事件,并运行事件处理器。
Server---->启动Server的子容器Service(指定提供服务的组件,server.xml中可以配置一个或多个)
<!-- A "Service" is a collection of one or more "Connectors" that share
a single "Container" Note: A "Service" is not itself a "Container",
so you may not define subcomponents such as "Valves" at this level.
Documentation at /docs/config/service.html
-->
Service----> 启动子容器Engine,启动Connector(每个Service只有一个Engine,可以有多个Connector)
Engine中指定了处理所有Connector接受到的客户请求的Host主机名。
Connector定义了服务的端口号,负责接受客户的请求和向客户返回相应结果。
Engine----> Host(一个或多个,每个Host表示一个虚拟主机,可以包含一个或多个web应用)
Host ---->Context(每个Context代表运行在Host上的单个Web应用.)
StandardContext.start() 这个启动Context容器的方法被StandardHost调用:
1、指定Loader,用默认的org.apache.catalina.loader.WebappLoader,Loader就是用来指定这个context会用到哪些类, 哪些jar包。
2、指定 Manager. 通常使用默认的org.apache.catalina.session. StandardManager 。 Manager是用来管理session的。得到请求后,Request中有一个session属性。
3、Binding thread。到了这里, 就应该发生 class Loader 互换了。 之前是看得见tomcat下面所有的class和lib. 接下来需要看得见当前context下的class。 所以要设置contextClassLoader, 同时还要把旧的ClassLoader记录下来,因为以后还要用的。
4、启动 Loader. 指定这个Context具体要使用哪些classes, 用到哪些jar文件。 如果reloadable设置成了true, 就会启动一个线程来监视classes的变化, 如果有变化就重新启动Context。
5、启动logger
6、触发Context上的监听器,作为监听器之一,ContextConfig会被启动. ContextConfig就是用来配置web.xml的。 比如这个Context有多少Servlet, 又有多少Filter, 就是在这里给Context装上去的。
6.1、 defaultConfig. 每个context都得配置 tomcat/conf/web.xml 这个文件。
6.2、 applicationConfig 配置自己的 WEB-INF/web.xml 文件
6.3、 validateSecurityRoles 权限验证。 通常我们在访问/admin 或者/manager的时候,需要用户要么是admin的要么是manager的, 才能访问。 而且我们还可以限制那些资源可以访问, 而哪些不能。 都是在这里实现的。
6.4、 tldScan: 扫描一下, 需要用到哪些标签(tag lab)
7、启动manager
8、postWelcomeFiles() 我们通常会用到的3个启动文件的名称:
index.html、index.htm、index.jsp 就被默认地绑在了这个context上
9、 listenerStart 配置listener,初始化Listener
10、 filterStart 配置 filter,初始化Filter
11、 启动带有<load-on-startup>;1</load-on-startup>;的Servlet.
顺序是从小到大: 1,2,3… 最后是0
默认情况下, 至少会启动如下3个的Servlet:
org.apache.catalina.servlets.DefaultServlet
处理静态资源的Servlet. 什么图片啊, html啊, css啊, js啊都找他
org.apache.catalina.servlets.InvokerServlet
处理没有做Servlet Mapping的那些Servlet.
org.apache.jasper.servlet.JspServlet
处理JSP文件的.
12、 标识context已经启动完毕。
关键代码以后会补上。。