<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Servlet生命周期

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

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

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

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

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

    4、Servlet容器創(chuàng)建一個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)方法,生成響應數(shù)據(jù)

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

     

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

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

    在Servlet接口中定義了5個方法,

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

    1、init方法:負責初始化Servlet對象。

    2、service方法:負責響應客戶的請求。

    3、destroy方法:當Servlet對象退出生命周期時,負責釋放占用的資源。

     

    一、創(chuàng)建Servlet對象的時機

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

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

         對象的service方法。

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

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

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

    二、銷毀Servlet對象的時機

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

    Servlet對象如何配置?實際上這些信息是通過讀取web.xml配置文件來實現(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é)信息進行解析

    servlet-name:Servlet對象的名稱

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

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

    param-value:參數(shù)值

    load-on-startup:Servlet容器啟動時加載Servlet對象的順序

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

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

     

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

     

    為了驗證下,我新建了一個web app工程,新建一個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. }  

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


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


    網(wǎng)站導航:
     

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

    Copyright © 志成中國

    主站蜘蛛池模板: 亚洲欧美日韩综合久久久| 亚洲成AV人片一区二区密柚| 亚洲成年人免费网站| 丁香花免费完整高清观看| 成人午夜性A级毛片免费| 国产一级淫片a免费播放口之| 亚洲精品线路一在线观看 | 亚洲日韩一区二区一无码| 91手机看片国产永久免费| 亚洲片国产一区一级在线观看| 在线观看亚洲网站| 日本免费中文字幕| 国产在线ts人妖免费视频| 亚洲一二成人精品区| 又大又硬又爽免费视频| 亚洲精品日韩中文字幕久久久| 无遮挡呻吟娇喘视频免费播放| 一级毛片在线免费观看| 久久精品国产精品亚洲下载| 2020天堂在线亚洲精品专区| 97无码人妻福利免费公开在线视频| 成人人观看的免费毛片| 久久亚洲精品成人| 成人免费777777被爆出| 日本免费的一级v一片| 国产AV旡码专区亚洲AV苍井空| 午夜免费啪视频在线观看| 亚洲另类小说图片| 国产精品免费看久久久| 亚洲精品中文字幕无乱码麻豆| 免费无码成人AV片在线在线播放| 亚洲综合色一区二区三区小说| 色窝窝免费一区二区三区| 亚洲精品无码午夜福利中文字幕 | 亚洲国产精品成人精品小说 | 在线综合亚洲中文精品| 亚洲国产精品碰碰| 美女被爆羞羞网站免费| 国产一级理论免费版| 国内精品久久久久影院免费| 亚洲级αV无码毛片久久精品|