1. 程式人生 > >J2EE--Servlet生命周期與原理

J2EE--Servlet生命周期與原理

eric erl rect 不同 必須 小程序 表單 exce strong

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


Servlet主要的架構圖


技術分享

首先是

  • web頁面通過提交表單
  • tomact獲取傳遞過來的數據,進行解析
  • 創建HttpSaervletRequest,該對象包括了client信息,如表單數據,client的主機名稱和ip地址.
  • 創建HttpServletResponse對象,能夠向瀏覽器寫入數據.

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

創建servelet實例的過程中 首先調用init方法,該方法僅僅調用一次。

響應客戶請求階段。

調用父類的service方法。在service中會依據Tomact傳遞過來的request對象分析是post還是get方法,所以servlet類必須有重寫doGetdoPost方法,並返回處理的結果。

終止階段 調用destroy()方法


技術分享

生命周期時序圖

技術分享

tomact為何會依據url找到相應的Servel文件呢。這還是須要我們的反射文件


web.XML文件的反射作用

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

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

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

4依據servel

-name名稱就找到相應的class文件


技術分享

註意: tomact在創建serverl之前。已經將client傳遞的信息進行了解析,並創建了HttpServeltRequestHttpServletResponse對象。並將太對象傳遞給了servlet

servelt的實例化過程了

依據web.xml文件裝載servelt類文件。並創建servelt實例

1調用sreveltinit()方法。

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

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

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所占用的資源。


測試的樣例.測試時序圖

importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
 
 
public class testextends HttpServlet {
//默認構造
publictest(){
System.out.println("---構造函數-------"+"\n");
 
}
 
publicvoid doGet(HttpServletRequest request,HttpServletResponse response)
throwsServletException,IOException
{
 
System.out.print("----doget------"+"\n");
}
 
 public void init() throws ServletException{
 System.out.print("----Init------"+"\n");
 }
 
}
 

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

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

技術分享



總結:


通過曾經的認識和如今的總結。

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

J2EE--Servlet生命周期與原理