要介紹 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