1. 程式人生 > >Servlet 規範筆記

Servlet 規範筆記

Servlet 規範筆記—servlet概念及結構

 Servlet, 這個詞對java程式設計師並不陌生,我想幾乎每個java程式設計師在學習J2EE知識時,首先學習的就是servlet,這是一種正確的學習方式,在我看來Servlet是J2EE的基礎,要熟練的掌握J2EE,必須深刻的瞭解Servlet的原理,因為你想想,現在只要是web相關的技術或框架,無論是開源的、非開源的,哪個和Servlet沒有關係? Spring MVC、Struts、WebWork、SiteMesh等框架都是在Servlet的基礎上搭建起來的,要想深刻的瞭解這些框架 , 熟練的運用這些框架,首先就要理解Servlet原理,明白Servlet的規範。下面一系列文章,將描述一些我對Servlet相關的瞭解. 首先,讓我們理解幾個概念?

       什麼是Servlet?

       Servlet 是一種基於java技術的web元件,是一種基於java的且與第三方平臺無關的類。通常,它可以被Web 伺服器編譯、載入和執行,最後生成動態的資源內容。

       什麼是Servlet容器?

       Servlet 容器通常是web 伺服器中的一部分,或者說是它的一個元件,Sevlet容器通常提供了一些如接收客戶端請求、給出響應等網路請求服務,通常,Servlet容器通過Servlet的生命週期來管理所有的Servlet, Tomcat就是一個典型的Servlet容器。

       為什麼要使用Servlet?

         1.  Servlet是採用java語言編寫,而由java 跨平臺性的特點可知,servlet的移植性很好,且servlet API具有完善的標準,幾乎所有的主流伺服器都支援servlet.

         2.  據說,Servlet與傳統的CGI(Common Gateway Interface)相比,功能要強大,且處理的請求採用的是執行緒,而非程序,從而節省大量的資源開銷,因此Servlet處理請求更輕量級、更高效。

       Servlet規範API 類圖

    

   

     結合上圖,我們瞭解和明白一些servlet相關的知識

     servlet響應client請求的大概步驟

     前面我們說過,servlet的作用主要是接受client請求,生成動態內容,然後返回給客戶端,那這個處理過程又由哪些步驟組成呢?

     首先,client 傳送請求到 伺服器 web server或servlet容器;

     然後,web server 接收client請求,然後根據client請求呼叫對應的servlet,動態得產生請求的資源;

     最後,web server 將資源返回client.

   

     servlet的生命週期

     通過上圖,可以清楚的知道servlet介面中主要方法有三個,分別是init、service和destroy。讓我們結合這三個方法來描述servlet的生命週期:  1, 在servlet容器或web server啟動時, 對servlet進行例項化,此時呼叫servlet的構造方法;servlet例項化後,呼叫該servlet例項的init方法,對servlet進行一些初始化處理,處理完成後,將該servlet注入到servlet容器中;

      2, 當client向web server或servlet容器請求servlet時,web server或servlet容器首先會根據請求的servlet名稱去servlet容器中找對應的servlet,如果servlet不存在該名稱對應的servlet,則向client響應請求不存在等資訊,否則進行步驟3;

     3, 如果請求的servlet存在於servlet容器,則呼叫servlet的service方法,生成動態資源,響應給client; (記住,整個過程該servlet只有一個例項,即單例);

     4, 當web server退出或servlet容器銷燬時,呼叫servlet的destroy方法,最後唯一的sevlet例項將會被GC.

 

     servlet 規範中各interface的功能職責

      Servlet: 這個就不用說了,Servlet的核心,具體Servlet中方法的處理規範可見以上描述的Servlet的生命週期

      ServletConfig:  封裝了對應的Servlet的相關配置資訊,如servlet名字,servlet的初始引數以及Servlet所在的上下文物件,即ServletContext.  ServletConfig中的屬性通常在Servlet初始化時進行初始化.

      ServletRequest:  封裝了所有來自client端的請求資訊,如請求引數、cookie、attribute、請求型別、請求方式(安全還是非安全等)等,同時ServletRequest中的還需要明確指定部分屬性,如 請求內容的編碼(可以自己設定)等.  進一步的解釋,可以參照下一章對HttpServletRequest的分析.

      ServletResponse:  封裝了server端資源到client端的所有相關資訊,如 資源傳輸的buffer資訊、響應的url地址資訊、資源的編碼資訊等.

      ServletInputStream/BufferedReader:  讀取ServletRequest所封裝的資訊的I/O介面,ServletInputStream,採用位元組流的方式讀取;BufferedReader,採用字元流的方式讀取.

      ServletOutputSteam/PrintWriter:  將資源寫入到client的I/O介面. ServletOutputSteam,採用位元組流的方式進行寫入;PrintWriter,採用字元流的方式進行寫入.

      GenericServlet:  抽象類,它定義了一個Servlet的基本實現,雖然它是Servlet的基本實現,但是它是與協議無關的(即不依賴於http協議,也不依賴於其它應用層協議).  一般,基於協議的Servlet,如httpservlet,通常會繼承該類.

      RequestDispatcher:  我們在搭建web應用的過程中,可能會有這樣的需求: 在當前servlet中處理完成後,需要導向(forwar)另外一個servlet或靜態資源(html或text等),或者 是在當前servlet的處理過程中,需要將其它的資源包含(include)到當前的servlet資源裡來。而RequestDisaptcher 介面中的forward和inluce方法就提供了實現以上兩個需求的機制. 關於RequestDispatcher的詳細描述見後面章節.

 

轉載:https://www.cnblogs.com/tian830937/p/5193213.html