Servlet生命周期

          Posted on 2012-10-20 13:01 志成中國 閱讀(260) 評論(0)  編輯  收藏

           大多數(shù)程序員都知道Servlet的生命周期,簡單的概括這就分為四步:servlet類加載--->實(shí)例化--->服務(wù)--->銷 毀。對這個(gè)過程只是膚淺了解下,對于servlet何時(shí)被銷毀,還是不太情楚。下面我們描述一下Tomcat與Servlet是如何工作的,首先看下面的 時(shí)序圖.

          1、Web Client 向Servlet容器(Tomcat)發(fā)出Http請求

          2、Servlet容器接收Web Client的請求

          3、Servlet容器創(chuàng)建一個(gè)HttpRequest對象,將Web Client請求的信息封裝到這個(gè)對象中

          4、Servlet容器創(chuàng)建一個(gè)HttpResponse對象

          5、Servlet容器調(diào)用HttpServlet對象的service方法,把HttpRequest對象與HttpResponse對象作為參數(shù)

               傳給 HttpServlet對象

          6、HttpServlet調(diào)用HttpRequest對象的有關(guān)方法,獲取Http請求信息

          7、HttpServlet調(diào)用HttpResponse對象的有關(guān)方法,生成響應(yīng)數(shù)據(jù)

          8、Servlet容器把HttpServlet的響應(yīng)結(jié)果傳給Web Client

           

          對于Servlet容器(Tomcat)與HttpServlet是怎樣進(jìn)行交互的呢,看下類圖

          Servlet的框架是由兩個(gè)Java包組成的:javax.servlet與javax.servlet.http。在javax.servlet包中 定義了所有的Servlet類都必須實(shí)現(xiàn)或者擴(kuò)展的通用接口和類。在javax.servlet.http包中定義了采用Http協(xié)議通信的 HttpServlet類。Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必須實(shí)現(xiàn)這個(gè)接口。

          在Servlet接口中定義了5個(gè)方法,

          其中3個(gè)方法代表了Servlet的生命周期:

          1、init方法:負(fù)責(zé)初始化Servlet對象。

          2、service方法:負(fù)責(zé)響應(yīng)客戶的請求。

          3、destroy方法:當(dāng)Servlet對象退出生命周期時(shí),負(fù)責(zé)釋放占用的資源。

           

          一、創(chuàng)建Servlet對象的時(shí)機(jī)

          1、Servlet容器啟動(dòng)時(shí):讀取web.xml配置文件中的信息,構(gòu)造指定的Servlet對象,創(chuàng)建ServletConfig對象,同時(shí)將ServletConfig對象作為參數(shù)來調(diào)用Servlet對象的init方法。

          2、在Servlet容器啟動(dòng)后:客戶首次向Servlet發(fā)出請求,Servlet容器會(huì)判斷內(nèi)存中是否存在指定的Servlet對象,如果沒有則創(chuàng)建 它,然后根據(jù)客戶的請求創(chuàng)建HttpRequest、       HttpResponse對象,從而調(diào)用Servlet

               對象的service方法。

          3、Servlet的類文件被更新后,重新創(chuàng)建Servlet

                Servlet容器在啟動(dòng)時(shí)自動(dòng)創(chuàng)建Servlet,這是由在web.xml文件中為Servlet設(shè)置的<load-on-startup>屬性決定

                的。從中我們也能看到同一個(gè)類型的Servlet對象在Servlet容器中以單例的形式存在。

          二、銷毀Servlet對象的時(shí)機(jī)

          1、Servlet容器停止或者重新啟動(dòng):Servlet容器調(diào)用Servlet對象的destroy方法來釋放資源。以上所講的就是Servlet對象的生命周期。那么Servlet容器如何知道創(chuàng)建哪一個(gè)Servlet對象?

          Servlet對象如何配置?實(shí)際上這些信息是通過讀取web.xml配置文件來實(shí)現(xiàn)的。

          我們來看一下web.xml文件中的Servlet對象的配置節(jié)信息

          -------------------------------------------

          <servlet>

              <servlet-name>action<servlet-name>

              <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

              <init-param>

                  <param-name>config</param-name>

                  <param-value>/WEB-INF/struts-config.xml</param-value>

              </init-param>

              <init-param>

                  <param-name>detail</param-name>

                  <param-value>2</param-value>

              </init-param>

              <init-param>

                  <param-name>debug</param-name>

                  <param-value>2</param-value>

              </init-param>

              <load-on-startup>2</load-on-startup>

          </servlet>

          <servlet-mapping>

              <servlet-name>action</servlet-name>

              <url-pattern>*.do</url-pattern>

          </servlet-mapping>

          --------------------------------------------

          下面對上面的配置節(jié)信息進(jìn)行解析

          servlet-name:Servlet對象的名稱

          servlet-class:創(chuàng)建Servlet對象所要調(diào)用的類

          param-name:參數(shù)名稱

          param-value:參數(shù)值

          load-on-startup:Servlet容器啟動(dòng)時(shí)加載Servlet對象的順序

          servlet-mapping/servlet-name:要與servlet中的servlet-name配置節(jié)內(nèi)容對應(yīng)

          url-pattern:客戶訪問的Servlet的相對URL路徑

           

                 當(dāng)Servlet容器啟動(dòng)的時(shí)候讀取<servlet>配置節(jié)信息,根據(jù)<servlet-class>配置節(jié)信息創(chuàng)建 Servlet對象,同時(shí)根據(jù)<init-param>配置節(jié)信息創(chuàng)建HttpServletConfig對象,然后執(zhí)行Servlet對象 的init方法,并且根據(jù)<load-on-startup>配置節(jié)信息來決定創(chuàng)建Servlet對象的順序,如果此配置節(jié)信息為負(fù)數(shù)或者沒 有配置,那么在Servlet容器啟動(dòng)時(shí),將不加載此Servlet對象。當(dāng)客戶訪問Servlet容器時(shí),Servlet容器根據(jù)客戶訪問的URL地 址,通過<servlet-mapping>配置節(jié)中的<url-pattern>配置節(jié)信息找到指定的Servlet對象,并 調(diào)用此Servlet對象的service方法。

           

          為了驗(yàn)證下,我新建了一個(gè)web app工程,新建一個(gè)Servlet,如下:

          Java代碼  收藏代碼
          1. package com.tdt.servlet;  
          2.   
          3. import java.io.IOException;  
          4. import java.io.PrintWriter;  
          5. import javax.servlet.ServletException;  
          6. import javax.servlet.http.HttpServlet;  
          7. import javax.servlet.http.HttpServletRequest;  
          8. import javax.servlet.http.HttpServletResponse;  
          9.   
          10. public class TestServlet extends HttpServlet {  
          11.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
          12.             throws ServletException, IOException {  
          13.         this.doPost(request, response);  
          14.     }  
          15.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
          16.             throws ServletException, IOException {  
          17.   
          18.         response.setContentType("text/html");  
          19.         PrintWriter out = response.getWriter();  
          20.         out.println("Hello,this is a test");  
          21.       
          22.         out.flush();  
          23.         out.close();  
          24.     }  
          25.   
          26.     public void destroy() {  
          27.         System.err.println(getServletName()+"生命周期結(jié)束");;  
          28.     }  
          29.       
          30.     public void init() throws ServletException {  
          31.         System.out.println(getServletName()+"執(zhí)行初始化");  
          32.     }  
          33. }  

           當(dāng)servlet被銷毀時(shí)會(huì)在控制臺(tái)上打印提示語句,不過我發(fā)現(xiàn)在tomcat中,只要不停止web容器,servlet是不會(huì)被銷毀的。有沒有什么方 法,當(dāng)service方法執(zhí)行完畢就銷毀這個(gè)servlet呢,我問了下老師,他說寫一個(gè)監(jiān)聽器,不過我不知道怎么去實(shí)現(xiàn)它,如果有朋友知道實(shí)現(xiàn)的過程, 還請賜教。


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          posts - 9, comments - 5, trackbacks - 0, articles - 0

          Copyright © 志成中國

          主站蜘蛛池模板: 苗栗市| 涿州市| 延寿县| 平乡县| 兰溪市| 鸡西市| 定远县| 西乌珠穆沁旗| 合山市| 龙岩市| 枝江市| 呼伦贝尔市| 延川县| 九台市| 陕西省| 英超| 临安市| 绥芬河市| 开江县| 武隆县| 阿勒泰市| 嘉峪关市| 福海县| 自贡市| 大冶市| 富裕县| 浮山县| 会同县| 茌平县| 多伦县| 桑日县| 灵璧县| 宜宾县| 司法| 湘潭县| 苍溪县| 奈曼旗| 滦平县| 民权县| 常德市| 清涧县|