Tomcat学习之Context

context

一个context代表一个web应用,它运行在特定的虚拟主机中,每个web应用要么是一个war文件,要么是一个符合规范的目录。一般HTTP请求路径中带有requestURI,我们可以从requestURI中获取上下文路径,根据上下文路径可以选择适合的web应用程序来处理这个请求。你还可以定义多个context,但每个context的名称必须唯一。

context一般会出现在以下三个地方:
(1)、放到web应用的/META-INF/context.xml中,此时如果copyXML属性为true,会将其被拷贝到 $CATALINA_BASE/conf/[enginename]/[hostname]/ 目录中,并命名为应用名;
(2)、直接放到$CATALINA_BASE/conf/[enginename]/[hostname]/ 目录下,该文件将总是优先于/META-INF/context.xml部署;
(3)、server.xml文件的Host元素下面

并不推荐将context直接写在server.xml文件中,因为修改server.xml文件不会导致重新部署,必须重新启动tomcat才会生效,但是在server.xml文件中可以定义多个context元素,其他两种情况不允许。此外,$CATALINA_BASE/conf/context.xml这个文件会被所有web应用加载,$CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default会被同一台主机的所有web应用加载。

StandardContext

standardContext是Context的标准实现,下面来看看这个类在初始化和启动的时候都做了些什么事。

initInternal

tomcat在启动的过程中是怎么从host过渡到context的?记得在hostconfig类中在部署web应用的时候会调用host.addChild()方法将context挂在host名下作为它的子容器


从上图可以看出在调用host.addChild()方法时触发了child的start方法,再生命周期循环到context的initInternal方法

看看这个方法的代码:

  1. protected void initInternal() throws LifecycleException {  
  2.     super.initInternal();  
  3.       
  4.     if (processTlds) {  
  5.         this.addLifecycleListener(new TldConfig());  
  6.     }  
  7.   
  8.     // Register the naming resources  
  9.     if (namingResources != null) {  
  10.         namingResources.init();  
  11.     }  
  12.   
  13.     // Send j2ee.object.created notification   
  14.     if (this.getObjectName() != null) {  
  15.         Notification notification = new Notification("j2ee.object.created",  
  16.                 this.getObjectName(), sequenceNumber.getAndIncrement());  
  17.         broadcaster.sendNotification(notification);  
  18.     }  
  19. }  
很简单做了两件事:1、添加tld标签配置文件监听器;2、发送对象创建的消息,这涉及到JMX的知识,需要找个时间专门研究。
startInternal

比initInternal方法复杂得多,大体上做了以下几件事:

1、构建webappclassLoader; 

2、从CharsetMapperDefault.properties中获取字符集,默认只支持两种en=ISO-8859-1和fr=ISO-8859-1

3、创建工程目录workdir=work/enginename/hostname/contextname

4、context启动完后,随即启动它的附属组件:loader,logger,pipeline,sessionManager等

5、触发contextconfig.lifecycleEvent调用contextConfig.lifecycleEvent处理web.xml配置文件

5、启动它的每个wrapper子容器

6、加载和初始始化那些标识"load on startup"的servlet类

配置

context元素配置项相当多,挑几个重要的说说:
className:context的实现类,默认为Startardcontext
cookies:是否启用cookies,默认为true
docBase:web应用所在的目录,当context定义在server.xml时这个值必须设置,当docbase不在webapps目录下时也必须设置
path:web应用的上下文路径,同一台主机必须唯一,如果为空串则可以处理所有请求
unpackWAR:Standard Context中特有的属性,如果为false表示war包不会被解压,默认为true
workDir:Standard Context中特有的属性,JSP等会被编译在这个目录

reloadable:如果你需要监视 /WEB-INF/classes/ 和/WEB-INF/lib目录下的文件,就把它设置为true吧,变化后会重载web应用,开发的时候很有用,默认为false,常常提到的重新部署和重新加载,两者之间的区别后续再分析。


转自:http://blog.csdn.net/aesop_wubo/article/details/7682711

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值