Sun 公司提供了一系列的接口和類用于 Servlet技術(shù)的開發(fā),其中最重要的接口是 javax.servlet.Servlet。在 Servlet 接口中定義了 5 個抽象方法,如表 1 所示。
Servlet接口的抽象方法
| 方法聲明 | 功能描述 |
|---|---|
| void init(ServletConfig config) | 容器在創(chuàng)建好 Servlet 對象后,就會調(diào)用此方法。該方法接收一個 ServletConfig 類型的參數(shù),Servlet 容器通過該參數(shù)向 Servlet 傳遞初始化配置信息 |
| ServletConfig getSendetConfig() | 用于獲取 Servlet 對象的配置信息,返回 Servlet 的 ServletConfig 對象 |
| String getServletInfo() | 返回一個字符串,其中包含關(guān)于 Servlet 的信息,如作者、版本和版權(quán)等信息 |
| voidservice (ServletRequest request,ServletResponse response) | 負(fù)責(zé)響應(yīng)用戶的請求,當(dāng)容器接收到客戶端訪問 Servlet 對象的請求時,就會調(diào)用此方法。容器會構(gòu)造一個表示客戶端請求信息的 ServletRequest 對象和一個用于響應(yīng)客戶端的 ServletResponse 對象作為參數(shù)傳遞給 service() 方法。在 service() 方法中,可以通過 ServletRequest 對象得到客戶端的相關(guān)信息和請求信息,在對請求進(jìn)行處理后,調(diào)用 ServletResponse 對象的方法設(shè)置響應(yīng)信息 |
| void destroy() | 負(fù)責(zé)釋放 Servlet 對象占用的資源。當(dāng)服務(wù)器關(guān)閉或者 Servlet 對象被移除時,Servlet 對象會被銷毀,容器會調(diào)用此方法 |
在表 1 中,列舉了 Servlet 接口中的五個方法,其中 init()、service() 和 destroy() 方法可以表現(xiàn) Servlet 的生命周期,它們會在某個特定的時刻被調(diào)用。
針對 Servlet 的接口,Sun 公司提供了兩個默認(rèn)的接口實現(xiàn)類:GenericServlet 和HttpServlet。其中,GenericServlet 是一個抽象類,該類為 Servlet 接口提供了部分實現(xiàn),它并沒有實現(xiàn) HTTP 請求處理。
HttpServlet 是 GenericServlet 的子類,它繼承了 GenericServlet 的所有方法,并且為 HTTP 請求中的 GET 和 POST 等類型提供了具體的操作方法。通常情況下,編寫的 Servlet 類都繼承自 HttpServlet,在開發(fā)中使用的也是 HttpServlet 對象。
HttpServlet 類中包含兩個常用方法,這兩個方法的說明如表 2 所示。
HttpServlet 類的常用方法
| 方法聲明 | 功能描述 |
|---|---|
| protected void doGet (HttpServletRequest req, HttpServletResponse resp) | 用于處理 GET 類型的 HTTP 請求的方法 |
| protected void doPost(HttpServletRequest req, HttpServletResponse resp) | 用于處理 POST 類型的 HTTP 請求的方法 |
HttpServlet 主要有兩大功能,具體如下。
- 根據(jù)用戶請求方式的不同,定義相應(yīng)的
doXxx()方法處理用戶請求。例如,與GET請求方式對應(yīng)的doGet()方法,與POST方式對應(yīng)的doPost()方法。 - 通過 service() 方法將 HTTP 請求和響應(yīng)分別強(qiáng)轉(zhuǎn)為
HttpServletRequest和HttpServletResponse類型的對象。
需要注意的是,由于HttpServlet類在重寫的 service()方法中,為每一種 HTTP 請求方式都定義了對應(yīng)的 doXxx()方法,因此,當(dāng)定義的類繼承 HttpServlet 后,只需要根據(jù)請求方式重寫對應(yīng)的 doXxx() 方法即可,而不需要重寫service()方法。