tomcat解析(十三)StandardContext

在一个tomcat服务器的生命周期内可以会创建一个或多个StandardContext对象,StandardContext对象代表的是一个具体的工程项目,对应的可以是server.xml里的<context>标签或webapps文件夹下的某一个工程文件夹或war包,也可以对应于conf/Catalina/localhost文件夹下的任一个xml文件里的Context配置,在tomcat中,这些context代表的是某一具体的工程,在某一主机可以部署多个工程,如在webapps里可以有多个工程,因此可以这样理解,某一工程对应于某一主机,但某一主机可以对应多个工程,在tomcat里,某一具体的主机由StardardHost对象表示,通常在本机做测试时是localhost,但当使用集群时则可能需要做一些额外的配置,这里先不做讨论。下面我们继续看一下在tomcat初始化过程StandardContext类里做了什么事情

有构造方法如下:
      

<一>start方法
内容很多,但与StardardHost相异不大,同样的,主要的工作都交由其LifecycleListener来完成,可以在server.xml或HostConfig类里看到,StardardContext的监听器类为ContextConfig,在的start方法里每次触发一下Lifecycle事件的时候便会调用ConctextConfig类的lifecycleEvent方法,在该方法里进行了所有对某一Web工程的解析工作,该方法如下:
     
    在StandardContext.start()里依次触发了INIT_EVENT,BEFORE_START_EVENT,START_EVENT,AFTER_START_EVENT,下面让我们看一下ContextConfig对应的init,beforeStart,start方法,如下:
  
    这里实例化了两个Digester类,分别为webDigester,contextDigester,createWebDigester创建Digester后设置了其RuleSet为WebRuleSet,该类设置为解析web.xml所需要的所有Rule;createContextDigester类设置了解析<Context>相关的Rule;contextConfig()对默认的配置文件如conf/context.xml或context.xml.default进行解析,产生相应的context对象
        在ContextConfig.start里进行了对具体某一Context对应的Web工程的解析,当然最主要的是对web.xml文件的解析,以下是start方法的内容:
      
1.defaultWebConfig主要用于处理默认的web.xml,TOMCAT服务器有一些默认的WEB.XML,在默认的web.xml里做的配置可生效于所有的web工程,我们可以看一下该方法里将会对哪些默认的文件进行处理,该方法如下:
  
    首先要得到defaultWebXml的值,该值默认为空,因此将调用((StandardContext)context).getDefaultWebXml(),context里的DefaultWebXml是需要配置的(如server.xml),如果没有配置的话将调用ContextConfig.getDefaultWebXml()来获取,该方法如下:
   
    可以看到DefaultWebXml所代表的是conf下的web.xml文件,下面的步骤包括转换成绝对路径,读取输入流,加入到Context的WatchedResource等,这里看一下WatchedResource部分将如何处理
   
    可以看到内容就是将该文件的绝对路径字符串加入到Context持有的watchedResources字符串数组中,该数组也可以在context的配置xml文件里配置,最后触发容器监听事件
剩余的内容与上面类似,但处理的是web.xml.default.
2.applicationWebConfig
  
    如果我们有设置ServletContext的altDDName属性,则会读取其altDDName属性对应的值为路径来读取相应的配置,如果没有配置(一般都没有),那将会读取Constants.ApplicationWebXml路径对应的文件,而这个常量即是我们经常会看到的/WEB-INF/web.xml;最后使用在INIT方法初始化完成的webDigester来对这个配置文件进行解析,下文我们来看一下其解析过程
3.applicationAnnotationsConfig
    设置工程对注释敏感,从JDK1.5开始,JAVA便支持注释(annotation),因此TOMCAT版本也相应做了处理来支持这种功能,因为本人对这块也不是很熟悉,因此这里先不对这部分内容做详解,哈哈
4.validateSecurityRoles
    这里对web.xml里设置的一些roles进行一些简单的校验,然后全部放到context持有的字符串数组securityRoles里
5.authenticatorConfig
    这里会根据web.xml里配置的login-config等权限安全访问来确定是否为本context配置一个用于确定访问权限的Valve(授权管理器),该对象将被放于StandardContext持有的StandardPipeline对象里(如构造方法里),调用的是StandardPipeline.addValve方法,该方法如下:
  
    StandardPipeline是一个类似管道理念的类,其内存储着一连串有着前后关系的同一接口的处理类,当需要使用该管道类来处理某一应用时,会以一种链式的方式处理,每一个处理类执行完自己处理的部分后交由下一个处理类,依次类推直至最终的basic Vavle,在basic vavle执行完将返回前一个处理类执行剩余部分,再依次类推直至第一个处理类,这个理念也是WEB工程中Filter的实现方式,相似方式实现的还有struts 2的拦截器实现.
    下一篇我们先来说一下对web.xml解析的某些值得留意的内容,之后再来看一下对于客户端发起的一个请求,TOMCAT服务器是如何进行处理的

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值