要介绍 Servlet 必需要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力。虽然它们是彼此依存的,可是又相互独立发展,这一切都是为了适应工业化生产的结果。从技术角度来讲是为了解耦,经过标准化接口来相互协做。既然接口是链接 Servlet 与 Servlet 容器的关键,那咱们就从它们的接口提及。web
咱们这里仍是以你们最为熟悉 Tomcat 为例来介绍 Servlet 容器如何管理 Servlet。Tomcat 自己也很复杂,咱们只从 Servlet 与 Servlet 容器的接口部分开始介绍。apache
Tomcat 的容器等级中,Context 容器是直接管理 Servlet 在容器中的包装类 Wrapper,因此 Context 容器如何运行将直接影响 Servlet 的工做方式。tomcat
从上图能够看出 Tomcat 的容器分为四个等级,真正管理 Servlet 的容器是 Context 容器,一个 Context 对应一个 Web 工程,在 Tomcat 的配置文件中能够很容易发现这一点,以下:app
清单 1 Context 配置参数webapp
<Context path="/projectOne " docBase="D:\projects\projectOne" reloadable="true" />
下面详细介绍一下 Tomcat 解析 Context 容器的过程,包括如何构建 Servlet 的过程。ui
Tomcat7 也开始支持嵌入式功能,增长了一个启动类org.apache.catalina.startup.Tomcat。建立一个实例对象并调用 start 方法就能够很容易启动 Tomcat,咱们还能够经过这个对象来增长和修改 Tomcat 的配置参数,如能够动态增长 Context、Servlet 等。下面咱们就利用这个 Tomcat 类来管理新增的一个 Context 容器,咱们就选择 Tomcat7 自带的 examples Web 工程,并看看它是如何加到这个 Context 容器中的。spa
清单 2 . 给 Tomcat 增长一个 Web 工程code
Tomcat tomcat = getTomcatInstance(); File appDir = new File(getBuildDirectory(), "webapps/examples"); tomcat.addWebapp(null, "/examples", appDir.getAbsolutePath()); tomcat.start(); ByteChunk res = getUrl("http://localhost:" + getPort() + "/examples/servlets/servlet/HelloWorldExample"); assertTrue(res.toString().indexOf("<h1>Hello World!</h1>") > 0);
清单 1 的代码是建立一个 Tomcat 实例并新增一个 Web 应用,而后启动 Tomcat 并调用其中的一个 HelloWorldExample Servlet,看有没有正确返回预期的数据。xml