J2EE--Servlet生命周期與原理
Servlet是在server上執行的小程序.而在java中應用程序多是在容器中進行生命周期的管理(這裏指Tomact容器).
Servlet主要的架構圖
首先是
- web頁面通過提交表單
- tomact獲取傳遞過來的數據,進行解析
- 創建HttpSaervletRequest,該對象包括了client信息,如表單數據,client的主機名稱和ip地址.
- 創建HttpServletResponse對象,能夠向瀏覽器寫入數據.
之後是調用Servelt,創建Servelet實例
創建servelet實例的過程中 首先調用init方法,該方法僅僅調用一次。
調用父類的
service方法。在service中會依據Tomact傳遞過來的request對象分析是post還是get方法,所以servlet類必須有重寫doGet或doPost方法,並返回處理的結果。 終止階段 調用destroy()方法
生命周期時序圖
tomact為何會依據url找到相應的Servel文件呢。這還是須要我們的反射文件
web.XML文件的反射作用
1 tomact會依據url截取項目名稱
2依據url截取servlet的訪問名稱
3依據訪問名稱找到 servlet-name
4依據servel
註意: tomact在創建serverl之前。已經將client傳遞的信息進行了解析,並創建了HttpServeltRequest和HttpServletResponse對象。並將太對象傳遞給了servlet。
servelt的實例化過程了
依據web.xml文件裝載servelt類文件。並創建servelt實例
1調用srevelt的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所占用的資源。
測試的樣例.測試時序圖
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生命周期與原理