Servlet的面试题
** 什么是Servlet**
Servlet是sun公司提供的一門用于開發(fā)動(dòng)態(tài)web資源的技術(shù)。Servlet接口實(shí)現(xiàn)類
Servlet接口SUN公司定義了兩個(gè)默認(rèn)實(shí)現(xiàn)類,分別為:GenericServlet、HttpServlet。
HttpServlet指能夠處理HTTP請(qǐng)求的servlet,它在原有Servlet接口上添加了一些與HTTP協(xié)議處理方法,
它比Servlet接口的功能更為強(qiáng)大。因此開發(fā)人員在編寫Servlet時(shí),通常應(yīng)繼承這個(gè)類,而避免直接去實(shí)現(xiàn)Servlet接口。
HttpServlet在實(shí)現(xiàn)Servlet接口時(shí),覆寫了service方法,該方法體內(nèi)的代碼會(huì)自動(dòng)判斷用戶的請(qǐng)求方式,如為GET請(qǐng)求,則
調(diào)用HttpServlet的doGet方法,如為Post請(qǐng)求,則調(diào)用doPost方法。因此,開發(fā)人員在編寫Servlet時(shí),通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法。
Servlet是如何被實(shí)現(xiàn)的
Sun公司在其API中提供了一個(gè)servlet接口,用戶若想用發(fā)一個(gè)動(dòng)態(tài)web資源(即開發(fā)一個(gè)Java程序向?yàn)g覽器輸出數(shù)據(jù)),需要完成以下2個(gè)步驟:1、編寫一個(gè)Java類,實(shí)現(xiàn)servlet接口。
2、把開發(fā)好的Java類部署到web服務(wù)器中。
按照一種約定俗成的稱呼習(xí)慣,通常我們也把實(shí)現(xiàn)了servlet接口的java程序,稱之為Servle
** Servlet的執(zhí)行原理**
Servlet程序是由WEB服務(wù)器調(diào)用,web服務(wù)器收到客戶端的Servlet訪問請(qǐng)求后:
①Web服務(wù)器首先檢查是否已經(jīng)裝載并創(chuàng)建了該Servlet的實(shí)例對(duì)象。如果是,則直接執(zhí)行第④步,否則,執(zhí)行第②步。
②裝載并創(chuàng)建該Servlet的一個(gè)實(shí)例對(duì)象。
③調(diào)用Servlet實(shí)例對(duì)象的init()方法。
④創(chuàng)建一個(gè)用于封裝HTTP請(qǐng)求消息的HttpServletRequest對(duì)象和一個(gè)代表HTTP響應(yīng)消息的HttpServletResponse對(duì)象,然后調(diào)用Servlet的service()方法并將請(qǐng)求和響應(yīng)對(duì)象作為參數(shù)傳遞進(jìn)去。
⑤WEB應(yīng)用程序被停止或重新啟動(dòng)之前,Servlet引擎將卸載Servlet,并在卸載之前調(diào)用Servlet的destroy()方法。
Servlet訪問URL映射配置
由于客戶端是通過URL地址訪問web服務(wù)器中的資源,所以Servlet程序若想被外界訪問,必須把servlet程序映射到一個(gè)URL地址上,這個(gè)工作在web.xml文件中使用元素和元素完成。
元素用于注冊(cè)Servlet,它包含有兩個(gè)主要的子元素:和,分別用于設(shè)置Servlet的注冊(cè)名稱和Servlet的完整類名。
Servlet與普通Java類的區(qū)別
Servlet是一個(gè)供其他Java程序(Servlet引擎)調(diào)用的Java類,它不能獨(dú)立運(yùn)行,它的運(yùn)行完全由Servlet引擎來控制和調(diào)度。
針對(duì)客戶端的多次Servlet請(qǐng)求,通常情況下,服務(wù)器只會(huì)創(chuàng)建一個(gè)Servlet實(shí)例對(duì)象,也就是說Servlet實(shí)例對(duì)象一旦創(chuàng)建,它就會(huì)駐留在內(nèi)存中,為后續(xù)的其它請(qǐng)求服務(wù),直至web容器退出,servlet實(shí)例對(duì)象才會(huì)銷毀。
(注)
在Servlet的整個(gè)生命周期內(nèi),Servlet的init方法只被調(diào)用一次。而對(duì)一個(gè)Servlet的每次訪問請(qǐng)求都導(dǎo)致Servlet引擎調(diào)用一次servlet的service方法。
對(duì)于每次訪問請(qǐng)求,Servlet引擎都會(huì)創(chuàng)建一個(gè)新的HttpServletRequest請(qǐng)求對(duì)象和一個(gè)新的HttpServletResponse響應(yīng)對(duì)象,然后將這兩個(gè)對(duì)象作為參數(shù)傳遞給它調(diào)用的Servlet的service()方法,service方法再根據(jù)請(qǐng)求方式分別調(diào)用doXXX方法。
Servlet的生命周期
1.創(chuàng)建Servlet實(shí)例.
Servlet引擎裝入JAVA類,在Servlet引擎啟動(dòng)時(shí)或首次請(qǐng)求特定Servlet時(shí)創(chuàng)建Servlet實(shí)例.發(fā)生時(shí)間取決于特定Servlet的設(shè)置.通常Servlet引擎只生成Servlet對(duì)象的一個(gè)備份,每次請(qǐng)求時(shí)復(fù)用這個(gè)對(duì)象,即使同時(shí)處理多個(gè)請(qǐng)求.這種方法可以節(jié)省對(duì)每個(gè)請(qǐng)求生成新的對(duì)象的時(shí)間,但需要在編程時(shí)認(rèn)真計(jì)劃.替換方法見"單線程模型".
2.實(shí)例初始化.
Servlet引擎調(diào)用Servlet的init()方法.利用此方法,通常要設(shè)置Servlet周期中的常量參數(shù),如文件路徑和數(shù)據(jù)庫連接池.實(shí)例初始化之后,放在內(nèi)存中,直到收到請(qǐng)求.
3.請(qǐng)求處理.
Servlet引擎收到的每個(gè)請(qǐng)求由單獨(dú)的Java線程處理.Servlet引擎可能創(chuàng)建新線程,也可能從池中分配一個(gè)線程.線程創(chuàng)建請(qǐng)求并響應(yīng)對(duì)象,然后調(diào)用Servlet的service()方法.service()方法確定如何處理請(qǐng)求.
4.線程管理.
多個(gè)線程可以同時(shí)執(zhí)行一個(gè)對(duì)象的方法,各有自己的請(qǐng)求與響應(yīng)對(duì)象.將代碼設(shè)計(jì)成線程安全是Servlet編程的主要部分.
5.其它服務(wù)
Servlet引擎提供的典型服務(wù)是對(duì)話跟蹤,使程序可以跟蹤屬于特定用戶的數(shù)據(jù).
6.實(shí)例刪除
Servlet引擎需要安全關(guān)閉時(shí),或需要恢復(fù)內(nèi)存時(shí),調(diào)用Servlet的destroy()方法.這時(shí)Servlet可以關(guān)閉文件并優(yōu)雅地關(guān)閉.
總結(jié)
以上是生活随笔為你收集整理的Servlet的面试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1万字30张图说清TCP协议
- 下一篇: Windows下搭建ESP-IDF开发环