How tomcat works 读书笔记十二 StandardContext 上
在tomcat4中,StandardContext.java是最大的一个类,有117k。废话不说,开始分析吧。
其实要分析StandardContext,也就主要分析两个方法,一个start,一个invoke。
两个变量
这里首先咱们得说两个boolean型的变量available,configured。
先说available,它表示了StandardContext是否可用,初始值为false。若StandardContext启动成功,其值就变为true;另外各种原因都会导致StandardContext启动失败,这个时候available就是false。
configured,表明configured是否正确配置。与available不同的是,对configured这个参数我们采用了观察者模式。
public class SimpleContextConfig implements LifecycleListener {
public void lifecycleEvent(LifecycleEvent event) {
if (Lifecycle.START_EVENT.equals(event.getType())) {
Context context = (Context) event.getLifecycle();
context.setConfigured(true);
}
}
}
在StandardContext配置完成后调用
lifecycle.fireLifecycleEvent(START_EVENT, null);
不过为什么configured使用了观察者模式,而available没有用呢?
start方法
1 lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null); 触发BEFORE_START_EVENT事件
2 设置available与configured的值为false;
setAvailable(false);
setConfigured(false);
3 配置资源 (这部分我也不是太懂)
4 配置载入器 setLoader(new WebappLoader(getParentClassLoader()));
5 配置Session setManager(new StandardManager());
6 初始化字符集映射器 getCharsetMapper(); 这里面的详细代码我也没有研究过
7 启动load,loger,mapper
((Lifecycle) loader).start();
((Lifecycle) logger).start();
((Lifecycle) mappers[i]).start();
8 启动子容器
Container children[] = findChildren();
for (int i = 0; i < children.length; i++) {
if (children[i] instanceof Lifecycle)
((Lifecycle) children[i]).start();
}
9 启动管道
if (pipeline instanceof Lifecycle)
((Lifecycle) pipeline).start();
10 触发START_EVENT,注意呀 观察者模式,SimpleContextConfig, configured会被设置为true
// Notify our interested LifecycleListeners
// 会调用SimpleContextConfig的lifecycleEvent
lifecycle.fireLifecycleEvent(START_EVENT, null);
11 启动session
//session部分
if ((manager != null) && (manager instanceof Lifecycle))
((Lifecycle) manager).start();
12 (书上说)检查confired的值,postWelcomeFiles会载入需要提前载入的子容器,StandardContext的子容器能有什么?StandardWrapper呗。
if (!getConfigured())
ok = false;
if (ok) {
postWelcomeFiles();
}
问题是加载需要提前载入的子容器是
loadOnStartup(findChildren());这行代码干的事呀。至于postWelcomeFiles倒像是设定什么属性。
如果confired为false就调用stop();
if (ok) {
setAvailable(true);
} else {
try {
stop();
} catch (Throwable t) {
log(sm.getString("standardContext.startCleanup"), t);
}
setAvailable(false);
}
stop里面具体的代码就不说了。
13 触发AFTER_START_EVENT事件 lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
invoke方法
StandardContext的invoke方法会在两种情况下被调用。至于有哪两种自己想。
首先会检查程序是否正在重载:
while (getPaused()) { //getPaused如果返回true 就说明正在重载
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
;
}
}
然后调用父类,也就是ContainerBase的invoke
super.invoke(request, response);
在 Tomcat5 中,StandardContext 并没有提供 invoke 方法的实现,因此它会执行 ContainerBase 的 invoke 方法。检查应用程序加载的任务在StandardContextValve 类的 invoke 方法中完成。
StandardContextMapper类
上面到StandardContextValve类的invoke 方法,接着就是调用管道的invoke,然后基础阀的invoke(基础阀是哪个类,什么时候注入的,还记的吗)
基础阀干的事情就是获得Wrapper
Context context = (Context) getContainer();
wrapper = (Wrapper) context.map(request, true);
接着在ContainerBase的map中先获得相应协议(http还是https)的映射器,再用映射器的map方法根据request的uri获得Wrapper。
根据uri获得Wrapper就是应用一系列的匹配规则获得Wrapper。
你可能会问,上下文容器时如何获得 Servlet 映射的?看Bootstrap。
现在就有几个问题了,生产映射器哪家强?映射器从哪里来?
来,听本座给你一一道来..
在StandardContext的start方法中
调用了
addDefaultMapper(this.mapperClass); //private String mapperClass = "org.apache.catalina.core.StandardContextMapper";
StandardContext会调用父类的addDefaultMapper。这里面,默认的协议是http
Class<?> clazz = Class.forName(mapperClass);
Mapper mapper = (Mapper) clazz.newInstance();
mapper.setProtocol("http");
addMapper(mapper);
在addMapper中
mapper.setContainer((Container) this);
可见映射器与容器是双向关联的。(并且只能与Context级别的容器关联)
为什么?单向关联不行么?
(某个协议下的)映射器根据uri返回相应的Wrapper,如何映射器"不知道"Context容器,它怎么查找众多的子容器?用for循环么?
所有的子容器是存放在ContainerBase中的
protected HashMap<String, Container> children = new HashMap<String, Container>();
这一节就先到这里,下面我们在说tomcat4对重载的支持和在Tomcat5中的backgroundProcess方法。
How tomcat works 读书笔记十二 StandardContext 上的更多相关文章
- How tomcat works 读书笔记十二 StandardContext 下
对重载的支持 tomcat里容器对重载功能的支持是依靠Load的(在目前就是WebLoader).当在绑定载入器的容器时 public void setContainer(Container cont ...
- How tomcat works 读书笔记十五 Digester库 下
在这一节里我们说说ContextConfig这个类. 这个类在很早的时候我们就已经使用了(之前那个叫SimpleContextConfig),但是在之前它干的事情都很简单,就是吧context里的co ...
- How tomcat works 读书笔记十五 Digester库 上
Digester库 在前面的几个章节里,我们对tomcat里各个组件的配置完全是使用写硬编码的形式完成的. 如 Context context = new StandardContext(); Loa ...
- How tomcat works 读书笔记十四 服务器组件和服务组件
之前的项目还是有些问题的,例如 1 只能有一个连接器,只能处理http请求,无法添加另外一个连接器用来处理https. 2 对容器的关闭只能是粗暴的关闭Bootstrap. 服务器组件 org.apa ...
- How Tomcat Works 读书笔记 八 载入器 上
Java的类载入器 详细资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...
- how tomcat works 读书笔记(二)----------一个简单的servlet容器
app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...
- how tomcat works 读书笔记四 tomcat的默认连接器
事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...
- 《深入理解Java虚拟机》读书笔记十二
第十二章 Java内存模型与线程 1.硬件效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cac ...
- 《深入剖析Tomcat》读书笔记(二)
三.容器Container Container 是容器的父接口,所有子容器都必须实现这个接口.Container 容器的设计用的是典型的责任链的设计模式,它有四个子容器组件构成,分别是:Engine. ...
随机推荐
- GC真正的垃圾:强、软、弱、和虚 对象
垃圾回收的基本思想就是判断一个对象是否可触及性,说白了就是判断一个对象是否可以访问,如果对象对引用了,说明对象正在被使用,如果发现对象没有被引用,说明对象已经不再使用了,不再使用的对象可以被回收,但是 ...
- bash与ksh数组使用
区别: bash与ksh在数组的使用中,最大的不同在于数组的定义. bash: declare -a arrayname ksh:set -A arrayname 其实,数组不用非要定义,在赋值的时候 ...
- 2.QT中操作word文档
Qt/Windows桌面版提供了ActiveQt框架,用以为Qt和ActiveX提供完美结合.ActiveQt由两个模块组成: A QAxContainer模块允许我们使用COM对象并且可以 ...
- 还在繁琐的敲MVP接口和实现类吗,教你一秒搞定。
只有程序员懒起来,才能提高开发效率 233333 在MVP的使用过程中,我们需要反复的去写各种MVP的接口和实现类, 实在是 太麻烦了!!所以抽时间撸了一款插件(只可用于Intellj IDEA 和 ...
- JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine
JAVA之旅(二十五)--文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine 我们继续IO上个篇 ...
- ROC曲线的AUC(以及其他评价指标的简介)知识整理
相关评价指标在这片文章里有很好介绍 信息检索(IR)的评价指标介绍 - 准确率.召回率.F1.mAP.ROC.AUC:http://blog.csdn.net/marising/article/det ...
- flexbox基本原理
新版的flexbox规范分两部分:一部分是container,一部分是 items. flexbox是一整套布局规范,包含了多个css属性,所以学习起来比`float: left;` 这样简单的布局要 ...
- “XcodeGhost”病毒之后,苹果更应注…
虽然大家都在期待中秋假期的到来,不过让开发者挺闹心的一件事就是这几天网上.朋友圈以及各种群中炒得沸沸扬扬的"XcodeGhost"病毒事件,就连央视也惊动了!! 事件起源 事件起源 ...
- Spring注入
Spring注入 Spring注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为. 常用的两种注入方式: setter注入 构造注入 <?xml version=&quo ...
- Eclipse快捷键指南
Eclipse快捷键指南 Eclipse快捷键,熟悉快捷键可以帮助开发事半功倍,节省更多的时间来用于做有意义的事情.Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行Ct ...