以下內(nèi)容摘自<<精通 servlet>>Servlet基礎(chǔ)Servlet容器(以前稱Servelt引擎)實(shí)際上是執(zhí)行servlet的軟件。所有支持servlet的服務(wù)器包括一個(gè)servelt容器(集成的或通過插件。)術(shù)語支持java的服務(wù)器常指一個(gè)增強(qiáng)的servletHTTP服務(wù)器(即它包括一個(gè)用于運(yùn)行servlet的 servlet容器) Servlet生命周期:以下是一個(gè)服務(wù)器調(diào)用servlet的過程。
1,在服務(wù)器啟動(dòng)時(shí),當(dāng)servlet被客戶首次請求或被配置好,這時(shí)由服務(wù)器加載servlet.Servlet的加載可以通過合用一個(gè)自定義的Java類加載工具(可允許自動(dòng)Servlet重載)從本地或遠(yuǎn)程地址來實(shí)現(xiàn)。這一步等同于 Class c = Class.forName(“com.sourceStream.MyServlet”);這里用的術(shù)語加載指同時(shí)加載和初始化servlet的過程。
2.服務(wù)器創(chuàng)建一個(gè)servlet類實(shí)例來為所有請求服務(wù)。利用多線程,可以由單個(gè)servlet實(shí)例來服務(wù)于并行的請求。惟一的例外是,因?yàn)閷?shí)現(xiàn)SingleThreadModel接口的servlet,這樣,服務(wù)器會(huì)創(chuàng)建一個(gè)實(shí)例池并從中選擇一個(gè)來服務(wù)于每一新的請求。此步相當(dāng)于以下java代碼:Servlet s = (Servlet)c.newInstance();
3. 服務(wù)器調(diào)用Servlet的init()方法。它用來保證完成在首次請求servlet處理以前的執(zhí)行過程。如果servlet創(chuàng)建了多個(gè)servlet實(shí)例,則為每個(gè)實(shí)例調(diào)用一次init()方法。
4.服務(wù)器從包括在客戶請求中的數(shù)據(jù)里構(gòu)造一個(gè)ServletRequest或HttpServletRequest對象,還構(gòu)造一個(gè)ServletResponse或HttpServletResponse對象來返回響應(yīng)提供方法。其參數(shù)類型依賴于servlet是否分別擴(kuò)展GenericServlet或HttpServlet.(注意:如果服務(wù)器沒有收到對這一servlet的請求,此步驟與以下5---7步驟將不會(huì)發(fā)生。)
5.服務(wù)器調(diào)用servlet的service()方法(對于Httpservlet,service()將調(diào)用更為具體的方法:如:doGet()或doPost()),在此步驟中作為參數(shù)傳遞結(jié)構(gòu)化對象。當(dāng)并行的請求到來時(shí),多個(gè)service()方法能夠同時(shí)運(yùn)行在獨(dú)立的線程中。(除非servlet實(shí)現(xiàn)了SingleThreadModel接口)
6通過分析ServletReuest或HttpServletRequest對象。Service()方法處理客戶的請求.并調(diào)用ServletResponse或HttpServletResponse對象來響應(yīng)。 7.如果服務(wù)器收到另一格對該servlet的請求,這個(gè)處理過程從5步驟重復(fù)。 8.一旦servlet容器檢測到一個(gè)servlet要被卸載,這可能是因?yàn)橐厥召Y源或因?yàn)樗诒魂P(guān)閉,服務(wù)器會(huì)在所有servlet的service()線程完成之后(或在服務(wù)器規(guī)定時(shí)間后)調(diào)用servlet的destroy()方法。然后servlet就可以進(jìn)行無用存儲單元收集清理。Servlet容器不需要為保留一個(gè)servlet而指定時(shí)間。以上8個(gè)步驟就是servlet的生命周期。(