2019/3/6 10:48:36
Servlet接口
Servlet接口是servlet API的(de)主要抽象。所有(yǒu)servlet或者直接實現該接口,或者更常見的(de)繼承一個(gè)實現該接口的(de)類。servlet API中有(yǒu)兩個(gè)類實現了servlet接口,爲GenericServlet和(hé)HttpServlet。大(dà)多數情況下,開(kāi)發人(rén)員将繼承HttpServlet以實現他(tā)們的(de)servlet。
2.1 請求處理(lǐ)方法
Servlet接口定義了一個(gè)service方法來處理(lǐ)客戶端請求。當servlet容器(qì)将每個(gè)請求傳遞給servlet實例時都(dōu)會(huì)調用(yòng)該方法。
Web應用(yòng)處理(lǐ)并發請求通常要求web開(kāi)發人(rén)員設計(jì)servlet的(de)service方法可(kě)以多線程執行(xíng)。
通常web容器(qì)通過不同線程并發執行(xíng)service方法,處理(lǐ)對于同一個(gè)servlet的(de)并發請求。
2.1.1 HTTP專有(yǒu)請求處理(lǐ)方法
HttpServlet抽象子類在Servlet接口基礎上(shàng)還添加了一些附加方法,由HttpServlet類的(de)service方法自動調用(yòng),以處理(lǐ)基于HTTP的(de)請求。這些方法是:
• doGet處理(lǐ)HTTP GET請求
• doPost處理(lǐ)HTTP POST請求
• doPut處理(lǐ)HTTP PUT請求
• doDelete處理(lǐ)HTTP DELETE請求
• doHead處理(lǐ)HTTP HEAD請求
• doOptions處理(lǐ)HTTP OPTIONS請求
• doTrace處理(lǐ)HTTP TRACE請求
通常在開(kāi)發基于HTTP的(de)servlet時,servlet開(kāi)發人(rén)員自身隻需要關心doGet和(hé)doPost方法。其他(tā)方法隻爲非常熟悉HTTP編程的(de)程序員們使用(yòng)。
2.1.2 附加方法
doPut和(hé)doDelete方法允許Servlet開(kāi)發人(rén)員支持采用(yòng)這些特性的(de)HTTP/1.1客戶端。HttpServlet 的(de)doHead方法是一種特殊的(de)doGet方法,隻返回doGet方法生成的(de)header。doOptions方法返回servlet支持的(de)所有(yǒu)HTTP方法。doTrace方法生成的(de)響應,包含TRACE請求中發送的(de)所有(yǒu)header實例。
對于隻支持HTTP/1.0的(de)容器(qì),隻支持doGet,doHead和(hé)doPost方法,因爲HTTP/1.0沒有(yǒu)定義PUT,DELETE,OPTIONS和(hé)TRACE方法。
2.1.3 有(yǒu)條件(jiàn)的(de)GET支持
HttpServlet接口定義了getLastModified方法以支持有(yǒu)條件(jiàn)的(de)GET操作。一個(gè)有(yǒu)條件(jiàn)的(de)GET操作所請求的(de)資源,隻有(yǒu)在指定時間内被修改才被發送。在适當的(de)情況下,該方法的(de)實現可(kě)能(néng)會(huì)有(yǒu)效地(dì)利用(yòng)網絡資源。
2.2 實例數
正如(rú)第13章(zhāng)“部署描述符”所述,作爲含servlet的(de)web應用(yòng)部署描述符一部分(fēn)的(de)Servlet聲明(míng),控制(zhì)著(zhe)servlet容器(qì)如(rú)何提供servlet實例。
對于一個(gè)不駐留于分(fēn)布式環境(默認)的(de)servlet而言,servlet容器(qì)必須保證每個(gè)servlet聲明(míng)隻使用(yòng)一個(gè)實例。不過,對于實現SingleThreadModel接口的(de)servlet而言,servlet容器(qì)可(kě)以實例化多個(gè)實例以處理(lǐ)繁重的(de)請求加載,但(dàn)是一個(gè)特定實例隻能(néng)一次處理(lǐ)請求。
如(rú)果作爲應用(yòng)一部分(fēn)的(de)servlet被部署爲分(fēn)布式,部署描述符中标明(míng),那麽容器(qì)隻能(néng)讓每個(gè)虛拟機(VM)每個(gè)servlet聲明(míng)持有(yǒu)一個(gè)實例。不過,如(rú)果分(fēn)布式應用(yòng)中的(de)servlet實現了SingleThreadModel接口,那麽容器(qì)可(kě)以讓容器(qì)中每個(gè)VM實例化多個(gè)servlet實例。
2.2.1 單線程模型注意點
使用(yòng)SingleThreadModel接口保證一次隻能(néng)有(yǒu)一個(gè)線程執行(xíng)指定的(de)servlet實例的(de)service方法。要注意這項保證隻适用(yòng)于每個(gè)servlet實例,因爲容器(qì)可(kě)以選擇池化這些對象。這些對象一次可(kě)以被多個(gè)servlet實例訪問,比如(rú)HttpSession實例,在任意時刻對于多個(gè)servlet都(dōu)是可(kě)用(yòng)的(de),即使它實現了SingleThreadModel。
2.3 servlet生命周期
servlet通過定義生命周期來進行(xíng)管理(lǐ),包括如(rú)何加載,實例化與初始化,處理(lǐ)客戶端的(de)請求,以及如(rú)何撤銷服務。生命周期在API中表示爲javax.servlet.Servlet接口的(de)init,service和(hé)destroy方法,所有(yǒu)servlet必須直接實現或者通過GenericServlet或HttpServlet抽象類間接實現。
2.3.1 加載和(hé)實例化
servlet容器(qì)負責加載和(hé)實例化servlet。加載和(hé)實例化可(kě)以在容器(qì)啓動時進行(xíng),也(yě)可(kě)以延遲到(dào)容器(qì)認爲需要servlet來處理(lǐ)請求時。
當容器(qì)引擎啓動時,servlet容器(qì)必須能(néng)定位所需要的(de)servlet類。Servlet容器(qì)使用(yòng)通常的(de)Java類加載工(gōng)具加載servlet類。可(kě)以從本地(dì)文(wén)件(jiàn)系統,遠程文(wén)件(jiàn)系統或者其他(tā)網絡服務中加載。
加載Servlet類後,容器(qì)将它實例化。
2.3.2 初始化
在servlet對象實例化之後,容器(qì)必須在它能(néng)處理(lǐ)客戶端請求之前将其初始化。初始化是爲了servlet能(néng)夠讀(dú)取持久性的(de)配置數據,初始化代價高(gāo)的(de)資源(比如(rú)基于JDBC連接),以及執行(xíng)其他(tā)一次動作。容器(qì)通過調用(yòng)Servlet接口的(de)init方法,并使用(yòng)實現ServletConfig接口的(de)單個(gè)(每個(gè)servlet聲明(míng))對象來初始化servlet實例。配置對象允許servlet訪問來自web應用(yòng)配置信息的(de)名-值初始化參數,還允許servlet訪問一個(gè)實現ServletContext接口的(de)對象,它描述servlet運行(xíng)時環境。關于ServletContext接口的(de)更多信息參見第3章(zhāng)“Servlet上(shàng)下文(wén)”。
2.3.2.1 初始化的(de)錯誤情形
在初始化過程中,se
深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04
咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967