==转载自https://www.ibm.com/developerworks/cn/java/j-lo-servlet/
IBM Developer
Servelt和Servelt容器的关系就像枪和子弹的关系,为了解耦,通过标准化接口来相互协作,Servlet容器种类很多,如Tomcat为例。Tomact的容器等级中,Context容器是直接管理Servelt在容器中的包装类Wrapper,所以Context容器如何运行将直接影响Servlet的工作方式。结构为
Tomcat---------Container容器----Engine-----Host----Servlet容器----Context—Wrapper
于是我们知道Tomcat的容器分为四个等级,正真管理Servlet的容器是Context容器,一个Context对应一个Web工程。在Tomcat的配置文件可以很容易发现这一点
<Context path="/projectOne" docBase="D:\projects\projectOne"
reloadable="true"/>
那么Tomcat解析Context容器的过程,包括如何构建Servlet的过程
给tomcat增加一个Web工程
Tomcat tomact = getTomcatInstance();
File qppDir = new File(getBuildDirectory(),"webapps/examples");
tomcat.addWebapp(null,"/examples,appDir.getAbsoultePath());
tomacat.start();
ByteChunk res = getUrl();
assertTure(res.toString().index0f("<h1>hello world</h1>")>0);
//这个代码创建一个Tomcat实例并新增了一个Web应用,然后启动tomcat并调用其中的一个
Hello'World'ExamHelloWorldExample
Tomcat的addWebapp方法代码:
PublicContext addWebapp(Host host,String url,String path){
silence(url);
Ciontext ctx = new StandardContext();
ctx.setPath(url);
ctx.setDocBase(path);
if(defaultRealm == null){
inintSimpleAuth();
}
ctx.setrealm(defaultRealm);
ctx.addLifecycleListener(new DefaultWebXmlListener());
.....
}
//前面介绍了一个Web应用对应一个Context容器也就是Servlet运行的Servlet容器,添加添加一个web应用时将会创建一个StandardContext容器并给这个Context容器设置必要的参数,url和path分别代表这个应用在Tomcat中的访问路径和这个应用实际的物理路径。其中最重要的时contextConfig,这个类会负责整个Web应用配置的解析工作,最后这个Context容器会加载到父容器Host中。
//接下来将会调用Tomcat的start方法启动Tomcat,如果你清楚Tomcat的系统架构,你会很容易理解Tomcat的启动逻辑,Tomcat的启动逻辑是基于观察者模式设计的,所有的容器都会继承于Lifecycle接口,它它管理着容器的整个生命周期,所有容器的修改和状态的改变都会由它去通知已经注册的观察者(listener)