摘要:自帶的方法和方法最為重要主要完成以下工作創建用于解析的配置文件的對象。讀取默認的自身的配置文件,如果存在則解析。
JAVA WEB 技術是當今主流的互聯網WEB應用技術之一,而Servlet則是JAVA WEB 中的核心基礎。最近在看了《深入分析Java Web技術內幕》(許令波 著)這本書發現了以前沒有看到的內容,就想對書中的內容進行總結,也方便自己以后的回顧,所以就有了這篇文章。
通過這篇文章你將了解到以下內容:
1.Servlet容器是如何工作 2.web應用中的Servlet如何創建 3.Servlet是如何被調用Servlet容器的啟動
在Tomcat中整個的體系結構中,Context容器直接管理Servlet在容器中的包裝類Wrapper,所以Context是真正管理Servlet的容器。通過圖我們還可以看出,一個Context對應著一個Web工程。在Tomcat配置文件中就可以看出:
既然Context容器如此的重要我們就來了解下Tomcat是如何解析Context容器的。
首先,我們已經知道了Context容器是Tomcat運行時的容器,它只有在添加web應用是被加載。
public Context addWebapp(Host host, String url, String path) { silence(url); Context ctx = new StandardContext(); ctx.setPath( url ); ctx.setDocBase(path); if (defaultRealm == null) { initSimpleAuth(); } ctx.setRealm(defaultRealm); ctx.addLifecycleListener(new DefaultWebXmlListener()); ContextConfig ctxCfg = new ContextConfig(); ctx.addLifecycleListener(ctxCfg); ctxCfg.setDefaultWebXml("org/apache/catalin/startup/NO_DEFAULT_XML"); if (host == null) { getHost().addChild(ctx); } else { host.addChild(ctx); } return ctx; }
當一個WEB應用被添加時Tomcat將會創建一個StandardContext容器,并給這個Context容器設置必要的參數,URL和path分別代表這個應用在訪問路徑和這個應用實際的物理路徑。其中最重要的配置就是ContextConfig,這個類非常重要,是負責整個WEB應用的解析工作。
我們就來看看這個ContextConfig:
ContextConfig繼承了LifecycleListener接口,它是在調用addWebApp方法時被加入到StandardContext容器中的,負責整個web應用的配置文件解析工作。 自帶的init()方法和startInternal()方法最為重要 1.init()主要完成以下工作 -創建用于解析的XML配置文件的contextDisester對象。 -讀取默認的context.xml配置文件,如果存在則解析。 -讀取默認的Host配置文件,如果存在則解析。 -讀取默認的Context自身的配置文件,如果存在則解析。 -設置Context的DocBase。 2. startInternal()方法 -創建讀取資源文件的對象 -創建ClassLoader對象。 -設置應用的工作目錄。 -啟動相關的輔助類。 -修改啟動狀態,通知感興趣的觀察者。 -子容器的初始化。 -獲取ServletContext并設置必要的參數 -初始化“load on startup”的Servlet。
最后將這個Context容器添加到父容器中,然后就是調用Tomcat的start方法啟動Tomcat。這樣就完成了整個WEB應用加載的前期工作。
WEB應用的初始化學過Javaweb基礎的同學應該知道,web.xml是我們整個web工程中不可缺少的一個部分,如果你的項目中缺少了它,可能就會導致一些
必要的BUG。同時,整個web應用的初始化主要也是解析這個文件,因為這個文件描述了你的web項目中一些關鍵信息,也是整個web項目的入口。
接下來我們來看下Tomcat是如何加載到這個如此重要的配置文件的。
1.首先會找到globalWebXml 2.接著會找到hostWebXml 3.最后是尋找應用的配置文件web.xml
完成以上的步驟之后,Tomcat會將web.xml中的相應屬性保存到WebXml對象中。現在很多的后臺web應用都已經升級到Servlet3.0了,如果你的項目也支持了這個版本,那么在解析配置文件的時候,還要完成Servlet3.0中新增的特性的解析以及對annotat的支持。Servlet3.0在這里就不多介紹了,他不是本文的重點內容。
將屬性存入WebXml對象后,也將相關的屬性設置到Context容器中,這些屬性包括Servlet,listener,filter,其中Servlet被包裝成具有容器屬性的StandardWrapper。
看到這里我們來對web.xml的作用進行一個總結
1.web應用的解析入口 2.作為用來指定context容器屬性的配置文件Servlet的創建與初始化
首先我們來看看Tomcat是如何創建Servlet:
創建Servlet實例的方法是從Wrapper.loadServlet開始的,這個方法要完成的就是獲取servletClass,然后交給InstanceManager去創建一個基于servletClass.class的對象。
如果在web.xml中配置了
Servlet的初始化操作是在StandardWrapper的initServlet方法中完成的,作用就是調用Servlet的init(),同時將StandardWrapperFacade作為ServletConfig傳給Servlet。
StandardWrapperFacade的作用就是從StandardWrapper中拿到的數據只是ServltConfig中規定的數據,而不把不關心的數據暴露給Servlet,起到了對數據封裝的作用。
如果初始化的是JspServlet,那Tomcat會模擬一次請求,去請求這個JSP文件,為的是將這個jsp文件編譯成類,并初始化這個類,用于后面的使用。
Servlet如何工作在前面的內容中我們了解了Servlet的加載、創建、初始化,下面的內容中我們就來看看Servlet是如何被調用的。
用戶向服務器發送請求通常包含的信息:
http://hosthome:port/contextpath/servletpath 其中 hosthome 和 port 用于與服務器建立TCP連接,而后面的URL則是用戶請求服務器中的某個子容器的數據。
我們以Tomcat這個常用的容器來說明服務器是如何根據這個URL找到正確的Servlet容器。
在Tomcat中這種映射工作是由org.apache.tomcat.util.http.mapper這個專門的類去處理的。 這個類保存了Tomcat的Container容器中所有子容器的信息,當請求的Request類進入Container容器之前, Mapper將會根據這次請求的hostname和contextPath將host和context容器設置到Request的mappingData屬性中。
所以在請求進入容器之前就已經知道要訪問那個子容器。
在知道要訪問那個子容器后,接下來就是要執行Servlet的service方法。我們通常的做法就是不繼承javax.servlet.servlet接口更為簡單的HttpServlet類。
但是現在的WEB應用已經直接使用Servlet來完成用戶的交互邏輯了,而是使用更為高效的MVC框架來完成這些任務。
而這些框架的入口也是Servlet的Service方法。
當Servlet從Servlet容器中移除時,也就說明Servlet的生命周期就結束了,這時Servlet的destroy方法將被調用,做一些掃尾工作。
寫在最后這篇文章是我的第一篇文章,如果有寫的不好的地方,請各位大佬輕噴,小弟再此跪謝了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69902.html
摘要:本文示例見這個項目的分支下的項目這個項目是為本文單獨建立的。的內置支持用于處理應用程序中的文件上傳。提供了一個的實現,使用了的和一些其他的東西,用于對的請求的解析。首先,創建一個帶有的表單,這樣用戶就可以通過這個表單上傳文件了。 ??本文示例見這個項目的 upload 分支下的項目(這個項目是為本文單獨建立的)。 ??WARNING:本文中有一部分直接把英文原文搬過來了,我的翻譯能力實...
摘要:在中,就是前端控制器的任務是將請求發送給控制器。處理器映射會根據請求所攜帶的信息來進行決策一旦選擇了合適的控制器,會將請求發送給選中的控制器。這些信息被稱為模型。因此無需在配置類中顯式聲明任何的控制器具體來講是試圖解析器。 Spring MVC基于模型-視圖-控制器(Model-View-Controller,MVC)模式實現,能夠構建像Spring框架那樣靈活和松耦合的Web應用程序...
摘要:原文鏈接和都是網絡服務器,兩者既有聯系又有區別,在進行等開發過程中,需要準確掌握其各自特點,選擇最佳的服務器配置。側重于,側重于引擎,如果以方式運行,功能上與等效支持,但對靜態網頁不太理想。 原文鏈接Apache 和 Tomcat 都是web網絡服務器,兩者既有聯系又有區別,在進行HTML、PHP、JSP、Perl等開發過程中,需要準確掌握其各自特點,選擇最佳的服務器配置。 Apa...
摘要:源碼倉庫本文倉庫三層結構表現層模型業務層持久層工作流程用戶前端控制器用戶發送請求前端控制器后端控制器根據用戶請求查詢具體控制器后端控制器前端控制器處理后結果前端控制器視圖視圖渲染視圖前端控制器返回視圖前端控制器用戶響應結 SpringMvc 【源碼倉庫】【本文倉庫】 三層結構 表現層 MVC模型 業務層 service 持久層 dao 工作流程 用戶->前端控制器:用戶...
閱讀 742·2021-07-25 21:37
閱讀 3654·2019-08-30 15:55
閱讀 2572·2019-08-30 15:54
閱讀 1717·2019-08-30 15:44
閱讀 3123·2019-08-30 15:44
閱讀 859·2019-08-30 15:43
閱讀 1024·2019-08-29 15:36
閱讀 3038·2019-08-29 10:58