日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Tomcat架構(gòu)(四)

系統(tǒng) 2157 0
8標(biāo)準(zhǔn)覆蓋機(jī)制
J2SE 1.4 and 1.5 都包含了一個(gè)XML處理解析器的Java API 。Bootstrap 類加載器加載這個(gè)解析器的類文件,所以這個(gè)解析器會(huì)優(yōu)先于任何一個(gè)安裝在CLASSPATH里的解析器 被加載,即使您已經(jīng)安裝了新版本的解析器。標(biāo)準(zhǔn)覆蓋機(jī)制允許您重寫JAVA_HOME/lib/endorsed文件夾里某些特定的類(例如CORBA 和 JAXP 類)。Bootstrap 類加載器將會(huì)優(yōu)先加載這些類。想詳細(xì)了解此機(jī)制,請(qǐng)?jiān)L問(wèn)http://java.sun.com/j2se/1.5.0/docs/guide/standards/ 。

有關(guān)類加載的一些有趣的注意事項(xiàng)如下所示:
? 只有當(dāng)一個(gè)類具有包名、類名以及加載此類文件的類加載器的實(shí)例的時(shí)候,一個(gè)類才會(huì)被認(rèn)為完全合格。換句話說(shuō),同樣的類被兩個(gè)不同的類加載器加載,會(huì)被認(rèn)為是兩個(gè)不同的類。即使在同一個(gè)JVM中,這已影響到這個(gè)類實(shí)例的分配、靜態(tài)屬性或單例的處理。
? 一個(gè)類加載器只能看到位于它層次結(jié)構(gòu)上面的類的目錄。例如,一個(gè)Extension文件夾里的 JAR不能使用應(yīng)用程序類路徑里的類文件。這是因?yàn)?,Extension文件夾里的類只能看到Extension類加載器以及Bootstrap 類加載器可以加載的類。
? 當(dāng)一個(gè)類的代碼中引用了另一個(gè)類時(shí),加載引用類的類加載器同樣也會(huì)加載被引用的 類,這稱為自定義類加載器。一個(gè)類的自定義類加載器可以使用Class.getClassLoader()來(lái)獲得。
? 每個(gè)線程都有一個(gè)上下文類加載器,使用Thread.currentThread(). getContextClassLoader()可以查看到。每次一個(gè)新的線程被創(chuàng)建,這個(gè)新線程的上下文類加載器會(huì)被設(shè)置到它的創(chuàng)建線程。main()線程的類加載器是應(yīng)用程序類加載器,它會(huì)自動(dòng)向下傳播到每個(gè)工作線程,除非您通過(guò)調(diào)用 Thread.currentThread() .setContextClassLoader() 進(jìn)行干預(yù)。
9JavaEE類加載
在JavaEE的范疇里這種模式顯得有些別扭。
首先,Servlet容器需要為web應(yīng)用提供一個(gè)限制環(huán)境。
如果某個(gè)servlet直接使用系統(tǒng)類加載器(System CalssLoader),那么該servlet會(huì)看到啟動(dòng)Tocmat時(shí)所使用JVM命令中所使用的path下的所有類。這是有潛在安全風(fēng)險(xiǎn)的,因?yàn)閻阂鈶?yīng)用(部署在同一個(gè)主機(jī)商的主機(jī)上的應(yīng)用)可能被允許加載到其兄弟節(jié)點(diǎn)上的web應(yīng)用的類。正是因?yàn)槿绱耍總€(gè)web應(yīng)用必須有自己的類加載器,而該類加載器位于類加載器樹的根節(jié)點(diǎn)并且可以優(yōu)先加載在web應(yīng)用的目錄WEB-INF/classes以及WEB-INF/lib下所發(fā)現(xiàn)的類。
當(dāng)所請(qǐng)求加載的類是java標(biāo)準(zhǔn)時(shí),該自定義類加載器將只委托其父類加載器來(lái)加載;如果一個(gè)web應(yīng)用還需要其他的類,那么這個(gè)自定義類加載器不是去委托其父類去加載,而是首先檢查WEB-INF/classes以及WEB-INF/lib中是否包含該類。只有在這兩個(gè)目錄都找不到時(shí),該類加載器才會(huì)委托給其父類加載器來(lái)加載,而父類加載器的的加載遵循標(biāo)準(zhǔn)委托模式。(譯注:類加載相關(guān)知識(shí)請(qǐng)看文章末尾)。

Tomcat的額外類加載器
Tomcat架構(gòu)(四)
在啟動(dòng)過(guò)程中,Tomcat首先通過(guò)清除CLASSPATH并將其重新指向CATALINA_HOME/bin/bootstrap.jar(Tomcat啟動(dòng)所需的類)、tomcat-juli(日志功能)、tools.jar(jsp編譯功能)來(lái)屏蔽系統(tǒng)類加載器(System ClassLoader)。這使得系統(tǒng)類加載器只有在加載一小部分Tomcat特殊類時(shí)才起作用。?
同時(shí)Tomcat也改變了支持目錄并將其重新指向CATALINA_HOME/endorsed目錄。
在其自定類加載器之下,Tomcat又增加了它自己的類加載器,這其中包括server類加載器(Server class loader)、共享類加載器(Shared class loader)、通用類加載器(Common class loader)以及每個(gè)部署的應(yīng)用程序都有的一個(gè)web應(yīng)用程序類裝入器。
當(dāng)一個(gè)web應(yīng)用需要加載一個(gè)類時(shí),請(qǐng)求首先發(fā)送至web應(yīng)用的類加載器,該加載器負(fù)責(zé)加載web應(yīng)用中WEB-INF/classes和WEB-INF/lib兩個(gè)目錄下的類。
web應(yīng)用類加載器首先會(huì)請(qǐng)求系統(tǒng)類加載器來(lái)允許各層類加載器可以查找所有java核心類。當(dāng)所請(qǐng)求的類未找到到時(shí),該web應(yīng)用類加載器會(huì)嘗試從自身類庫(kù)中定位所請(qǐng)求的類;如果仍然未找到,它將委托通用類加載器或者如果有共享類加載器時(shí)委托共享類加載器來(lái)加載。?
共享類加載器和服務(wù)器類加載器默認(rèn)情況下是沒(méi)有安裝的,但是我們可以通過(guò)編輯 CATALINA_HOME/conf/catalina.properties文件通過(guò)增加shared.loader和server.loader來(lái)開啟共享類加載器以及server類加載器;而Common類加載器會(huì)監(jiān)控CATALINA_HOME/lib目錄的內(nèi)容,該下為一些蟬蛹的jar包,比如servlet-api.jar, jasper.jar, coyote.jar, and jsp-api.jar。此外,位于共享目錄下的類將對(duì)所有web應(yīng)用可見,但不是Tomcat的內(nèi)部類,而放在服務(wù)器的loader目錄的類將只對(duì)Tomcat內(nèi)部類可見。
10web應(yīng)用中的類重載
使Tomcat支持類重載的web應(yīng)用特定類加載器。
當(dāng)context需要被新部署或者當(dāng)一個(gè)類需要被重載時(shí)(例如當(dāng)一個(gè)被重新編譯過(guò)的類文件加入到WEB-INF/classes目錄時(shí)),整個(gè)web應(yīng)用的類加載器都會(huì)被拋棄,然后創(chuàng)建一個(gè)新的實(shí)例分支來(lái)加載該web應(yīng)用的所有類。該新的類加載就是用來(lái)為之后的請(qǐng)求服務(wù)的。
11Logger
server.xml中的logger元素在Tomcat5.5中就已經(jīng)被棄用;所以在Tomcat6中是基于Java1.4中所引入的日志API來(lái)生成日志的。
然而Java日志只能在整個(gè)JVM級(jí)別來(lái)進(jìn)行配置,而不能對(duì)每個(gè)類加載器單獨(dú)配置。為了使每個(gè)web應(yīng)用程序都能允許不同的配置文件,Tomcat實(shí)現(xiàn)了自定義的Java日志,這就是我們所熟知的JULI,該實(shí)現(xiàn)位于CATALINA_HOME/bin/tomcat-juli.jar中。
全局的配置文件CATALINA_HOME/conf/logging.properties控制著日志設(shè)置。此外,每個(gè)web應(yīng)用也可以有自己的日志配置文件WEB-INF/classes/logging.properties。 Tomcat架構(gòu)(四)
如上圖所示,日志由一下組件組成:?
● Logger:所有的日志請(qǐng)求會(huì)進(jìn)入Logger對(duì)象。這些對(duì)象都按層次排列,其根在根logger;同時(shí)這種層次結(jié)構(gòu)也反映了包結(jié)構(gòu)。在該層次中屬性可以被綁定到任何級(jí)別上,而且Logger的子類也會(huì)繼承器父類屬性。
● Handler:指定日志消息應(yīng)該發(fā)送何處。可選的有ConsoleHandler(將日志寫入控制臺(tái))、FileHandler(將日志寫入文件)、SocketHandler(將日志寫入Tcp socket)。
● Level(日志級(jí)別):日志級(jí)別有其中:SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST、OFF(禁用)、ALL(記錄所有信息),每種級(jí)別決定了需要記錄何種類型的消息。
●Formatter(日志格式化):該元素決定了信息以什么格式展示。Tomcat提供了SimpleFormatter、XMLFormatter兩種格式化工具。
12資源(Resource)
和web應(yīng)用上下文相關(guān)的資源包括靜態(tài)資源,如類文件、HTML、JSP、CSS文件。這些資源可能以不同的格式存在。默認(rèn)情況下,Tomcat支持從war格式的壓縮文件(譯注:war包)或者解壓過(guò)的war中查找資源文件。
可想而知,一個(gè)上下文中的資源也可能從替代存儲(chǔ)機(jī)制中訪問(wèn),比如JDBC數(shù)據(jù)庫(kù)。而資源組件使之成為可能。
Tomcat同時(shí)也提供基于目錄服務(wù)的JNDI API,該服務(wù)可支持從未知存儲(chǔ)方式中讀取資源。
總結(jié)
這里講了很多,現(xiàn)在我們需要做的就是使自己理解Tomcat架構(gòu)總覽中所講解的東西。在這篇文章里,我們討論了一些Tomcat的核心組件,看到了一個(gè)運(yùn)行中的Tomcat實(shí)例是如何由各種頂級(jí)組件、連接器(Connector)以及嵌套組件構(gòu)建起來(lái)的。

Tomcat架構(gòu)(四)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 商丘市| 广灵县| 漯河市| 海安县| 石河子市| 吕梁市| 喀什市| 石泉县| 拉孜县| 华容县| 永嘉县| 永寿县| 汝城县| 朔州市| 吐鲁番市| 望奎县| 禹州市| 大埔区| 江西省| 万源市| 香港| 阿荣旗| 新干县| 安阳县| 贵阳市| 罗源县| 方城县| 望奎县| 二连浩特市| 农安县| 抚松县| 澳门| 白河县| 平凉市| 玉树县| 拜城县| 东阿县| 门头沟区| 云阳县| 永定县| 高台县|