程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> J2EE--Servlet生命周期與原理

J2EE--Servlet生命周期與原理

編輯:C++入門知識

原文:http://blog.csdn.net/han_yankun2009/article/details/29370535

Servlet是在服務器上運行的小程序.而在java中應用程序多是在容器中進行生命周期的管理(這裡指Tomact容器).


Servlet基本的架構圖


\

首先是

    web頁面通過提交表單tomact獲取傳遞過來的數據,進行解析創建HttpSaervletRequest,該對象包含了客戶端信息,如表單數據,客戶端的主機名稱和ip地址. 創建HttpServletResponse對象,可以向浏覽器寫入數據.

    之後是調用Servelt,創建Servelet實例

    創建servelet實例的過程中 首先調用init方法,該方法只調用一次, 響應客戶請求階段。調用父類的service方法,在service中會根據Tomact傳遞過來的request對象分析是post還是get方法,所以servlet類必須有重寫doGet或doPost方法,並返回處理的結果。 終止階段 調用destroy()方法


    \

    生命周期時序圖

    \

    tomact為何會根據url找到對應的Servlet文件呢,這還是需要我們的反射文件


    web.XML文件的反射作用

    1 tomact會根據url截取項目名稱

    2根據url截取servlet的訪問名稱

    3根據訪問名稱找到 servlet-name

    4根據servel-name名稱就找到對應的class文件


    \

    注意: tomact在創建serverl之前,已經將客戶端傳遞的信息進行了解析,並創建了HttpServeltRequest和HttpServletResponse對象,並將對象傳遞給了servlet。

    servlet的實例化過程了

    根據web.xml文件裝載servlet類文件。並創建servlet實例

    1調用srevlet的init()方法。

    在Servlet的整個生命周期內,init()方法只被調用一次。

    2調用service方法,匹配請求的方式,選擇呢調用doGet,doPost方法。

    Servelt工作原理:

    首先簡單解釋一下Servlet接收和響應客戶請求的過程,首先客戶發送一個請求,Servlet是調用service()方法對請求進行響應的,通過源代碼可見,service()方法中對請求的方式進行了匹配,選擇調用doGet,doPost等這些方法,然後再進入對應的方法中調用邏輯層的方法,實現對客戶的響應。在Servlet接口和GenericServlet中是沒有doGet,doPost等等這些方法的,HttpServlet中定義了這些方法,但是都是返回error信息,所以,我們每次定義一個Servlet的時候,都必須實現doGet或doPost等這些方法。

      每一個自定義的Servlet都必須實現Servlet的接口,Servlet接口中定義了五個方法,其中比較重要的三個方法涉及到Servlet的生命周期,分別是上文提到的init(),service(),destroy()方法。GenericServlet是一個通用的,不特定於任何協議的Servlet,它實現了Servlet接口。而HttpServlet繼承於GenericServlet,因此HttpServlet也實現了Servlet接口。所以我們定義Servlet的時候只需要繼承HttpServlet即可。

      Servlet接口和GenericServlet是不特定於任何協議的,而HttpServlet是特定於HTTP協議的類,所以HttpServlet中實現了service()方法,並將請求ServletRequest,ServletResponse強轉為HttpRequest和HttpResponse。


    Servlet終止階段:

      當WEB應用被終止,或Servlet容器終止運行,或Servlet容器重新裝載Servlet新實例時,Servlet容器會先調用Servlet的destroy()方法,在destroy()方法中可以釋放掉Servlet所占用的資源。


    測試的例子.測試時序圖

    [java] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
    1. importjava.io.IOException;
    2. importjavax.servlet.ServletException;
    3. importjavax.servlet.http.HttpServlet;
    4. importjavax.servlet.http.HttpServletRequest;
    5. importjavax.servlet.http.HttpServletResponse;
    6. public class test extends HttpServlet {
    7. //默認構造
    8. public test(){
    9. System.out.println("---構造函數-------"+"\n");
    10. }
    11. publicvoid doGet(HttpServletRequest request,HttpServletResponse response)
    12. throwsServletException,IOException
    13. {
    14. System.out.print("----doget------"+"\n");
    15. }
    16. public void init() throws ServletException{
    17. System.out.print("----Init------"+"\n");
    18. }
    19. }

    20. 通過調用該srevel類,發現調用的時序為

      首先創造該類的構造方法,然後初始化該類,最後是根據service方法調用doget方法,調用該類只實例化一次。

      \



      總結:


      通過以前的認識和現在的總結。了解到servelt對於處理業務邏輯有很大的作用,但是對於輸出處理html的樣式文件卻是一個很大的問題。servelt的生命周期的創建和以前學習aspn.net控件的創建,生命周期大相近庭,不同環節在於先調用了父類的srvcie方法。分析發現servel對多線程的處理,靠的不是自身,而是通過容器進行管理的。所以servlet對於線程的安全不是很好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved