Servlet理解筆記【原創】


學習步驟: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消息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM