JavaWeb篇_09——Tomcat運(yùn)行過(guò)程以及Servlet繼承結(jié)構(gòu)
Tomcat運(yùn)行過(guò)程
- 用戶訪問(wèn)localhost:8888/test/helloword.do,請(qǐng)求被發(fā)送到Tomcat,被監(jiān)聽(tīng)8888端口并處理 HTTP/1.1 協(xié)議的Connector獲得。
- Connector把該請(qǐng)求交給它所在的Service的Engine來(lái)處理,并等待Engine的回應(yīng)。
- Engine獲得請(qǐng)求localhost/test/helloword.do,匹配所有的虛擬主機(jī)Host。
- Engine匹配到名為localhost的Host虛擬主機(jī)來(lái)處理/test/helloword.do請(qǐng)求(即使匹配不到會(huì)請(qǐng)求交給默認(rèn)Host處理)。
- 匹配到的Context獲得請(qǐng)求/helloword.do。
- 構(gòu)造HttpServletRequest對(duì)象和HttpServletResponse對(duì)象,作為參數(shù)調(diào)用HelloWorld的doGet()或doPost().執(zhí)行業(yè)務(wù)邏輯、數(shù)據(jù)存儲(chǔ)等程序。
- Context把執(zhí)行完之后的結(jié)果通過(guò)HttpServletResponse對(duì)象返回給Host。
- Host把HttpServletResponse返回給Engine。
- Engine把HttpServletResponse對(duì)象返回Connector。
- Connector把HttpServletResponse對(duì)象返回給客戶Browser。
Servlet繼承結(jié)構(gòu)
Servlet接口
- init(),創(chuàng)建Servlet對(duì)象后立即調(diào)用該方法完成一些初始化工作。
- service(),處理客戶端請(qǐng)求,執(zhí)行業(yè)務(wù)操作,利用響應(yīng)對(duì)象響應(yīng)客戶端請(qǐng)求。
- destroy(),在銷(xiāo)毀Servlet對(duì)象之前調(diào)用該方法,釋放資源。
- getServletConfig(),ServletConfig是容器向servlet傳遞參數(shù)的載體。
- getServletInfo(),獲取servlet相關(guān)信息。
ServletConfig接口
- String getServletName(),返回 Servlet 的名字,即 web.xml 中 元素的值。
- ServletContext getServletContext(),返回一個(gè)代表當(dāng)前 Web 應(yīng)用的 ServletContext 對(duì)象。
- String getInitParameter(String name),根據(jù)初始化參數(shù)名返回對(duì)應(yīng)的初始化參數(shù)值。
- Enumeration getInitParameterNames(),返回一個(gè) Enumeration 對(duì)象,其中包含了所有的初始化參數(shù)名。
GenericServle抽象類
GenericServlet是實(shí)現(xiàn)了Servlet接口的抽象類。在GenericServlet中進(jìn)一步的定義了Servlet接口的具體實(shí)現(xiàn),其設(shè)計(jì)的目的是為了和應(yīng)用層協(xié)議解耦,在GenericServlet中包含一個(gè)Service抽象方法。
HttpServlet類
繼承自 GenericServlet,針對(duì)于處理 HTTP 協(xié)議的請(qǐng)求所定制。在 HttpServlet的service() 方法中已經(jīng)把 ServletReuqest 和 ServletResponse 轉(zhuǎn)為 HttpServletRequest 和 HttpServletResponse。 直接使用 HttpServletRequest 和 HttpServletResponse, 不再需要強(qiáng)轉(zhuǎn)。實(shí)際開(kāi)發(fā)中, 直接繼承 HttpServlet, 并根據(jù)請(qǐng)求方式復(fù)寫(xiě) doXxx() 方法即可。
Servlet的生命周期
Servlet的生命周期是由容器管理的,分別經(jīng)歷三各階段:
init():初始化
service():服務(wù)
destroy():銷(xiāo)毀
當(dāng)客戶端瀏覽器第一次請(qǐng)求Servlet時(shí),容器會(huì)實(shí)例化這個(gè)Servlet,然后調(diào)用一次init方法,并在新的線程中執(zhí)行service方法處理請(qǐng)求。service方法執(zhí)行完畢后容器不會(huì)銷(xiāo)毀這個(gè)Servlet而是做緩存處理,當(dāng)客戶端瀏覽器再次請(qǐng)求這個(gè)Servlet時(shí),容器會(huì)從緩存中直接找到這個(gè)Servlet對(duì)象,并再一次在新的線程中執(zhí)行Service方法。當(dāng)容器在銷(xiāo)毀Servlet之前對(duì)調(diào)用一次destroy方法。
浙公網(wǎng)安備 33010602011771號(hào)