學習步驟:1、理解servlet的使用步驟,從感性上去認識它。2、進一步了解它的機制。3、了解代碼層面的實現
在看Java Servlet API過程的筆記:
javax.servlet.http.HttpServlet,這個類繼承GenericServlet類,實現了java.io.Serializable的接口,它是個抽象類,給其子類創建一個Http Servlet去適應一個網站。而HttpServlet的子類必須重寫至少一個方法,其中較為經常修改的方法有:
1、如果你希望servlet支持HTTP的Get請求,重寫doGet方法
2、如果你希望servlet支持HTTP的Post請求,重寫doPost方法
3、如果你希望servlet不但可以處理數據,還可以處理文件,重寫doPut方法。Put的調用和Post相似,它允許客戶端把真正的文件存放在服務器上,而不僅僅是傳送數據
4、如果你希望servlet允許客戶端刪除服務器端的文件或者Web頁面,重寫doDelete方法,它與Put相似。
5、如果你希望控制servlet生命周期所產生的資源,可以重寫init和destroy方法
6、如果你希望servlet提供關自身的相關信息,可以調用或重寫javax.servlet.http.HttpServlet類繼承javax.servlet.GenericServlet類的getServletInfo方法。
一般情況下,我們不去重寫javax.servlet.http.HttpServlet類中的service方法。因為service是針對標准HTTP請求的處理方法,service根據每個標准HTTP請求的類型分派給其對應的處理方法(如上所述的以do開頭的方法)。同樣地,我們一般也不會去重寫doOptions和doTrace方法。下面順便說說上述的三個方法:
一、service
protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException;
public void service(ServletRequest request, ServletResponse response)throws ServletException, IOException;
這是一個Servlet的HTTP-specific方案,它分配請求到這個類的支持這個請求的其他方法。
二、doOptions
protected void doOptions(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException;
被javax.servlet.http.HttpServlet類這個類的service方法調用,用來處理一個HTTP OPTION操作。這個操作自動地決定支持哪一種HTTP方法。例如,一個Servlet寫了一個HttpServlet的子類並重寫了doGet方法,doOption會返回下面的頭:Allow: GET,HEAD,TRACE,OPTIONS
三、doTrace
protected void doTrace(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException;
被javax.servlet.http.HttpServlet這個類的service方法調用,用來處理一個HTTP TRACE操作。這個操作的默認執行結果是產生一個響應,這個響應包含一個反映trace請求中發送的所有頭域的信息。當你開發Servlet時,在多數情況下你需要重載這個方法。
許多servlet經常運行於多線程服務器,這就意味着一個servlet必須處理當前請求和謹慎同步訪問以實現資源的共享。共享的資源包括:內存中的數據(如實例、類變量等)和外部對象(如文件、數據庫連接和網絡連接等)。如果想了解更多關於在一個JAVA程序中處理多線程的信息可以去查看Java Tutorial on Multithreaded Programming。
javax.servlet.http.HttpServlet這個類只有一個構造函數就是public HttpServlet()該方法不用做任何處理,因為這個類是抽象類。
/**********************************************************************************************************************/
在深入理解javax.servlet.http.HttpServlet這個類的每個方法之前,我們先來了解一下javax.servlet.http包中的HttpServletRequest和HttpServletResponse接口。
HttpServletRequest接口繼承了ServletRequest接口。繼承ServletRequest這個接口是為了提供關於HTTP Servlet的請求信息。Servlet容器創建了一個HttpServletRequest對象,並且把這個HttpServletRequest對象當做一個參數傳遞給servlet的服務方法(如doGet,doPost等)。
HttpServletRequest接口的實現類有javax.servlet.http.HttpServletRequestWrapper這個類。而且javax.servlet.http.HttpServletRequestWrapper這個類也繼承了javax.servlet.ServletRequestWrapper這個類。當開發者希望子類能夠適配出servlet請求的時候,通過javax.servlet.http.HttpServletRequestWrapper這個類可以方便實現HttpServletRequest接口。javax.servlet.http.HttpServletRequestWrapper這個類實現了包裝模式和裝飾者模式。
javax.servlet.http.HttpServletRequestWrapper與javax.servlet.ServletRequestWrapper這兩個類很類似,它們實現的接口不同:前者實現HttpServletRequest接口,后者實現ServletRequest接口。
至於javax.servlet.http.HttpServletRequestWrapper與javax.servlet.ServletRequestWrapper這兩個類,HttpServletRequest接口與ServletRequest接口的深入研究,后期再續。
上面我初步了解了HttpServletRequest接口,接下來了解一下HttpServletResponse接口。
HttpServletResponse接口,它繼承了ServletResponse接口,在發送一個響應的過程中提供HTTP特定功能。例如它有的方法訪問HTTP Header和cookies。HttpServletResponse接口的實現類有HttpServletResponseWrapper。待續
/********************************************************************************************************************/
言歸正傳,現在馬上進一步理解javax.servlet.http.HttpServlet這個類的每個方法的細節。
1、protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,java.io.IOException
參數說明:
req,是一個HttpServletRequest對象,它包含由客戶請求組成的servlet。
resp,是一個HttpServletResponse對象,它包含servlet向客戶發送的響應。
doGet方法通過javax.servlet.http.HttpServlet這個類的service方法被服務器調用,從而允許一個servlet處理GET請求。
重寫這個方法來支持一個GET請求,也自動地支持一個HTTP HEAD請求。HEAD請求是一個GET請求的響應,它的返回值沒有body部分,只有請求的報頭域。
當重寫這個方法的時候,讀取請求數據,寫入響應報頭,獲取響應的寫入或輸出流對象,最后寫入響應數據。此時最好也包括處理ContentType和encoding。當使用一個文本輸出流打印對象來返回響應的時候,在訪問該文本輸出流打印對象的之前,先設置好ContentType的值。
在提交響應的之前,servlet容器必需寫入報頭,因為所有報頭必需在HTTP協議傳輸響應主體(body)部分之前發送。
可能的話,使用ServletResponse.setContentLength(int)方法來設置報頭的Content-Length(內容長度)的值,讓servlet容器使用一個持久連接向客戶返回它的響應,從而改善性能。如果整個響應放在響應緩沖區內容長度將自動被設置。
GET方法應該是安全的,也就是說,對被控制的用戶負責,而不產生任何副作用。例如,大部分形式的請求沒有副作用。如果一個客戶端請求的目的是改變存儲數據,請求應該使用一些其他HTTP方法。
GET方法也應該是等冪的,這意味着它可以被安全地重復。有時候使一個方法安全也使它等冪。例如,重復的查詢是既安全又冪等,但購買一個產品在線或修改數據既不安全也不冪等。
如果請求格式不正確,doGet方法會返回一個內容為“Bad Request”的HTTP消息。
