IT培訓(xùn)網(wǎng)
IT在線學(xué)習(xí)
一、Servlet運(yùn)行機(jī)制
Servlet是運(yùn)行在Servlet容器中的服務(wù)器端的用來響應(yīng)用戶請求的服務(wù)器小程序,它的生命周期由Servlet容器負(fù)責(zé)管理。
Servlet在Servlet容器中,以單例模式存在,即:在Servlet生命周期中,Servlet容器只創(chuàng)建一個Servlet對象,所有的客戶請求都使用這一個Servlet對象來響應(yīng)。
當(dāng)用戶請求到達(dá)時,Servlet容器解析請求,檢查內(nèi)存中是否已存在用戶要訪問的Servlet對象;若存在,則直接使用該Servlet對象處理用戶請求;若不存在,則加載Servlet,創(chuàng)建Servlet對象,并實(shí)例化、初始化,然后使用這個Servlet對象處理用戶請求。
在Servlet整個生命周期中,只實(shí)例化和初始化一次,即:只有一個Servlet實(shí)例對象為客戶請求提供服務(wù)。
Servlet以單例模式運(yùn)行,即使有多個用戶同時訪問Servlet時,Servlet容器中也只有一個Servlet實(shí)例對象存在。Servlet容器通過Servlet對象調(diào)用service()服務(wù)方法時,采用多線程的方式使用Servlet對象。即:Servlet容器會為每一個用戶請求創(chuàng)建一個線程,由線程調(diào)用Servlet的service()方法為用戶請求提供服務(wù)。
在Servlet容器中,用一個線程池來管理使用Servlet對象的多個線程,線程池在初始化時,會創(chuàng)建一定數(shù)量的線程對象放在池子中,當(dāng)需要時,直接獲取線程對象并使用;使用后,線程對象歸還線程池;以避免頻繁創(chuàng)建線程、銷毀線程對象,從而提高Servlet容器的性能。
下圖描述了Servlet的請求與響應(yīng)過程:客戶機(jī)向WEB服務(wù)器發(fā)送請求,WEB服務(wù)器收到請求之后,轉(zhuǎn)發(fā)給Servlet容器,Servlet容器創(chuàng)建HttpServletRequest和HttpServletResponse兩個對象,分別封裝請求數(shù)據(jù)和響應(yīng)數(shù)據(jù),并將它們傳給線程池中分配的線程,該線程訪問Servlet處理用戶請求,處理完畢,將結(jié)果返回Servlet容器,線程歸還線程池;最后,WEB服務(wù)器負(fù)責(zé)將響應(yīng)結(jié)果發(fā)送回客戶機(jī)。
二、Servlet生命周期
在Java中,任何對象都有生命周期。
Servlet生命周期是指Servlet實(shí)例創(chuàng)建到Servlet實(shí)例銷毀的過程。按照功能的不同,大致可以將Servlet的生命周期分為三個階段:Servlet實(shí)例創(chuàng)建與初始化階段、運(yùn)行階段、銷毀階段。
在Servlet生命周期中,每個階段用不同的方法,完成各自的任務(wù)。
初始化階段:調(diào)用Servlet的構(gòu)造器和init()方法進(jìn)行實(shí)例化和初始化。
運(yùn)行階段:調(diào)用Servlet的service()方法處理客戶請求。
銷毀階段:調(diào)用Servlet的destroy()方法結(jié)束Servlet的運(yùn)行。
最后,Servlet對象由Java虛擬機(jī)JVM的垃圾回收器進(jìn)行垃圾回收。
1、初始化階段
Servlet實(shí)例是Servlet容器創(chuàng)建的,并且在整個Servlet生命周期中,只創(chuàng)建一個。
Servlet容器會根據(jù)Servlet在web.xml配置文件中的
如果
在整個Servlet生命周期中,Servlet對象只實(shí)例化和初始化一次,init()方法只被調(diào)用一次。
init()代碼示例如下:
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
2、運(yùn)行階段
運(yùn)行階段是Servlet生命周期中最重要的一個階段,在這個階段,Servlet容器會反復(fù)調(diào)用Servlet的service()方法處理客戶請求。
當(dāng)Servlet容器接收到用戶請求后,會為每一個用戶請求創(chuàng)建代表請求的ServletRequest對象和代表響應(yīng)的ServletResponse對象,在調(diào)用service()方法處理用戶請求時,將它們作為參數(shù)傳遞給Servlet的service()方法。service()方法通過ServletRequest對象,獲取客戶請求信息;通過ServletResponse對象,生成響應(yīng)結(jié)果。
在整個Servlet生命周期中,對于Servlet的每一次用戶訪問請求,Servlet容器都會調(diào)用一次Servlet的service()方法,并且創(chuàng)建新的ServletRequest對象和ServletResponse對象,即:service()方法在 Servlet的整個生命周期中,會被多次調(diào)用。
service()代碼示例如下:
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
arg1.setContentType("text/html; charset=utf-8");
arg1.getWriter().println("這是通過實(shí)現(xiàn)Servlet接口創(chuàng)建的Servlet程序");
}
3、銷毀階段
當(dāng)WEB服務(wù)器關(guān)閉(Servlet容器也就終止了)或WEB應(yīng)用程序被移出Servlet容器時,Servlet會隨著WEB應(yīng)用程序的關(guān)閉而銷毀。
Servlet容器調(diào)用Servlet的destroy()方法,銷毀Servlet對象,釋放Servlet對象占用的資源。
在整個Servlet生命周期中,Servlet對象只銷毀一次,于是,destroy()方法只被Servlet容器調(diào)用一次。
特別地:Servlet對象一旦創(chuàng)建,就一直駐留在內(nèi)存中等待客戶的訪問,直到WEB服務(wù)器關(guān)閉或WEB應(yīng)用程序被移出Servlet容器時,Servlet對象才會被銷毀。
destroy()代碼示例如下:
public void destroy() {
// TODO Auto-generated method stub
}
>>本文地址:http://m.yiyunku.cn/zhuanye/2021/71019.html
聲明:本站稿件版權(quán)均屬中公教育優(yōu)就業(yè)所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
1 您的年齡
2 您的學(xué)歷
3 您更想做哪個方向的工作?