原文:http://blog.csdn.net/han_yankun2009/article/details/29370535
Servlet是在服務器上運行的小程序.而在java中應用程序多是在容器中進行生命周期的管理(這裡指Tomact容器).
首先是
之後是調用Servelt,創建Servelet實例
創建servelet實例的過程中 首先調用init方法,該方法只調用一次, 響應客戶請求階段。調用父類的service方法,在service中會根據Tomact傳遞過來的request對象分析是post還是get方法,所以servlet類必須有重寫doGet或doPost方法,並返回處理的結果。 終止階段 調用destroy()方法
tomact為何會根據url找到對應的Servlet文件呢,這還是需要我們的反射文件
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方法。
首先簡單解釋一下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?
通過調用該srevel類,發現調用的時序為
首先創造該類的構造方法,然後初始化該類,最後是根據service方法調用doget方法,調用該類只實例化一次。
通過以前的認識和現在的總結。了解到servelt對於處理業務邏輯有很大的作用,但是對於輸出處理html的樣式文件卻是一個很大的問題。servelt的生命周期的創建和以前學習aspn.net控件的創建,生命周期大相近庭,不同環節在於先調用了父類的srvcie方法。分析發現servel對多線程的處理,靠的不是自身,而是通過容器進行管理的。所以servlet對於線程的安全不是很好。