前几日弄nodejs+html5+mongoDB+websocket弄的头晕晕的,毕竟全是新东西,信息量太大。偶然看到一篇关于tomcat原理的文章,突然有了研究其原理的冲动。于是乎就下了一份代码、和一份文档开始琢磨每天都用到的这个东西.只研究了一部分的源码。看着看着有点头晕,就翻看了很多关于这方面的博文,大神们都很给力,看完他们的文章加上自己的理解,整理了一份东西,同时也提出了自己的疑问,希望大家一起学习进步。
context 详细启动过程
Context 到了这里, 就终于轮到了tomcat启动中真正的重头戏,启动Context了。 StandardContext.start() 这个启动Context容器的方法被StandardHost调用.
5.1 webappResources 该context所指向的具体目录
5.2 安 装defaultContex, DefaultContext 就是默认Context。 如果我们在一个Host下面安装了DefaultContext,而且defaultContext里面又安装了一个数据库连接池资源的话。 那么其他所有的在该Host下的 Context, 都可以直接使用这个数据库连接池, 而不用格外做配置了。
5.3 指定Loader. 通常用默认的org.apache.catalina.loader.WebappLoader这个类。 Loader就是用来指定这个context会用到哪些类啊, 哪些jar包啊这些什么的。
5.4 指定 Manager.通常使用默认的org.apache.catalina.session. StandardManager 。 Manager是用来管理session的。 其 实session的管理也很好实现。 以一种简单的session管理为例。 当需求传递过来的时候,在Request对象里面有一个sessionId 属性。 OK, 得到这个sessionId后, 我们就可以把它作为map的key,而value我们可以放置一个 HashMap. HashMap里边儿, 再放我们想放的东西。
5.5postWorkDirectory (). Tomcat下面有一 个work目录。 我们把临时文件都扔在那儿去。 这个步骤就是在那里创建一个目录。 一般说来会在�TALINA_HOME%/work /Standalone/localhost/ 这个地方生成一个目录。
5.6 Binding thread。到了这里, 就应该发 生 class Loader 互换了。 之前是看得见tomcat下面所有的class和lib. 接下来需要看得见当前context下的 class。 所以要设置contextClassLoader, 同时还要把旧的ClassLoader记录下来,因为以后还要用的。
5.7 启动Loader. 指定这个Context具体要使用哪些classes, 用到哪些jar文件。 如果reloadable设置成了true, 就会启动一个线程来监视classes的变化, 如果有变化就重新启动Context。
5.8 启动logger
5.9 触发安装在它身上的一个监听器。 <br>lifecycle.fireLifecycleEvent(START_EVENT,null);
作为监听器之一,ContextConfig会被启动.ContextConfig就是用来配置web.xml的。 比如这个Context有多少Servlet, 又有多少Filter, 就是在这里给Context装上去的。
5.9.1 defaultConfig. 每个context都得配置tomcat/conf/web.xml 这个文件。
5.9.2 applicationConfig 配置自己的WEB-INF/web.xml 文件
5.9.3 validateSecurityRoles 权 限验证。 通常我们在访问/admin或者/manager的时候,需要用户要么是admin的要么是manager的, 才能访问。 而且我们还可以 限制那些资源可以访问,而哪些不能。 都是在这里实现的。 <br>5.9.4 tldScan: 扫描一下, 需要用到哪些标签(taglab)
5.10 启动 manager
5.11postWelcomeFiles() 我们通常会用到的3个启动文件的名称: <br>index.html、index.htm、index.jsp 就被默认地绑在了这个context上
5.12listenerStart 配置listener
5.13filterStart 配置 filter
5.14 启动带有<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
处理没有做ServletMapping的那些Servlet.
org.apache.jasper.servlet.JspServle
处理JSP文件的
5.15 标识context已经启动完毕。 走了多少个步骤啊,Context总算是启动完毕喽。 OK! 走到了这里, 每个容器以及组件都启动完毕。 Tomcat终于不辞辛劳地为人民服务了!
总结: 总的来说、通过差不多一个星期时间的学习收获还是很多的,有时发现为什么设计架构的人那么NB ,完全想不到那样做,再想想自己平常写项目,都是一堆堆的代码堆出来的。完全没有什么设计思想以及架构。也许这就是设计师与码农的根本区别吧。多看看这样的源码应该还是会有些潜移默化的作用,看多了自然就会了。看毕其实发现java最精髓的原来是thred和socket。难怪当时学起来一团混沌的感觉,让人摸不着头脑。总之以后要多看大神是如何设计程序的。