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