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