文章標題

[原文地址](http://blog.csdn.net/xtu_xiaoxin/article/details/8464808)

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方法就提供了實現以上兩個需求的機制.
      
     
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章