最近在開發(fā)一個(gè)項(xiàng)目,用到了servlet底層的原理,又重新復(fù)習(xí)下,在這里和大家共享下,希望對大家有所幫助。主要介紹了下,servlet的體系結(jié)構(gòu)、生命周期、servlet的實(shí)例,servlet請求以及servlet的銷毀。
1. servlet體系結(jié)構(gòu)
servelt我們可以理解為一個(gè)實(shí)現(xiàn)了可以接受請求并響應(yīng)請求的java類。servlet類的體系結(jié)構(gòu)如下圖![]()
GenericServlet抽象類-----實(shí)現(xiàn)了Servlet接口和ServletConfig接口和Serializable接口
HttpServlet抽象類繼-----承于GenericServlet抽象類
2.servlet生命周期
init()方法和destory()方法都只調(diào)用一次,service()方法每接受一個(gè)請求,都會調(diào)用一次service()方法。
2.1 Servlet容器實(shí)例化某個(gè)Servlet對象
在web.xml里面可以配置一個(gè)標(biāo)簽,讓某個(gè)servlet類在Servlet容器啟動的時(shí)候就創(chuàng)建這個(gè)servlet 類的一個(gè)對象。如果不配置servlet容器啟動創(chuàng)建servlet對象,則當(dāng)某個(gè)servlet接收到客戶端的請求時(shí),才創(chuàng)建這個(gè)servlet對象
2.2 某個(gè)Servlet對象初始化
Servlet實(shí)例化后,會調(diào)用servlet的init()方法,這個(gè)方法就是用來初始化的。你可以重寫這個(gè)方法,根據(jù)自己的需求去初始化這個(gè)servlet實(shí)例。
如果你在web.xml為這個(gè)Servlet實(shí)例配置了初始化參數(shù),如下
<servlet>
<servlet-name>LoginDispatcher</servlet-name>
<servlet-class>requestdispatcher.LoginDispatcher</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>
</servlet>
你可以調(diào)用ServletConfig接口的getInitParameter()方法去獲得這些初始化參數(shù)。由上面類圖我們可以知道GenericServlet抽象類實(shí)現(xiàn)了ServletConfig接口。
這里有兩個(gè)異常要介紹:
ServletException:一般用來指明某個(gè)servlet初始化失敗,例如找不到初始化參數(shù)
UnavailbleException:用于通知servlet容器該servlet實(shí)例不可用,例如當(dāng)這個(gè)servlet在初始化的時(shí)候調(diào)用數(shù)據(jù)庫連接失敗,那么這個(gè)Servlet就不可用了,于是必須通知Servlet容器,告訴它這個(gè)Servlet對象不可用
2.3 Servlet處理請求
當(dāng)客戶端發(fā)送請求給某個(gè)servlet的時(shí)候,servlet會調(diào)用該servlet的service()方法去處理請求。在處理請求期間發(fā)生錯(cuò)誤會拋出ServletException和UnavialbleException。
當(dāng)UnavialbleException標(biāo)志該servlet為永久不可用的servlet時(shí),servlet容器就會調(diào)用該servlet的destory()方法銷毀該servlet,并返回給客戶端HTTP404錯(cuò)誤(請求的資源不可用或不存在)。
當(dāng)UnavialbleException標(biāo)志該servlet為暫時(shí)不可用的servlet時(shí),servlet容器將返回給客戶端HTTP503錯(cuò)誤(服務(wù)器忙,不能處理請求)
2.4 Servlet的銷毀
當(dāng)servlet容器要銷毀某個(gè)servlet之前,servlet容器會調(diào)用該servlet的destory()方法,去釋放一些資源,例如:數(shù)據(jù)庫連接等等