Tomcat架構(gòu)設(shè)計(jì)及Servlet作用規(guī)范講解
1.Servlet規(guī)范
1.1 Servlet作用講解
Servlet是JavaEE規(guī)范中的一種,主要是為了擴(kuò)展Java作為Web服務(wù)的功能,統(tǒng)一定義了對(duì)應(yīng)的接口,比如Servlet接口,HttpRequest接口,HttpResponse接口,F(xiàn)ilter接口。
然后由具體的服務(wù)廠商來(lái)實(shí)現(xiàn)這些接口功能,比如Tomcat,jetty等。
在規(guī)范里面并不會(huì)有具體的實(shí)現(xiàn)。
可以自行看下源碼,而在Servlet規(guī)范中規(guī)定了一個(gè)http請(qǐng)求到來(lái)的執(zhí)行處理流程:
對(duì)應(yīng)的服務(wù)器容器會(huì)接收到對(duì)應(yīng)的Http請(qǐng)求,然后解析該請(qǐng)求,然后創(chuàng)建對(duì)應(yīng)的Servlet實(shí)例,調(diào)用對(duì)應(yīng)init方法來(lái)完成初始化,把請(qǐng)求的相關(guān)信息封裝為HttpServletRequest對(duì)象來(lái)調(diào)用Servlet的service方法來(lái)處理請(qǐng)求,然后通過(guò)HttpServletResponse封裝響應(yīng)的信息交給容器,響應(yīng)給客戶(hù)端。
1.2 Servlet核心API
我們?cè)賮?lái)回顧下Servlet中的核心API,這塊對(duì)我們更好的掌握Tomcat的內(nèi)容還是非常有幫助的。
API | 描述 |
---|---|
ServletConfig | 獲取servlet初始化參數(shù)和servletContext對(duì)象。 |
ServletContext | 在整個(gè)Web應(yīng)用的動(dòng)態(tài)資源之間共享數(shù)據(jù)。 |
ServletRequest | 封裝Http請(qǐng)求信息,在請(qǐng)求時(shí)創(chuàng)建。 |
ServletResponse | 封裝Http響應(yīng)信息,在請(qǐng)求時(shí)創(chuàng)建。 |
ServletConfig:
容器在初始化servlet時(shí),為該servlet創(chuàng)建一個(gè)servletConfig對(duì)象,并將這個(gè)對(duì)象通過(guò)init()方法來(lái)傳遞并保存在此Servlet對(duì)象中。核心作用:
- 獲取初始化信息;
- 獲取ServletContext對(duì)象。
ServletContext
一個(gè)項(xiàng)目只有一個(gè)ServletContext對(duì)象,可以在多個(gè)Servlet中來(lái)獲取這個(gè)對(duì)象,使用它可以給多個(gè)Servlet傳遞數(shù)據(jù),該對(duì)象在Tomcat啟動(dòng)時(shí)就創(chuàng)建,在Tomcat關(guān)閉時(shí)才會(huì)銷(xiāo)毀!作用是在整個(gè)Web應(yīng)用的動(dòng)態(tài)資源之間共享數(shù)據(jù)。
在實(shí)際的Servlet開(kāi)發(fā)中,我們會(huì)實(shí)現(xiàn)HttpServlet接口,在該接口中會(huì)實(shí)現(xiàn)GenericServlet,而在GenericServlet會(huì)實(shí)現(xiàn)ServiceConfig接口,從而可以獲取ServletContext容器對(duì)象
所以在Servlet中我們可以很容易的獲取到ServletContext對(duì)象,從而完成對(duì)應(yīng)的操作。
public class ServletTwoImpl extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); // 1、參數(shù)傳遞 ServletContext servletContext = this.getServletContext() ; String value = String.valueOf(servletContext.getAttribute("name")) ; System.out.println("value="+value); // 2、獲取初始化參數(shù) String userName= servletContext.getInitParameter("user-name") ; System.out.println("userName="+userName); // 3、獲取應(yīng)用信息 String servletContextName = servletContext.getServletContextName() ; System.out.println("servletContextName="+servletContextName); // 4、獲取路徑 String pathOne = servletContext.getRealPath("/") ; String pathTwo = servletContext.getRealPath("/WEB-INF/") ; System.out.println("pathOne="+pathOne+";pathTwo="+pathTwo); response.getWriter().print("執(zhí)行:doGet; value:"+value); } }
1.3 ServletRequest
HttpServletRequest接口繼承ServletRequest接口,用于封裝請(qǐng)求信息,該對(duì)象在用戶(hù)每次請(qǐng)求servlet時(shí)創(chuàng)建并傳入servlet的service()方法,在該方法中,傳入的servletRequest將會(huì)被強(qiáng)制轉(zhuǎn)化為HttpservletRequest 對(duì)象來(lái)進(jìn)行HTTP請(qǐng)求信息的處理。核心作用:
- 獲取請(qǐng)求報(bào)文信息;
- 獲取網(wǎng)絡(luò)連接信息;
- 獲取請(qǐng)求域?qū)傩孕畔ⅰ?/li>
1.4 ServletResponse
HttpServletResponse繼承自ServletResponse,封裝了Http響應(yīng)信息??蛻?hù)端每個(gè)請(qǐng)求,服務(wù)器都會(huì)創(chuàng)建一個(gè)response對(duì)象,并傳入給Servlet.service()方法。核心作用:
- 設(shè)置響應(yīng)頭信息;
- 發(fā)送狀態(tài)碼;
- 設(shè)置響應(yīng)正文;
- 重定向;
2.Tomcat的設(shè)計(jì)
通過(guò)上面Servlet規(guī)范的介紹,其實(shí)我們發(fā)下我們要實(shí)現(xiàn)Servlet規(guī)范的話(huà),很重要的就得提供一個(gè)服務(wù)容器來(lái)獲取請(qǐng)求,解析封裝數(shù)據(jù),并調(diào)用Servlet實(shí)例相關(guān)的方法。也就是如下圖中的部分
這塊的內(nèi)容其實(shí)就是Tomcat,具體的我們來(lái)看看。
2.1 什么是Tomcat
Tomcat是一個(gè)容器,用于承載Servlet,那么我們說(shuō)Tomcat就是一個(gè)實(shí)現(xiàn)了部分J2EE規(guī)范的服務(wù)器。J2 EE和Jakarta EE(Eclipse基金會(huì))這兩是啥?用于Tomcat10以后都是Jakarta EE,而9之前就是J2EE.
2.2 Tomcat的架構(gòu)結(jié)構(gòu)
我們通過(guò)上面的分析,知道Tomcat是一個(gè)Servlet規(guī)范的實(shí)現(xiàn),要接收請(qǐng)求和響應(yīng)請(qǐng)求,那么具體是如何實(shí)現(xiàn)的呢?這塊我們可以通過(guò)conf下的server.xml得出對(duì)應(yīng)的結(jié)論。
server.xml是Tomcat中最重要的配置文件,server.xml 的每一個(gè)元素都對(duì)應(yīng)了Tomcat 中的一個(gè)組件 ;通過(guò)對(duì)xml文件中元素的配置,可以實(shí)現(xiàn)對(duì)Tomcat中各個(gè)組件的控制。因此,學(xué)習(xí)server.xml文件的配置,對(duì)于了解和使用Tomcat至關(guān)重要.
<?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
極簡(jiǎn)模式
<Server> <Service> <Connector /> <Connector /> <Engine> <Host> <Context /><!-- 現(xiàn)在常常使用自動(dòng)部署,不推薦配置Context元素,Context小節(jié)有詳細(xì)說(shuō)明 --> </Host> </Engine> </Service> </Server>
梳理出的結(jié)構(gòu)
對(duì)應(yīng)的每個(gè)組件的作用。
2.3 組件分類(lèi)
官網(wǎng)其實(shí)對(duì)上面的組件也做了分類(lèi):
頂級(jí)元素:
- Server:是整個(gè)配置文件的根元素
- Service:代表一個(gè)Engine元素以及一組與之相連的Connector元素
連接器:
- 代表了外部客戶(hù)端發(fā)送請(qǐng)求到特定Service的接口;同時(shí)也是外部客戶(hù)端從特定Service接收響應(yīng)的接口。
容器:
容器的作用是處理Connector接收進(jìn)來(lái)的請(qǐng)求,并產(chǎn)生對(duì)應(yīng)的響應(yīng),Engine,Host和Context都是容器,他們不是平行關(guān)系,而是父子關(guān)系。
每個(gè)組件的作用:
- Engine:可以處理所有請(qǐng)求
- Host:可以處理發(fā)向一個(gè)特定虛擬主機(jī)的所有請(qǐng)求
- Context:可以處理一個(gè)特定Web應(yīng)用的所有請(qǐng)求
核心組件的串聯(lián)關(guān)系:
當(dāng)客戶(hù)端請(qǐng)求發(fā)送過(guò)來(lái)后其實(shí)是通過(guò)這些組件相互之間配合完成了對(duì)應(yīng)的操作。
- Server元素在最頂層,代表整個(gè)Tomcat容器;一個(gè)Server元素中可以有一個(gè)或多個(gè)Service元素
- Service在Connector和Engine外面包了一層,把它們組裝在一起,對(duì)外提供服務(wù)。一個(gè)Service可以包含多個(gè)Connector,但是只能包含一個(gè)Engine;Connector接收請(qǐng)求,Engine處理請(qǐng)求。
- Engine、Host和Context都是容器,且Engine包含Host,Host包含Context。每個(gè)Host組件代表Engine中的一個(gè)虛擬主機(jī);每個(gè)Context組件代表在特定Host上運(yùn)行的一個(gè)Web應(yīng)用.
整體Tomcat的運(yùn)行架構(gòu)圖
以上就是Tomcat架構(gòu)設(shè)計(jì)及Servlet作用規(guī)范講解的詳細(xì)內(nèi)容,更多關(guān)于Tomcat架構(gòu)設(shè)計(jì)Servlet規(guī)范的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決Idea的tomcat啟動(dòng)報(bào)多個(gè)listener的錯(cuò)誤問(wèn)題
這篇文章主要介紹了解決Idea的tomcat啟動(dòng)報(bào)多個(gè)listener的錯(cuò)誤問(wèn)題,本文給大家分享解決方法對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10詳解tomcat部署靜態(tài)html網(wǎng)站方法
這篇文章主要介紹了tomcat部署靜態(tài)html網(wǎng)站方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06tomcat9 下載安裝和配置+整合到eclipse的教程詳解
這篇文章主要介紹了tomcat9 下載安裝和配置+整合到eclipse,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07tomcat的catalina.out日志按自定義時(shí)間格式進(jìn)行分割的操作方法
這篇文章主要介紹了tomcat的catalina.out日志按自定義時(shí)間格式進(jìn)行分割,包括安裝Cronolog,修改Tomcat下bin/catalina.sh文件,shell利用crontab自動(dòng)清除日志的相關(guān)知識(shí),需要的朋友可以參考下2022-04-04intellij idea 使用Tomcat部署的項(xiàng)目位置在哪
intellij idea 使用Tomcat部署的項(xiàng)目在哪里,為什么不在Tomcat的webapps目錄下面,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-01-01同一臺(tái)服務(wù)器(電腦)運(yùn)行多個(gè)Tomcat的設(shè)置方法步驟
這篇文章主要介紹了同一臺(tái)服務(wù)器(電腦)運(yùn)行多個(gè)Tomcat的設(shè)置方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04Tomcat注冊(cè)成服務(wù)的幾個(gè)注意點(diǎn)小結(jié)
這篇文章主要介紹了Tomcat注冊(cè)成服務(wù)的幾個(gè)注意點(diǎn),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08解決Tomcat啟動(dòng)報(bào)錯(cuò)Publishing?failed??multiple問(wèn)題
這篇文章主要介紹了解決Tomcat啟動(dòng)報(bào)錯(cuò)Publishing?failed??multiple問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Tomcat服務(wù)器啟動(dòng)失敗的一些原因及解決辦法總結(jié)
Tomcat是常用的應(yīng)用服務(wù)器之一,主要用于開(kāi)發(fā)和測(cè)試,也有少量用戶(hù)用在生產(chǎn)系統(tǒng)中,這篇文章主要給大家介紹了關(guān)于Tomcat服務(wù)器啟動(dòng)失敗的一些原因及解決辦法的相關(guān)資料,需要的朋友可以參考下2023-12-12