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