CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

您现在的位置: IT专家网 > Web服务子站 > Java技术

TOMCAT源码分析(启动框架)

作者: zhengsheng ,  出处:IT专家网论坛, 责任编辑: 包春林, 
2008-05-15 04:00
  本文是我阅读了TOMCAT源码后的一些心得。 主要是讲解TOMCAT的系统框架, 以及启动流程。若有错漏之处,敬请批评指教!

  Engin大致会这么做, Host大致也会这么做, Context大致还是会这么做。 那么很显然地, 我们需要在这里使用到代码复用的技术。 tomcat在处理这个问题的时候, 漂亮地使用了抽象类来处理。 ContainerBase. 最后使得这部分完成复杂功能的代码显得干净利落, 干练爽快, 实在是令人觉得叹为观止, 细细品来, 直觉如享佳珍, 另人齿颊留香, 留恋往返啊!

  Engin的触发启动前事件里, 会激活绑定在Engin上的唯一一个Listener:EnginConfig。

  这个EnginConfig类基本上没有做什么事情, 就是把EnginConfig的调试级别设置为和Engin相当。 另外就是输出几行文本, 表示Engin已经配置完毕, 并没有做什么实质性的工作。

  注1: mapping组件的用处是, 当一个需求将要从父容器传递到子容器的时候, 而父容器又有多个子容器的话, 那么应该选择哪个子容器来处理需求呢? 这个由mapping 组件来定夺。

  4. Host

  同Engin一样, 也是调用ContainerBase里面的start()方法, 不过之前做了些自个儿的任务,就是往Host这个容器的通道(pipline)里面, 安装了一个叫做

  “org.apache.catalina.valves.ErrorReportValve”的阀门。

  这个阀门的用处是这样的: 需求在被Engin传递给Host后, 会继续传递给Context做具体的处理。 这里需求其实就是作为参数传递的Request, Response。 所以在context把需求处理完后, 通常会改动response。 而这个org.apache.catalina.valves.ErrorReportValve的作用就是检察response是否包含错误, 如果有就做相应的处理。

  5. 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.5 postWorkDirectory (). Tomcat下面有一个work目录。 我们把临时文件都扔在那儿去。 这个步骤就是在那里创建一个目录。 一般说来会在%CATALINA_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 触发安装在它身上的一个监听器。

  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的, 才能访问。 而且我们还可以限制那些资源可以访问, 而哪些不能。 都是在这里实现的。

  5.9.4 tldScan: 扫描一下, 需要用到哪些标签(tag lab)

  5.10 启动 manager

  5.11 postWelcomeFiles() 我们通常会用到的3个启动文件的名称:

  index.html、index.htm、index.jsp 就被默认地绑在了这个context上

  5.12 listenerStart 配置listener

  5.13 filterStart 配置 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

  处理没有做Servlet Mapping的那些Servlet.

  org.apache.jasper.servlet.JspServlet

  处理JSP文件的.

  5.15 标识context已经启动完毕。

  走了多少个步骤啊, Context总算是启动完毕喽。

  OK! 走到了这里, 每个容器以及组件都启动完毕。 Tomcat终于不辞辛劳地为人民服务了!

?5?? 9 1 2 3 4 5

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅

       
天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i