Servlet的理解和認識

對Servlet的理解和認識

首先什麼是Servlet:html

      Servlet本質就是一個繼承了HttpServlet的一個類文件,功能是在容器(服務器)根據客戶端不一樣請求給予相應的響應服務.java

      Servlet的運行環境是Tomcatweb

Servlet提供服務的過程原理(Servlet生命週期):數據庫

      生命全過程: 觸發: URL請求觸發編程

                       加載: ClassLoader 加載相關須要用到的類 tomcat

                       實例化: init()傳遞配置參數,爲服務作準備安全

                       初始化: 調用構造方法,建立servlet類的對象 服務器

                       服務: doGet()  doPost() servlet()方法,提供服務多線程

                       退出服務: destroy()死亡/銷燬消除內存中的無用數據app

            從服務器開機開始,若是沒有請求觸發的話,就不會有相應的servlet對象

            建立之後到結束,一直都只有一個servlet對象,而後以多線程的形式執行,多個請求到同一個servlet類

         
      API中的過程: init()//只執行一次, 第一次初始化的時候 public void init(ServletConfig config) throws ServletException

                         service() public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException

                         destroy()//webapp 退出的時候 public void destroy()

    如下爲Servlet生命週期圖:

   

  Servlet 編程接口 :

           GenericServlet是全部Servlet的鼻祖

           用於HTTP的Servlet編程都經過繼承 javax.servlet.http.HttpServlet 實現

           請求處理方法(應對Http協議請求):一、doGet        響應Get請求,經常使用

                                                      二、doPost        響應Post請求,經常使用

           實例的個數: 在非分佈的狀況下,一般一個Servlet在服務器中有一個實例

 Servlet的多線程機制 :

           Servlet體系結構是創建在Java多線程機制之上的,它的生命週期是由Web容器負責的。
           當客戶端第一次請求某個Servlet時,Servlet 容器將會根據web.xml配置文件實例化這個Servlet類。當有新的客戶端請求該Servlet時,通常不會再實例化該Servlet類,也就是有 多個線程在使用這個實例。
           Servlet容器會自動使用線程池等技術來支持系統的運行
           

 轉自:https://www.cnblogs.com/lwxalxy/p/4674951.html

1.servlet的工做過程以及容器的做用

Servlet沒有main()方法,他們受控與另一個java應用,這個java應用稱爲容器(Container)。Tomcat就是這麼一個容器,web服務器應用(如Apache)獲得一個指向Servlet的請求時,服務器不是把這個請求交給Servlet自己,而是交給部署該servlet的容器。要由容器向servlet提供HTTP請求和響應,並且是由容器調用servlet的方法(doGet()和doPost())。容器運行多個servlet線程來處理對同一servlet的多個請求。(對每一個請求分配一個線程,而不是每一個客戶)

容器的做用:
1)通訊支持。利用容器提供的方法,web服務器能輕鬆的與servlet進行通訊。
2)生命週期管理。容器控制着servlet的生與死。它會負責加載類,實例化,初始化,調用servlet的方法以及使servlet可以被垃圾回收。
3)多線程支持。容器會自動的接受每一個servlet請求,建立一個新的java線程。針對每一個請求,若是servlet已經運行完相應的HTTP方法,線程就會結束。可是咱們同時也得考慮線程的安全性。
4)JSP支持。負責將JSP翻譯成真正的java。

容器是如何處理用戶請求的了?
1)用戶點擊一個連接,指向一個servlet而不是一個靜態頁面。
2)web服務器接到這個請求後轉發給容器。容器接着建立兩個對象:HttpServletRequest和HttpServletResponse。
3)容器根據請求中的URL找到相應的servlet,爲這個請求建立一個線程,並把請求對象HtttpServletRequest和響應對象HttpServletResponse傳遞給這個servlet線程。
4)線程接下來調用service()方法,根據請求的不一樣,service()方法調用doGet()和doPost()方法。
5)doGet()方法生成動態頁面,並把這個頁面塞到響應對象裏。
6)service()方法結束,隨之線程結束,容器把響應對象裝換爲一個HTTP相應,發送給客戶,而後刪除請求和響應對象。
2.Servlet的生命週期
注意他的一輩子都是由容器控制的。servlet一輩子中只有一個實例出現,可是有多個線程出現。
加載類 Servlet .class文件
實例化 構造函數運行
初始化 容器調用 init() 方法(一輩子只調一次)
service方法? servlet一輩子主要在這裏度過
銷 毀? 銷燬實例以前調用 destroy() 方法
可回收? 等待垃圾回收等待垃圾回收
3.Servlet一輩子中的三大重要時刻
1)init()方法:在servlet實例被建立後調用,能夠覆蓋此方法作一些初始化的工做,比方說獲得一個數據庫鏈接。
2)service()方法:當客戶請求到來時,容器會建立一個新的線程,調用servlet的service()方法。servlet的一輩子基本都在這裏度過。咱們通常不要覆蓋此方法。
3)doGet或者doPost()方法:service方法根據請求的HTTP方法,來調用doGet()或者doPost()方法。咱們在開發servlet時確定要覆蓋此方法。每次運行doGet()或者doPost()方法,它都在一個單獨的線程
中。
4.容器(tomcat)在啓動時會作什麼?容器在啓動時,會根據相應的部署文件去尋找servlet文件。5.爲何要有init方法了?難道不能將init代碼放在構造函數中麼?由於讓一個普通的java類成爲servlet文件時容器付出的代價也挺大,好比說內存分配。在沒有調用init方法時他仍是一個普普統統的java對象,只有在用戶使用時纔再讓他稱爲servlet這樣對資源的利用比較合理,注意:init方法是在第一個用戶調用此servlet時被觸發。 

相關文章
相關標籤/搜索